Переменные (и константы) в JavaScript могут хранить два вида данных: примитивные и ссылочные. К примитивным относятся все примитивные типы: числа, строки, булеан и так далее. К ссылочным – объекты.

В чем разница между ссылочными и примитивными типами данных и почему об этом нужно знать?

Разница проявляется при изменении данных, их передаче и возврате из функций. Мы уже знаем, что массив можно менять, даже если он записан в константу. Здесь как раз и проявляется ссылочная природа. Константа хранит ссылку на массив, а не сам массив, и эта ссылка не меняется. А вот массив поменяться может. С примитивными типами такой трюк не пройдет.

Другой способ убедиться в том, что массивы являются ссылками – создать несколько констант, содержащих один массив, и посмотреть, как они меняются:

const items = [1, 2]
// Ссылаются на один и тот же массив
const items2 = items
items2.push(3)
 
console.log(items2) // => [1, 2, 3]
console.log(items) // => [1, 2, 3]
items2 === items // true

Сравнение массивов тоже происходит по ссылке. Это может быть очень неожиданно с непривычки. Одинаковые по структуре массивы имеют разные ссылки и не равны друг другу:

;[1, 2, 3] === [1, 2, 3] // false

Более того, если передать массив в какую-то функцию, которая его изменяет, то массив тоже изменится. Ведь в функцию передается именно ссылка на массив. Посмотрите на пример:

const f = (coll) => coll.push("wow")
 
const items = ["one"]
f(items)
console.log(items) // => [ 'one', 'wow' ]
f(items)
console.log(items) // => [ 'one', 'wow', 'wow' ]

Назад