【发布时间】:2018-01-04 04:24:59
【问题描述】:
为什么下面一行在Javascript中返回false:
[[1,2,3], [1,2,4]].includes([1,2,3]);
这背后的基本逻辑是什么?
【问题讨论】:
标签: javascript arrays
为什么下面一行在Javascript中返回false:
[[1,2,3], [1,2,4]].includes([1,2,3]);
这背后的基本逻辑是什么?
【问题讨论】:
标签: javascript arrays
includes 使用SameValueZero 相等算法进行比较。 (如developer.mozilla.org 中所述)。搜索对象时(数组也是对象),它只会匹配对同一对象的引用。
此外,Javascript 数组是对象,您不能简单地使用相等运算符== 来了解这些对象的内容 是否相同。相等运算符只会测试两个对象是否实际上是完全相同的实例(例如myObjVariable==myObjVariable,也适用于null 和undefined)。
【讨论】:
两个[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 中,具有相同值的两个数组是不等价的。有关详细信息,请参阅此线程:How to compare arrays in 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'
【讨论】: