Если b = [1, 2, 3, 4] и c = [...b], почему b не равно c?

Название в значительной степени говорит обо всем, но здесь это написано:

b = [1, 2, 3, 4];
c = [...b];

b === c; //false

Зачем?

2 ответа

Решение

Так работает сравнение регулярного массива и строгого равенства. Помните, что массивы являются объектами:

Алгоритм сравнения строгого равенства

Сравнение x === y, где x и y - значения, дает истину или ложь. Такое сравнение выполняется следующим образом:

  1. Если Type(x) отличается от Type(y), вернуть false.
  2. Если Тип (x) не определен, вернуть true.
  3. Если Type(x) равен Null, вернуть true.
  4. Если тип (х) является число, то
    • Если x равен NaN, вернуть false.
    • Если y равен NaN, вернуть false.
    • Если x - это то же самое числовое значение, что и y, вернуть true.
    • Если x равен +0, а y равен −0, вернуть true.
    • Если x равен −0, а y равен +0, верните true.
    • Вернуть ложь.
  5. Если Type(x) - String, тогда вернуть true, если x и y - это абсолютно одинаковая последовательность символов (одинаковая длина и одинаковые символы в соответствующих позициях); в противном случае верните false.
  6. Если Type(x) - логическое значение, вернуть true, если x и y оба - true или оба false; в противном случае верните false.
  7. Верните true, если x и y относятся к одному и тому же объекту. В противном случае верните false.

ПРИМЕЧАНИЕ. Этот алгоритм отличается от алгоритма SameValue (9.12) обработкой подписанных нулей и NaN.

... не имеет никакого влияния Если мы назначим одинаковые литералы для обоих, мы можем увидеть это:

b = [1, 2, 3, 4];
c = [1, 2, 3, 4];

b === c; //false

Это потому, что каждый [] создаст новый массив, даже если он использует спред в нем.

c это новый Array экземпляр, а не тот же объект.

Ты можешь использовать .every() проверить, если каждый элемент в индексе b имеет то же значение элемента в индексе c

let bool = b.every((n, index) => c[index] === n)
Другие вопросы по тегам