2013-01-31 67 views
2

想我有这个JavaScript变量赋值核心

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的关系不应该退出

实际代码:

x={}; 
y=x; 
x.name="maizere"; 
alert(y.name)//maizere 

我真的没有这方面的工作。可有人详细介绍了如何解释这个请的知识?

+2

'警报(z.name) - > undefined' ..你错过了什么。 –

+2

我得到'undefined'。请向我们显示您的确切代码,并正确使用评论。 – Bergi

+0

@Bergi没有你犯了一些错误,你得到“Maizere”。检查代码你测试了plz –

回答

3

你最初的假设是错误的; z是与x相同的对象的指针。

var x = {}; 
var z = x; 

alert(z === x); // true 

当你做x = { name: "Maizere" };你分配一个对象xz仍然指向原来的对象。

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 
+0

根据u如果x = {}和z = {} x == z // true,所以如果x.name =“maizere “将z的财产”名称“ –

+0

号。对象是相等的,但不是* same *对象。如果你改变了其中一个,他们就不再平等了。 (就像如果你有'x = 1; z = 1; x == z // true',但是如果你改变了'z = 2',那么'x!= z'。] – JJJ

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 
+0

精彩的解释。谢谢你 –

+0

如果我做x = {name:“Maizere”};在设置了z值后 –

+0

创建一个新对象并将'x'改为指向它,它对'z'没有影响。 – Barmar