Изучая 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(...)
. :)
Этот трюк работает даже с двойным массивом (и вообще с многомерными массивами). Таким же образом можно сравнивать объекты, при условии, что свойства каждого объекта находятся в одном порядке.
Еще один совет
Если вы хотите сравнить, содержат ли 2 массива одинаковые значения, независимо от порядка, просто используйте метод Array.sort()
для сортировки сначала обоих массивов, ЗАТЕМ используйте JSON.stringify
для сравнения!
Если вам понравилась эта статья, загляните в мой блог Углубленный JavaScript для получения дополнительной информации. 🤓