为啥我不能将两个数组与“包含”进行比较? [复制]

Posted

技术标签:

【中文标题】为啥我不能将两个数组与“包含”进行比较? [复制]【英文标题】:Why can't I compare two arrays with "includes"? [duplicate]为什么我不能将两个数组与“包含”进行比较? [复制] 【发布时间】:2019-08-05 05:59:08 【问题描述】:

javascript 不允许使用 includes 比较数组?

看这个例子:

let x = [[1,2], [3,4]]
let y = x[0]
let z = [1,2]

console.log(y,z)
// Output: [ 1, 2 ] [ 1, 2 ]
console.log(x.includes(y), x.includes(z))
// Output: true false 

我想让x.includes(z) 成为true

cmets 让我知道了check-if-an-array-contains-any-element-of-another-array-in-javascript 的问题,但它并没有回答我的问题,因为我想检查数组是否使用includes 具有完全相同的元素,而不仅仅是一些。

此外,这个问题how-to-compare-arrays-in-javascript 并没有解释为什么includes 不起作用。它告诉 如何 去做,这不是我的问题的重点。

【问题讨论】:

因为它们引用了不同的内存位置 不能这样直接检查数组 你可以使用JSON.stringify(x).includes(JSON.stringify(z)),这是真的 这里必须成为一个很好的欺骗目标......(阿迪加找到了它。) 回想起来,现在我知道了答案,关键是在 JS 中等号 (==) 比较内存中的地址,而 includes 在引擎盖下使用 == .标记为重复的问题仅引用了两次记忆,并且仅在第 5 个答案之后。此外,人们可能会认为认为 == 应该表现不同是幼稚的,但是在 python 中,例如,一个数组(或列表)具有我所期望的 == 实现,但显然在 JS 中它不是,因此混乱。 【参考方案1】:

因为[1, 2] === [1, 2] 是假的。不同的数组不相等,即使它们的内容相同也不相等。 (所有对象都是如此。)

【讨论】:

【参考方案2】:

当数组的值是“原始类型”时,您可以将包含用于数组的值,但不能用于整个数组。

当您使用包含时,它会检查数组的当前元素是否为=== 作为参数传递的元素。

在您的情况下,它将检查 [1,2] === [1,2] 是否产生 false,这是因为通过 === 比较器,您只是在应用于数组时检查内存引用。

如果您想做类似比较整个数组是否相同的操作,您最好使用lodash 中的_. isEqual 之类的函数或实现自己的比较器函数。

【讨论】:

以上是关于为啥我不能将两个数组与“包含”进行比较? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

为啥将变量与 0.0 进行比较会返回 false? [复制]

为啥我不能将 QTabWIdget::TabPosition 与 myTabWidget->tabPosition 进行比较?

为啥不能比较两个 int 类型变量的值? [复制]

为啥 mov/cmp 而不是 cmp 有两个内存操作数? [复制]

我将两个相同的句子与 RIBES NLTK 进行比较并得到一个错误。为啥?

为啥java中有两个接口可比较和比较器用于对集合进行排序? [复制]