2015-06-14 62 views
6
let text, value; 
if (typeof f == 'string') { 
    text = value = f; 
} else { 
    let { 
     text, value 
    } = f; 
} 

這樣做創建了兩個新的瓦爾(從else),但是如果我把它寫像這樣:ES6解構,動態分配

let text, value; 
if (typeof f == 'string') { 
    text = value = f; 
} else { 
    { 
     text, value 
    } = f; 
} 

我收到一個語法錯誤。這裏最好的方法是什麼?

+0

另外'常量{文本,值} =(typeof運算˚F=== '字符串') ? {text:f,value:f}:f;' – loganfsmyth

回答

7

您需要括號的分配辦法:(Live copy on Babel

let text, value; 
if (typeof f == 'string') { 
    text = value = f; 
} else { 
    ({    // (at start 
     text, value 
    } = f);   //) at end 
} 

你需要這些括號出於同樣的原因you need parens or similar to immediately invoke a function:要告訴它應該期待一個表達式解析器,不聲明。如果沒有這些元素,當它遇到{時,它認爲這是一個塊的開始。但是,與用函數,它必須是括號,而不是一個領先一元+!like this

let text, value; 
if (typeof f == 'string') { 
    text = value = f; 
} else { 
    +{     // <== Doesn't work like it does with IIFEs 
     text, value 
    } = f; 
} 
+1

不錯,謝謝! – benhowdle89

+0

很好的答案。小注:圓括號只需圍繞大括號;作業本身可以在外面。 – Zirak

+0

@Zirak:不需要,parens需要圍繞整個賦值表達式;這是一個錯誤,否則:[bit.ly鏈接到Babel repl(太長以至於無法粘貼評論)](http://bit.ly/1HGPapN)。他們甚至有一個特定的信息:「你試圖賦值給一個帶括號的表達式,例如,而不是'({a})= 0'使用'({a} = 0)'」如果你考慮這並不令人意外:僅在'{}'周圍使用parens,它看起來像parens中的對象初始化器(因爲在ES6中可以使用這種簡寫形式)。 –