方括号围绕函数定义中的参数

时间:2016-06-08 00:24:27

标签: javascript ember.js ember-cli

我在the Ember CLI website中看到了以下代码:

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

令我困惑的是围绕value参数的方括号。我可以在函数调用中理解它,但为什么在函数定义中?

3 个答案:

答案 0 :(得分:7)

这对我来说非常令人惊讶,但它似乎是有效的javascript,根据ECMAScript 2017语言规范,函数声明中的形式参数可以包含任何"绑定元素",包括数组绑定

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

此功能的实际行为似乎意味着函数的参数应该是一个数组,value将采用数组中第一个元素的值。

答案 1 :(得分:7)

这是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规范最近的一个新增内容,它应该在所有目标环境(看着你的IE)中进行测试,如果不使用Babel或等效物来转发它以实现向后兼容性。

答案 2 :(得分:0)

这也可以反向进行,以便可以将非数组“转换”为数组,如下所示:

User.create(req.body).meta({fetch: true}).exec(function (err, createdUser) {
    if (err != null)
        res.send({ 'message': err, 'user': 0 });
    else
        res.send({ 'message': "user created", 'user': createdUser });
});

输出:

var a, b;

a = {first:"Orion", middle:"Miki", last:"Kenyon"}
b = objToUpperCase([a]); // a is a single object, but is passed as an array

console.log(a);
console.log(b[0]);

function objToUpperCase(inputs) {
  var outputs = [];
  for (var i = 0; i <= inputs.length - 1; i++) {
    var input = inputs[i];
    output = {
        first: input.first.toUpperCase(),
        middle: input.middle.toUpperCase(),
        last: input.last.toUpperCase()
        };
    outputs.push(output);
  }
  return outputs;
}