2016-07-14 34 views
1

我試圖改變一個Javascript對象的結構,我不明白我從日誌中收到的結果。Javascript的分配問題

我有以下對象:a = {e: 1, f: 2}

我想將它移動到a.b

如果我做a.b = a然後我得到這些結果:

console.log(a) // {e: 1, f: 2} 
console.log(a.b) // {e: 1, f: 2} 

雖然我期待着什麼樣此:

console.log(a) // {b: {e: 1, f: 2}} 
console.log(a.b) // {e: 1, f: 2} 

有人可以解釋爲什麼發生這種情況嗎?

回答

2

a.b = a簡單地分配a.b作爲參考a,這會導致a成爲一個遞歸對象:

var a = {e: 1, f: 2}; 
 
a.b = a; 
 

 
console.log(a.e, a.f); //1 2 
 
console.log(a.b.e, a.b.f); //1 2 
 
console.log(a.b.b.e, a.b.b.f); //1 2 
 
console.log(a.b.b.b.e, a.b.b.b.f); //1 2

實際移動a的屬性爲a.b,你需要覆蓋現有對象,將新屬性b指定爲其現有值:

var a = {e: 1, f: 2}; 
 

 
a = {b: a}; 
 

 
console.log(a); //{b: {e: 1, f: 2}}

+0

在您的示例中,不需要'JSON.parse' JSON.stringify'組合,因爲您已經將一個新對象分配給'a'。 'a = {b:a}'應該具有smae效果。 –

+0

謝謝,@ t.niese,不知道爲什麼我認爲需要使用JSON方法。 –

3

在JS中指定一個值不會移動它會複製它。

您正在將b屬性添加到現有對象。

它不會顯示在日誌中,因爲console.log通過不顯示屬性來保護自己免受無限遞歸。

+0

哪種瀏覽器?在Firefox'console.log'中顯示''b'。 – Scimonster

+0

@Scimonster - OP使用的瀏覽器。 – Quentin