JavaScript | Одинаковость массивов

Ситуация, при которой массивы равны

var massiv1 = [3,2,1]
var massiv2 = massiv1

massiv1 == massiv2
true

massiv1 === massiv2
true

Если мы объявим переменную massiv1 и положим в неё массив, то наше название переменной по сути будет ссылкой на объект массива в оперативной памяти.

Если мы объявим новую переменную massiv2 и положим в неё ссылку на первый массив, то наше название переменной по сути будет ссылкой на ссылку, которая по итогу будет равна объекту массива в оперативной памяти.

В этой ситуации равенство логично и понятно. Эта ситуация очень похожа на то, как если бы вы рассказали вашему другу как пройти к Гипермаркету. Он не знает как пройти, а вы знаете. Когда вы ему расскажете как пройти, тогда он тоже будет знать путь до этого Гипермаркета. В результате вы будете говорить об одном и том же Гипермаркете т. к. это конечный источник данных.

Но ситуация меняется, когда данные приходят с разных сторон и хранятся в разных источниках памяти. То есть визуально и по составу они могут быть 100% одинаковые. Но такой подход нарушает логику «уникальности» объекта и JavaScript воспринимает два массива как разные. Пример ниже.

Как проверить похож ли один массив на другой?

Есть два массива:

var m1 = [1,2,3]
var m2 = [1,2,3]

Эти два массива одинаковы по своей сути, но они занимают разные участки оперативной памяти. Любое сравнение этих двух массивов вернёт нам ЛОЖЬ — false.

m1 == m2
false
m1 === m2
false

Вывод в консоль браузера

Массивы не равны - хотя они одинаковые по содержанию - JavaScript
Массивы не равны — хотя они одинаковые по содержанию — JavaScript

Это происходит потому что JavaScript хранит две ссылки на два места в оперативной памяти. Разное место в памяти, значит массивы разные.

Как быть в этой ситуации?

Нужно попытаться привести массивы к примитивному типу данных — строке (String). Примитивы сравниваются по другим критериям. Пример:

"примитив" == "примитив"
true

"примитив" === "примитив"
true
Сравнение строк даёт истину true - JavaScript
Сравнение строк даёт истину true — JavaScript

Когда мы работаем с массивами, тогда мы можем привести массив к строке при помощи конструктора JSON и его метода strigify()

JSON.stringify(m1) == JSON.stringify(m2)
true

JSON.stringify(m1) === JSON.stringify(m2)
true
Сравнили строковое представление массивов - JavaScript
Сравнили строковое представление массивов — JavaScript
JSON.stringify(m1)
"[1,2,3]"
JSON.stringify(m2)
"[1,2,3]"
Одинаковые строки после JSON преобразования - JavaScript
Одинаковые строки после JSON преобразования — JavaScript

 

Информационные ссылки

Массивы

Стандарт ECMAScript — Раздел «25.5 The JSON Object» — https://tc39.es/ecma262/#sec-json-object

Поделись записью