2011-09-20 1 views
5

¿Los objetos javascript se basan en valores o en referencias? Por ejemplo:tipo de valor tipo de objeto de referencia en javascript

obj1.list =new array(); 
// ------ populate list 
obj2.list = obj1.list 

¿El navegador crea copia diferente del obj1.list para obj2.list, o es obj2.list sólo una referencia a obj1.list?

+2

Se basa en la referencia. – BoltClock

+1

posible duplicado de [¿Tiene JavaScript objetos de referencia de signo iguales o los clona?] (Http://stackoverflow.com/questions/7467335/does-javascript-equal-sign-reference-objects-or-clones-them) – RobG

Respuesta

14

objetos JavaScript (y por extensión: matrices, expresiones regulares, fechas, no primitivos Strings/números/booleanos, etc.) la igualdad y la asignación son de referencia en base:

{a:'a'} == {a:'a'} // false 

Pero:

var myObject = {a:'a'}; 
var myObject2 = myObject; 

myObject == myObject2 // true 

Además:

myObject.b = 'b'; 

console.log(myObject2.b); // Logs: "b" 
+0

Esto es cierto, pero en realidad no aborda la pregunta anterior. Esta comparación es falsa porque cada uno de ellos son objetos separados y la igualdad de los objetos se compara para ver si son el mismo objeto idéntico en la memoria: no mira el contenido del objeto. – jfriend00

+0

@ jfriend00 - No entiendo lo que dices. He explicado claramente que tanto la asignación de evaluación * como * están basadas en referencias. –

+0

Solo vi las dos primeras líneas cuando leí tu publicación. No estoy seguro si editó su respuesta para agregar más o SO simplemente no me mostró todo. Tu respuesta actual es más completa. – jfriend00

2

la asignación crea un poli y del valor solo si es un tipo primitivo (como Number, Boolean, etc ...). De lo contrario, la asignación solo copia una referencia al mismo objeto (Objeto, Matriz, etc.). Un nuevo objeto no se crea con la asignación.

Así, en su ejemplo:

obj1.list =new array(); 
// ------ populate list 
obj2.list = obj1.list 

obj2.push("foo"); 
alert(obj1.pop); // "foo" (they are both the same list) 

obj1.list y obj2.list estará apuntando al mismo objeto (se hace referencia al mismo objeto)

3

Javascript se basa en la semántica de referencia:

var a = [1,2,3]; 
var b = a; 
a[0] = 42; 
alert(b[0]); // will show 42 
var c = a.slice(); // explicitly makes a copy 
a[1] = 6502; 
alert(c[1]); // will show 2, not 6502 
4

Olvídese de todas las tonterías de bajo nivel sobre "referencias" (que no existen en JavaScript) y considere las reglas simples que se detallan a continuación. El término "objeto" se usa para representar un valor específico, que no es necesariamente un "Objeto"; esto no cambia las reglas, sino que refuerza la consistencia.

1) Un objeto es en sí. Si un objeto es mutable y si ese objeto es mutado entonces ese objeto ha sido mutado.

2) Una asignación no crea una copia/clon/duplicado de un objeto. Esto incluye los valores "asignados" a los parámetros en las llamadas a funciones. El objeto es el valor.

3) Una variable (o propiedad) no es un objeto, sino que es un nombre para un objeto (una manera bonita de decir "la variable se evalúa como un objeto dado"). Un objeto solo puede tener muchos "nombres" y sin embargo es el mismo objeto.

Todo lo demás es un detalle de implementación - referencias no se habla en la especificación en absoluto.Mientras, se debe tener en cuenta que los valores primitivos como number y stringno tienen tienen propiedades adicionales asignadas (la asignación se ignora) mientras que los Objetos Number y String de envoltura son objetos de pleno valor. Esto es consistente con las reglas anteriores: no hay valores mutables que no sean Object en JavaScript. Para poder hablar sobre el lenguaje de JavaScript, los valores de las primitivas se pueden considerar como objetos, aunque son completamente inmutables y no son realmente Objetos.

Happy coding.

Cuestiones relacionadas