JavaScript: передача по ссылке и по значению

6

Value vs Reference Types

(Передача по ссылке и по значению)
В JS есть две категории типов. На одной стороне у нас value types, еще называемые примитивами. На другой стороне Reference types.

Итак, value types (primitives) включает:
* Number
* String
* Boolean
* Symbol
* undefined
* null

На дргугой стороне, Reference types включает:
* Objects
* Functions (Object)
* Arrays (Object)

Другими словами, делятся на примитивы и объекты.

НАпример у нас есть два примитива x и y

let x = 10;
let y = x;

x = 20;

Обратим внимание, что здесь x и y две независимые переменные. Так как результат убедет: x = 20; y = 10;.

Когда мы имеем дело с примитивами, значения, например 10 хранятся внутри переменной. Когда мы копируем эту переменную, значение, которое сохранено в этой переменной копируется в новую переменную. Они полностью независимы друг от друга.

Но другое дело, если мы воспользуемся объектом.

let x = {value: 10};
let y = x;

x.value = 20;

И теперь, если мы посмотрим на y, то увидим там {vaule: 20}

Когда мы используем объект, то объект не сохраняется в переменной. Этот объект сохраняется где в памяти и этот адрес в памяти и сохраняется внутри переменной. Когда мы копируем x в y, копируется адрес (или ссылка). Другими словами, и x и y оба указывают на один объект в памяти. И когда мы меняем каждый объект, который находится в x или y, наши изменения сразу видны в другой переменной.

Вывод

  • Примитивы копируются по значению
  • Объекты копируются по ссылке

Другой пример

let number = 10;

function increase(number) {
    number++;
}

increase(number);

Здесь мы изменим переменную которая в области видимости функции, которая не повлияет на внешнюю переменную number. Так как передалась в функцию по значению.

Теперь изменим number на объект:

let obj = {value: 10};

function increase(obj) {
    obj.value++;
}

increase(obj);

И уже в этом случае, значение value объект obj изменится и будет равно 11;

You might also like More from author

Leave A Reply

Your email address will not be published.