ember.js 方括号括住函数定义中的参数

egmofgnx  于 2022-11-05  发布在  其他
关注(0)|答案(3)|浏览(132)

我在Ember CLI网站中遇到了以下代码:

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

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

dwbf0jvd

dwbf0jvd1#

这是一个destructuring assignment。@recursive描述的行为是正确的,但它可能有助于了解它并不限于第一个元素。如果它是用三个元素编写的:
undefined
然后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),如果不使用巴别塔或等效物来翻译它的向后兼容性。

nkhmeac6

nkhmeac62#

这对我来说是非常令人惊讶的,但它似乎是有效的JavaScript,根据ECMAScript 2017语言规范,函数声明中的形参可以是任何“绑定元素”,包括数组绑定。
https://tc39.github.io/ecma262/#prod-BindingElement
这个特性的实际行为似乎意味着函数的参数应该是一个数组,并且value将采用数组中第一个元素的值。

xeufq47z

xeufq47z3#

上面的LavaWings回答是正确的,并且对数组析构函数的工作原理进行了出色的分析,这就是用括号声明函数参数时得到的结果。
请注意,这也适用于 * 反向 *。Javascript允许您从任何对象“构造”一个数组,方法是用括号将对象括起来,并将其视为函数中的数组。在这种情况下,函数定义中的param不会用括号括起来。
这两个行为是同一枚硬币的两面,显示了编译器如何在幕后处理对象和数组。
例如:

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;
}

输出量:

Object {first: "Orion", last: "Kenyon", middle: "Miki"}
Object {first: "ORION", last: "KENYON", middle: "MIKI"}

相关问题