#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.
Параметры функции на самом деле могут иметь деструкцию:
- перейдите к https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment
- Поиск по этому тексту: извлечение полей из объектов, переданных в качестве параметра функции
-
Теперь выше показан пример другого вида деструктурирования, пример приведен ниже:
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]);
К сожалению, для вашего конкретного варианта использования, не то же самое. Извините!