为什么以下行在Javascript中返回false
:
[[1,2,3], [1,2,4]].includes([1,2,3]);
背后的基本逻辑是什么?
答案 0 :(得分:11)
includes
使用SameValueZero等式算法进行比较。 (如developer.mozilla.org中所述)。搜索对象时(数组也是对象),它只匹配对同一对象的引用。
此外,Javascript数组是对象,您不能简单地使用相等运算符==
来理解这些对象的内容是否相同。等于运算符仅测试两个对象实际上是否完全相同(例如myObjVariable==myObjVariable
,适用于null
和undefined
)。
答案 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。
但是,对于不可变对象,例如string和number,您可以直接检查,例如
["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'