Если b = [1, 2, 3, 4] и c = [...b], почему b не равно c?
Название в значительной степени говорит обо всем, но здесь это написано:
b = [1, 2, 3, 4];
c = [...b];
b === c; //false
Зачем?
2 ответа
Решение
Так работает сравнение регулярного массива и строгого равенства. Помните, что массивы являются объектами:
Алгоритм сравнения строгого равенства
Сравнение x === y, где x и y - значения, дает истину или ложь. Такое сравнение выполняется следующим образом:
- Если Type(x) отличается от Type(y), вернуть false.
- Если Тип (x) не определен, вернуть true.
- Если Type(x) равен Null, вернуть true.
- Если тип (х) является число, то
- Если x равен NaN, вернуть false.
- Если y равен NaN, вернуть false.
- Если x - это то же самое числовое значение, что и y, вернуть true.
- Если x равен +0, а y равен −0, вернуть true.
- Если x равен −0, а y равен +0, верните true.
- Вернуть ложь.
- Если Type(x) - String, тогда вернуть true, если x и y - это абсолютно одинаковая последовательность символов (одинаковая длина и одинаковые символы в соответствующих позициях); в противном случае верните false.
- Если Type(x) - логическое значение, вернуть true, если x и y оба - true или оба false; в противном случае верните false.
- Верните 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)