Почему я не могу использовать Array # для вложенного массива?

Почему следующая строка возвращает false в Javascript:

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

Какова основная логика этого?

Ответ 1

includes сравнивается с помощью SameValueZero алгоритма равенства. (Как упоминалось в developer.mozilla.org). При поиске объектов (массив также является объектом) он будет соответствовать только ссылкам на один и тот же объект.

Кроме того, массивы Javascript являются объектами, и вы не можете просто использовать оператор равенства ==, чтобы понять, является ли контент этих объектов одинаковым. Оператор равенства будет проверять только если два объекта фактически являются одним и тем же экземпляром (например, myObjVariable==myObjVariable, работает и для null и undefined).

Ответ 2

Оба выражения [1,2,3] создают новый объект массива. Несмотря на то, что содержимое одного и того же, сами объекты разные.

См. например:

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

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

Ответ 3

.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>

Ответ 4

Потому что они изменяемы. Если вы хотите проверить массив, вам нужно проверить переменную.

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