2016-10-03 7 views
6

Недавно я обнаружил, что этот синтаксис работает в 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» работает? Есть ли автоматическое преобразование?

+0

Как определяется 'item1'? – Redu

+0

@Redu определяется как в примере: function foo ([param1]) {} –

+2

[Destructuring] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment). – Xufox

ответ

3

Как отметил @Xufox, это работает из-за destructuring (array destructuring, а точнее). Ваш второй пример работает, потому что string is an array-like object, поэтому вы получаете T, то есть param1[0]. Числа - это не массивы (или даже массивные), поэтому двигатель не может разрушить аргумент.

Если вы принуждать свой номер в строку он будет работать:

foo((123).toString()); 
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" 
    

однако, я предполагаю, что это относится к этому, а также:

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 

В приведенном выше примере, поскольку строки не что иное, как массив символов , это прекрасно, что он работает на самом деле.

0

Точно, как говорили эти блестящие люди выше. Вот как компьютер читает это:

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

но ...

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

К сожалению, для вашего конкретного случая использования, не то же самое. Сожалею!

 Смежные вопросы

  • Нет связанных вопросов^_^