2016-06-08 41 views
3

我碰到下面的代碼在the Ember CLI website傳來:在函數定義周圍參數方括號

export default Ember.Helper.helper(function([value]) { 
    return value.toUpperCase(); 
}); 

什麼困惑我的是周圍的value參數的方括號。我可以在函數調用中理解它,但爲什麼在函數定義中?

+0

這個表示法通常是可選參數。我認爲,在這種情況下是一樣的 – Thomas

+1

看起來很奇怪,你會想要可選參數,因爲所有參數在JavaScript中都是可選的。 – Polygon

+0

@Thomas:我不確定。它似乎是實際源代碼的摘錄。 – recursive

回答

5

這對我來說非常令人驚訝,但它似乎是有效的javascript,根據ECMAScript 2017語言規範,函數聲明中的形式參數可以包含任何「綁定元素」,包括數組綁定。

https://tc39.github.io/ecma262/#prod-BindingElement

這個功能的實際行爲似乎意味着參數的功能應該是一個數組,value將在數組中的第一個元素的值。

0

這是一個destructuring assignment。 @recursive描述的行爲是正確的,但它可能有助於知道它不限於第一個元素。如果它被寫有三個要素:

function xyz([a, b, c]){...}

則A,B和C都將被宣佈爲功能範圍內可用的變量,在這種情況下,將等於第一數組的元素。此外 - 如果作爲參數傳遞的數組沒有至少三個元素,則參數(a,b和c)中指定的其餘元素將存在作爲聲明,但將具有值undefined

// Example 
function destructureThis([a, b, c]){ 
    console.log(a, b, c); 
} 

var shortArray = [1, 25]; 
destructureThis(shortArray); 

// Prints to console: 
// 1 25 undefined 

同樣,如果參數數組較大,那麼其他元素就會被忽略,正如已經提到的那樣。

var longerArray = [1, 5, 9, 50, 60]; 
destructureThis(longerArray); 

// Prints to console: 
// 1 5 9 

而且......這是最近足夠除了ECMAScript的規範,它應該在所有目標環境中測試,如果不使用巴貝爾或相當於transpile它向後兼容(你看IE)。