为什么以下代码在Javascript中会返回false
:
[[1,2,3], [1,2,4]].includes([1,2,3]);
那背后的逻辑是什么?
为什么以下代码在Javascript中会返回false
:
[[1,2,3], [1,2,4]].includes([1,2,3]);
那背后的逻辑是什么?
includes
使用SameValueZero相等算法进行比较。(如developer.mozilla.org所述)。在搜索对象(数组也是对象)时,它只匹配对同一对象的引用。
此外,Javascript数组是对象,您不能仅使用等号运算符==
来了解这些对象的内容是否相同。等号运算符只会测试两个对象是否实际上完全相同的实例(例如,myObjVariable==myObjVariable
,也适用于null
和undefined
)。
[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
.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>
您可以使用仅 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'
[1,2,3] !== [1,2,3]
。 - Bergi