函数定义中使用的命名数组元素

时间:2016-10-03 21:48:41

标签: javascript arrays function implicit-conversion

最近我发现这种语法适用于JavaScript(Chrome 53):

function foo([param1]) { // Function argument is declared as array and param1 is used as variable? What is the name of this syntax?
  console.log(param1); 
}

foo(['TestParameter1']); // Case 1 - works. Output: TestParameter1
foo('TestParameter1');   // Case 2 - works??? Why? Output: TestParameter1
foo(123);                // Case 3 - does not work - VM860:1 Uncaught TypeError: undefined is not a function(…)

Result => TestParameter1 // this is the result

我看到param1可以用作引用第一个参数中索引为0的项的变量(声明为数组)。

我的问题是:

1)如何命名此语法([param1]部分允许您将param1用作变量)?

2)为什么“案例2”有效?有自动转换吗?

3 个答案:

答案 0 :(得分:3)

正如@Xufox所指出的,这是因为destructuringarray destructuring更具体)。您的第二个示例的工作原因是string is an array-like object,因此您获得T,即param1[0]。数字不是数组(甚至是数组),因此引擎无法对参数进行解构。

如果你将你的号码强制转换为字符串,它将起作用:

foo((123).toString()); 

答案 1 :(得分:2)

这似乎是@Xufox正确指出的解构。

函数参数实际上可以解构:

  1. 转到https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment
  2. 搜索此文本:从作为函数参数传递的对象中提取字段
  3. 现在,上面显示了另一种解构的示例,示例如下:

    function userId({id}) {
      return id;
    }
    
    var user = { 
      id: 42, 
      displayName: "jdoe"
    };
    
    console.log("userId: " + userId(user)); // "userId: 42"
    
  4. 但是,我认为它也适用于此:

    function foo([param1]) {
      console.log(param1);
    }
    

    此行为中整数和字符串之间的差异:

    console.log('123'); //works, outputs 1, '123' = ['1', '2', '3'] of chars
    console.log(['123']); //works, outputs 123
    console.log([123]); //works, outputs 123
    console.log(123); //error
    

    在上面的例子中,因为字符串只是一个字符数组,所以它实际上很好用。

答案 2 :(得分:0)

正如上面这些才华横溢的人所说的那样。以下是计算机的读取方式:

foo('testParamater1')= foo(['testParamater1']);

但是...

foo(123)= foo([[1,2,3]);

不幸的是,对于您的具体用例,不一样。遗憾!