Tomemos línea por línea:
var foo = bar;
Todos los nombres de los objetos que hacer es mantener las direcciones en la memoria. Por lo tanto, en esta declaración, usted está haciendo que foo
tenga la misma dirección de memoria que bar
. Si, por ejemplo, bar
tenía 0xFF, entonces a través de la asignación haría foo
también mantener 0xFF.
Sin embargo, tenga en cuenta que bar
y foo
son dos objetos distintos, por casualidad mantienen la misma dirección en la memoria.
Ahora, ya que tienen la misma dirección en la memoria, mutar miembros de bar
también afectará a los miembros de foo
porque están vinculados al mismo objeto.
bar.prop = "something entirely different"; // affects foo.prop also
Sin embargo, aquí está el punto clave a recordar:
Assignment only changes what the name of the object is bound to, and does not affect any other objects.
En otras palabras, la siguiente declaración hecha bar
sostienen una dirección de memoria diferente, pero esto no afecta a foo
.
bar = "no longer an object"; // Made bar hold a different memory address
Ahora, explicando la cita:
Javascript is always pass by value, but when a variable refers to an object (including arrays), the "value" is a reference to the object.
Tome este ejemplo:
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);
Esto imprime outs: bar.prop: 10, foo.prop: 2
. Dentro de la función f
, obj1 tiene la misma dirección de memoria que bar
y obj2 tiene la misma dirección de memoria que foo
. Sin embargo, solo la barra se ve afectada porque dentro de f
solo se reflejan los elementos alterados de los objetos y la asignación obj2 = {prop: 20};
solo afecta a la variable local obj2
no a foo
.
En otras palabras, the "value" is a reference to an object
significa que modificar miembros afecta al objeto referenciado, pero la asignación solo afecta a la variable local.
Pude haber respondido a mi propia pregunta: "Javascript siempre pasa por valor, pero cuando una variable hace referencia a un objeto (incluidas las matrices), el" valor "es una referencia al objeto." Pero esto todavía es confuso, ¿alguien puede explicar más? – Jeff
Ver mi respuesta Jeff, por favor, avíseme si tiene algún sentido. – Josh
posible duplicado de [¿Es Java pasar por referencia?] (Http://stackoverflow.com/questions/40480/is-java-pass-by-reference) –