我碰到下面的代碼在the Ember CLI website傳來:在函數定義周圍參數方括號
export default Ember.Helper.helper(function([value]) {
return value.toUpperCase();
});
什麼困惑我的是周圍的value
參數的方括號。我可以在函數調用中理解它,但爲什麼在函數定義中?
我碰到下面的代碼在the Ember CLI website傳來:在函數定義周圍參數方括號
export default Ember.Helper.helper(function([value]) {
return value.toUpperCase();
});
什麼困惑我的是周圍的value
參數的方括號。我可以在函數調用中理解它,但爲什麼在函數定義中?
這對我來說非常令人驚訝,但它似乎是有效的javascript,根據ECMAScript 2017語言規範,函數聲明中的形式參數可以包含任何「綁定元素」,包括數組綁定。
https://tc39.github.io/ecma262/#prod-BindingElement
這個功能的實際行爲似乎意味着參數的功能應該是一個數組,value
將在數組中的第一個元素的值。
這是一個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)。
這個表示法通常是可選參數。我認爲,在這種情況下是一樣的 – Thomas
看起來很奇怪,你會想要可選參數,因爲所有參數在JavaScript中都是可選的。 – Polygon
@Thomas:我不確定。它似乎是實際源代碼的摘錄。 – recursive