为什么我不能在嵌套的数组中使用Array#includes?

13

为什么以下代码在Javascript中会返回false

 [[1,2,3], [1,2,4]].includes([1,2,3]);

那背后的逻辑是什么?


2
这是因为 [1,2,3] !== [1,2,3] - Bergi
5个回答

13

includes使用SameValueZero相等算法进行比较。(如developer.mozilla.org所述)。在搜索对象(数组也是对象)时,它只匹配对同一对象的引用。

此外,Javascript数组是对象,您不能仅使用等号运算符==来了解这些对象的内容是否相同。等号运算符只会测试两个对象是否实际上完全相同的实例(例如,myObjVariable==myObjVariable,也适用于nullundefined)。


3

[1,2,3][1,2,3]表达式都会创建一个新的数组对象。虽然它们包含的内容相同,但它们本身是不同的对象。

例如:

const array1 = [1, 2, 3];
const array2 = [1, 2, 3];

console.log(array1 == array2); // false, different objects

const array = [1, 2, 3];

console.log(array == array); // true, same object


1

.includes 检查数组中每个值的等同性。在JavaScript中,具有相同值的两个数组并不相等。有关更多详细信息,请参见此线程:如何比较JavaScript中的数组?

您可以使用以下方法检查数组是否包含数组。我使用Lodash进行等同性比较,并使用.some属性检查数组中是否有一个元素返回true。

console.log(
  [[1,2,3], [1,2,4]].some((array) => _.isEqual(array, [1,2,3]))
)
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.4/lodash.min.js"></script>


0

您可以使用仅 Array.some()(更准确地说是Array.prototype.some())方法来完成,如下所示

console.log([[1,2,3], [1,2,4]].some(e => e[0] === 1 && e[1] === 2 && e[2] === 3)); // would return 'true'
console.log([[1,2,3], [1,2,4]].some(e => e[0] === 1 && e[1] === 2 && e[2] === 4)); // would return 'true'
console.log([[1,2,3], [1,2,4]].some(e => e[0] === 1 && e[1] === 2 && e[2] === 5)); // would return 'false'


0

因为它们是可变的。如果你想检查数组,你需要通过变量来检查。

var a = [1,2];
var b = a;
 [a].includes(b);

当你检查[[1,2,]].includes([1,2,3])时,它返回false,因为它们被视为两个不同的对象;即[1,2] == [1,2]返回false。

然而,对于不可变对象,比如stringnumber,你可以直接进行检查,例如

["a", "b"].includes("a")  //true
[1, 2].includes(1) //true
"a" == "a"   // true

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接