2013-01-31 69 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