【问题标题】:Square brackets surrounding parameter in function definition函数定义中参数的方括号
【发布时间】:2016-10-08 01:43:27
【问题描述】:

我在the Ember CLI website中遇到了如下代码:

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

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

【问题讨论】:

    标签: javascript ember.js ember-cli


    【解决方案1】:

    LavaWings 上面的答案是正确的,并且很好地分析了数组析构函数的工作原理,这是您在用括号声明函数参数时得到的结果。

    请注意,这也适用于反向。 Javascript 将允许您从任何对象“构造”一个​​数组,方法是传递带有括号的对象,并将其视为函数中的数组。在这种情况下,函数定义的参数不会有括号。

    这两种行为是同一枚硬币的两个方面,展示了编译器如何在后台处理对象和数组。

    例如:

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

    【讨论】:

    • 这似乎与我无关您的函数没有将参数作为数组析构函数
    • 演示是为了理解析构函数是如何工作的,并表明它是一个双向的命题。数组可以被分解成单独的变量(即对象),而逆对象可以被“构造”成数组。因此,即使我的对象不是数组,并且函数需要一个数组,只需在参数输入上添加方括号,该对象就会转换为一个包含一个条目的数组(作为传递的对象)。
    【解决方案2】:

    这是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 规范的最新补充,如果不使用 Babel 或等效转译以实现向后兼容性,则应在所有目标环境(查看 IE)中对其进行测试。

    【讨论】:

      【解决方案3】:

      这一切让我感到非常惊讶,但它似乎是有效的 javascript,根据 ECMAScript 2017 语言规范,函数声明中的形参可以是任何“绑定元素”,包括数组绑定。

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-18
        • 1970-01-01
        • 2019-02-16
        • 2017-03-26
        • 2013-10-02
        • 1970-01-01
        相关资源
        最近更新 更多