假设我有这个
var x={}; //x is an address in the memory where object is stored
var z=x; //z=x after execution is equal to z={} right?
现在z与x无关,或者在执行后与x无关,所以当时,
x={name:"Maizere"};
z!=x //true
但是,
时x.name="maizere";
alert(z.name)//maizere why?
我们没有设置z的值,但x和z的关系不应该再退出
实际代码:
x={};
y=x;
x.name="maizere";
alert(y.name)//maizere
我真的不知道这是如何运作的。任何人都可以详细解释这个吗?
答案 0 :(得分:3)
你最初的假设是错误的; z
是指向与x
相同的对象的指针。
var x = {};
var z = x;
alert( z === x ); // true
当您执行x = { name: "Maizere" };
时,您要将新对象分配给x
。 z
仍然指向原始对象。
x = { name: "Maizere" };
alert( z !== x ); // true
在后一个示例中,您不是要创建新对象,而是更改原始对象的属性。
var x = {};
var z = x;
x.name = "maizere";
alert( z === x ); // true
混淆可能源于此的另一个示例:括号语法创建一个新对象而不是修改原始对象。
var x = { name: "Maizere" };
var y = { name: "Zaimere" };
x = { age: 20 };
y.age = 30;
console.log( x ); // {age: 20} <-- original object is replaced
console.log( y ); // {name: "Zaimere", age: 30} <-- original object is modified
答案 1 :(得分:3)
在这两个陈述之后:
x={};
y=x;
内部表示是这样的:
+---- x
|
{} <--+
|
+---- y
因此x
的所有更改都会反映在y
:
x.name="maizere";
alert(y.name)//maizere
更新:
+---- x
|
{name: 'maizere'} <--+
|
+---- y
一旦你将其中一个变量分配给其他东西,这就消失了:
x = { name: "Maizere" }
表示:
{name: 'Maizere'} <------- x
{name: 'maizere'} <------- y