Мне нужен метод, который может иметь произвольное количество параметров. В С# мы имеем оператор params
. У нас есть что-то подобное в JavaScript?
Есть ли эквивалент JavaScript для С# 'params'?
Ответ 1
Существует коллекция arguments
, которая содержит все аргументы, переданные функции.
Существует a) нет необходимости указывать "необязательные" аргументы в сигнатуре функции и b) любая функция принимает любое количество параметров.
function foo() {
console.log(arguments);
}
foo(1,2,3,4); // logs [1, 2, 3, 4]
Аналогично, нет необходимости предоставлять "необходимые" аргументы в вызове функции:
function foo(a, b, c, d) {
console.log(arguments);
}
foo(1,2); // logs [1, 2]
Любой аргумент, указанный в сигнатуре, но не указанный в вызове функции, не будет undefined
.
Обратите внимание, что arguments
ведут себя как массив, но технически это не одно. Например, вы можете вызывать arguments[0]
, но вы не можете вызвать arguments.slice()
. Что вы можете сделать, чтобы обойти это, используйте прототип Array:
Array.prototype.slice.call(arguments, 1, 2);
Так называемый параметр отдыха ...
является новым (ES6+) дополнением к языку и делает работу с вариационными функциями более удобной. Ответ @ArunCM объясняет это.
Ответ 2
Я знаю, что эта ветка слишком старая, но я считаю, что здесь что-то не хватает.
Существует Rest параметр (введен в ECMAScript 6), который позволит нам представить неопределенное количество аргументов как массив .
Он всегда возвращает массив. Это означает, что даже в защитной среде JavaScript можно использовать такие вещи, как проверка .length отдыха без охраны.
Синтаксис:
function(a, b, ...theArgs) {
// ...
}
Существуют три основных различия между параметрами отдыха и объектами arguments:
- параметры останова - это те, которым не присвоено отдельное имя, а объект arguments содержит все аргументы, переданные функции
- объект arguments не является реальным массивом, в то время как параметры останова являются экземплярами Array, поэтому на него могут быть применены такие методы, как sort, map, forEach или pop;
- объект аргументов имеет дополнительную функциональность, специфичную для себя (например, свойство вызываемого абонента).
Дополнительное чтение: Спред
function f(x, ...y) {
// y is an Array
return x * y.length;
}
console.log("Expected result : 3*2 = 6 & Actual result : " + f(3, "hello", true));
console.log("Expected result : 3*4 = 12 & Actual result : " + f(3, "a", true, "b", 1));
//here we are not passing anything to "y" but its still safe to check .length of "y" because it always return an array.
console.log("Expected result : 3*0 = 0 & Actual result : " + f(3));
Ответ 3
JavaScript имеет arguments
объект внутри функций. Он содержит все параметры, переданные функции.
Ответ 4
Да. arguments
.
function concatStrings () {
var str = '';
for (var i = 0; i < arguments.length; i++) {
str += arguments[i];
}
return str;
}
Помните, что arguments
не является массивом, поэтому он не имеет методов, таких как join
или push
. Это просто массивный объект (с численными свойствами и свойством length
), поэтому его можно повторить через.
Ответ 5
Это нечто вроде неявного в специальной переменной "arguments". Используйте следующее:
function something(arg1, arg2) {
for (var i = 0; i < arguments.length; i++) {
var x = arguments[i];
}
}
Затем вы можете называть его как something(1, 2, 3, 'a', 'b', 'c')
Другие примеры здесь: http://www.jtricks.com/javascript_tutorials/varargs.html
Ответ 6
Функции Javascript могут принимать любое количество параметров по умолчанию. Вы можете увидеть их с помощью переменной arguments
.
Смотрите здесь.