Javascript: переадресация вызовов функций, которые принимают переменное количество аргументов
Мне кажется, мне нужно что-то вроде ruby splat *
здесь.
function foo() {
var result = '';
for (var i = 0; i < arguments.length; i++) {
result += arguments[i];
}
return result;
}
function bar() {
return foo(arguments) // this line doesn't work as I expect
}
bar(1, 2, 3);
Я хочу, чтобы это возвращало "123"
, но вместо этого я получаю "[object Arguments]"
. Кажется, это имеет смысл. Он передает объект, который представляет аргументы, но не аргументы индивидуально.
Итак, как я просто пересылаю любое количество аргументов другой функции, которая принимает любое количество аргументов?
Ответы
Ответ 1
ОБНОВЛЕНИЕ: Начиная с ES6, вы можете использовать расширенный синтаксис для вызова функции, применяя элементы итерируемого объекта в качестве значений аргумента вызова функции:
function bar() {
return foo(...arguments);
}
Обратите внимание, что вы также можете получать переменное число аргументов в виде реального массива вместо использования объекта arguments
.
Например:
function sum(...args) { // args is an array
return args.reduce((total, num) => total + num)
}
function bar(...args) {
return sum(...args) // this just forwards the call spreading the argument values
}
console.log(bar(1, 2, 3)); // 6
Ответ 2
Попробуйте return foo.apply(this,arguments)
. Также вы можете использовать Array.prototype.slice.apply(arguments).join('')
для вашей функции foo.