Почему следующая строка возвращает false
в Javascript:
[[1,2,3], [1,2,4]].includes([1,2,3]);
Какова основная логика этого?
Почему следующая строка возвращает false
в Javascript:
[[1,2,3], [1,2,4]].includes([1,2,3]);
Какова основная логика этого?
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
.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/[email protected]/lodash.min.js"></script>
Потому что они изменяемы. Если вы хотите проверить массив, вам нужно проверить переменную.
var a = [1,2];
var b = a;
[a].includes(b);
Когда вы проверяете [[1,2,]]. включает ([1,2,3]), он возвращает false, потому что они рассматриваются как два разных объекта; то есть [1,2] == [1,2] возвращает false.
Однако для неизменяемых объектов, таких как string и number, вы можете проверить напрямую, например
["a", "b"].includes("a") //true
[1, 2].includes(1) //true
"a" == "a" // true