Именованный элемент массива, используемый в определении функции

#javascript #arrays #function #implicit-conversion

#javascript #массивы #функция #неявное преобразование

Вопрос:

Недавно я обнаружил, что этот синтаксис работает в 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 в первом аргументе (объявленном как array).

Мои вопросы:

1) Как называется этот синтаксис (часть [param1], которая позволяет использовать param1 в качестве переменной)?

2) Почему работает «Случай 2»? Существует ли какое-либо автоматическое преобразование?

Комментарии:

1. как item1 определяется?

2. @Redu определяется как в примере: функция foo([param1]) {}

3. Деструктурирование .

4. Он не будет работать с item1 , но с param1 . Также фактически возвращается второй случай T .

5. @Xufox моя ошибка — я исправил это

Ответ №1:

Как указал @Xufox, это работает из-за destructuring (деструктурирования массива, если быть более конкретным). Ваш второй пример работает, потому что строка — это объект, подобный массиву, поэтому вы получаете 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
  

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

Ответ №3:

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

foo(‘testParamater1’) = foo([‘testParamater1’]);

но…

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

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