2016-06-08 54 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)。