2016-09-25 71 views
0

基本上,代碼行curr = curr[ch] = curr[ch] || {}將變量ch設置爲對象的鍵並將{}設置爲對象的值,然後指向其子引用。JavaScript在JavaScript中如何連續工作?

但有人可以詳細解釋它是如何工作的?由於

http://jsbin.com/gokapoc/1/edit?js,console

let root = {}; 
let curr = root; 

let ch = 'a'; 
curr = curr[ch] = curr[ch] || {}; 
ch = 'b'; 
curr = curr[ch] = curr[ch] || {}; 
ch = 'c'; 
curr = curr[ch] = curr[ch] || {}; 

console.log(root); 

它會顯示結果:

{ 
    a: { 
    b: { 
     c: {} 
    } 
    } 
} 
+1

賦值運算符是正確關聯的,'||'具有[更高優先級](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Operator_Precedence#Table),所以重寫這樣的行:'curr =(curr [ch] =(curr [ch] || {}));'並且應該清楚。 – 2016-09-25 18:01:59

回答

1

讓我們通過做散步。我加了括號使事情更清楚 - 他們不改變意思。

let root = {}; 
let curr = root; 

不在話下直到現在

let ch = 'a'; 
curr = (curr[ch] = (curr[ch] || {})); 

好了,curr[ch]undefined的時刻,因爲有一個在curr沒有財產a(目前ch的價值),它指向同一個對象root。因此最內部的括號評估爲{}

該值分配爲curr[ch]。所以很顯然,root對象現在有一個屬性a

最後,此對象(root.a)被分配給curr,因爲外部圓括號中的分配返回分配的值,這是屬性a處的對象。

ch = 'b'; 
curr = (curr[ch] = (curr[ch] || {})); 

基本上和以前一樣,只是需要注意的是curr不是root在這裏,但相同的對象,該root.a點。最後curr將指向與root.a.b相同的對象。

ch = 'c'; 
curr = (curr[ch] = (curr[ch] || {})); 

是的,現在應該清楚了。

非常緊湊但不是很清晰的代碼。

+0

非常感謝你的時間!非常明確的解釋! –