Давайте рассмотрим это построчно:
var foo = bar;
Все, что делают имена объектов - это удерживает адреса в памяти.Таким образом, в этом утверждении вы заставляете foo
хранить тот же адрес памяти, что и bar
.Например, если bar
содержало 0xFF, то с помощью присваивания, которое вы сделаете, foo
также будет содержать 0xFF.
Однако имейте в виду, что bar
и foo
- два разных объекта, они случаютсяпросто хранить один и тот же адрес в памяти.
Теперь, поскольку они действительно содержат один и тот же адрес в памяти, мутирующие члены bar
также будут влиять на элементы foo
, поскольку они связаны стот же объект.
bar.prop = "something entirely different"; // affects foo.prop also
Однако вот ключевой момент, о котором следует помнить:
Assignment only changes what the name of the object is bound to, and does not affect any other objects.
Другими словами, приведенное ниже утверждение bar
содержит другой адрес памяти, но это не влияет на foo
.
bar = "no longer an object"; // Made bar hold a different memory address
Теперь, объясняя цитату:
Javascript is always pass by value, but when a variable refers to an object (including arrays), the "value" is a reference to the object.
Возьмем этот пример:
function f(obj1, obj2)
{
obj1.prop = 10;
obj2 = {prop: 20};
}
var bar = {prop: 1};
var foo = {prop: 2};
f(bar, foo);
console.log("bar.prop: " + bar.prop + ", foo.prop: " + foo.prop);
Это выводит на печать: bar.prop: 10, foo.prop: 2
.Внутри функции f
, obj1 содержит тот же адрес памяти, что и bar
, а obj2 содержит тот же адрес памяти, что и foo
.Однако затрагивается только строка, потому что внутри f
отражаются только изменяющиеся элементы объектов, а присвоение obj2 = {prop: 20};
влияет только на локальную переменную obj2
, а не foo
.
Другими словами, the "value" is a reference to an object
означаетизменение членов влияет на объект , на который есть ссылка , но назначение влияет только на локальную переменную.