为啥我不能将两个数组与“包含”进行比较? [复制]
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 进行比较?
为啥 mov/cmp 而不是 cmp 有两个内存操作数? [复制]