При первом изучении JavaScript мы все делали это…
const a = [1,2];
const b = [1,2];
if (a === b) console.log('Equal!');
Если вы пробовали это делать, то вы знаете, что a === b
каждый раз будет возвращать false.
*Почему? *
Потому что переменные массива присваиваются по ссылке, а не по значению.
Поэтому a
— это просто указатель на расположение [1,2]
где-то в памяти.
В то время как ‘b’ — это другой указатель на другое место в памяти, которое также хранит [1,2]
.
Когда вы проверяете, что a === b
, вы на самом деле проверяете местоположение их членов, а не значения, на которые они указывают.
Так что же получается?
Есть ли простой способ проверить, равны ли базовые массивы, представленные a
и b
, БЕЗ необходимости выполнять сравнение по элементам?
Вот быстрый способ сделать это…
const d = [1,2,4,5,6];
const c = [1,2,4,5,6];
if (JSON.stringify(d) === JSON.stringify(c)) console.log('Equal!');
Почему это работает?
И что такое JSON.stringify(...)
вообще?
JSON.stringify(...)
берет массив (или объект) и возвращает его строковое представление.
Это строковое представление!
Например:
JSON.stringify([7,8,9])
вернет '[7,8,9]'
. Поскольку значение является строкой, вы можете сравнить его со значением другого массива, которое также возвращается в виде строки с помощью JSON.stringify(...)
. 🙂
Этот трюк работает даже с двойным массивом (и вообще с многомерными массивами). Вы также можете сравнивать объекты таким образом, если свойства каждого объекта расположены в одном и том же порядке.
Еще один совет
Если вы хотите сравнить, содержат ли два массива одинаковые значения, независимо от порядка, то просто используйте метод Array.sort()
для сортировки обоих массивов, а затем используйте JSON.stringify
для сравнения!
Если вам понравилась эта статья, пожалуйста, загляните в мой блог
Indepth JavaScript для более глубокого
контента. 🤓