为什么我不能将Array #include用于嵌套数组?

时间:2018-01-04 04:25:00

标签: javascript arrays

为什么以下行在Javascript中返回false

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

背后的基本逻辑是什么?

5 个答案:

答案 0 :(得分:11)

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

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

答案 1 :(得分:3)

两个IQueryable表达式都会创建一个新的数组对象。即使内容相同,对象本身也是不同的。

例如见:

[1,2,3]

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

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

答案 2 :(得分:1)

const array = [1, 2, 3]; console.log(array == array); // true, same object检查数组中每个值的权益。在JavaScript中,具有相同值的两个数组不相等。有关详细信息,请参阅此主题:How to compare arrays in JavaScript?

您可以这样做以检查数组是否包含数组。我使用Lodash进行权益比较,使用.includes属性来检查数组中的一个元素是否返回true。

.some
console.log(
  [[1,2,3], [1,2,4]].some((array) => _.isEqual(array, [1,2,3]))
)

答案 3 :(得分: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

答案 4 :(得分: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'