2017-09-10 77 views
3

我也遇到過下面的代碼在線:如何解釋JavaScript表達式的[which]:部分({[which]:o [which]} = bar());

function bar() { 
    return { 
     x: 4, 
     y: 5, 
     z: 6 
    }; 
} 

var which = "x", 
    o = {}; 

({ [which]: o[which] } = bar()); 

console.log(o.x); 

我明白這個代碼是在ES6推出了「解構語法」的一個例子。

我也明白,o[which]正在搜索對象o中名爲which的密鑰,如果找到,則返回which密鑰的值。

但我不太確定該表達式的[which]:部分是如何工作的。

+0

參見上面兩行,即'VAR其中= 「×」'。這應該解決你的其他困惑。 – Nit

+0

@Nit也許我的大腦目前不工作,或者我的知識存在差距,但目前我無法解決這個問題。你好,請給我多一點提示? – Thor

+3

這是一個計算出來的屬性名稱。替換爲它的值'「x」',你會得到'({x:o.x} = bar());' – Bergi

回答

4

destructuring syntax,當你看到from : to,這意味着通過from標識的屬性的值是從東西被取出,並解構分配給to確定的變量或屬性。所以,在看這條線:

({ [which]: o[which] } = bar()); 

......我們看到,[which]標識的屬性的值是由bar返回並分配給o[which]標識的屬性的對象檢索。由於使用了[which]而不是which,因此which變量的決定了從bar的返回對象獲取的屬性的名稱,就像在檢索或設置屬性的值時使用括號語法目的。

非解構版本是這樣的:

const tmp = bar(); 
o[which] = tmp[which]; 
+1

啊,我想我明白了。我認爲在普通的對象字面意義上,「{a:b}」表示將值「b」賦值給名爲'a'的屬性。但是,在解構語法的時候,當我們遇到'{a:b}'時,我們實際上將'a'的值賦給一個名爲'b'的屬性(這與普通對象文本相反)。我認爲這是我被絆倒的地方。再次感謝你的幫助!現在一切都開始有意義了! – Thor

+0

@Thor:的確如此!儘管想「好吧,爲什麼要讓它落後,多麼愚蠢!」據說在嵌套等方面有很好的理由。 –

1

[which]:構造是computed properties語法(ES2015 +)的一部分。

+0

排序,但不是您鏈接到的意義上(在對象初始值設定項中)。 –