我需要一个可以有任意数量参数的方法。在C#中,我们有params
语句。我们在JavaScript中有类似的东西吗?
答案 0 :(得分:29)
有arguments
集合,其中包含传递给函数的所有参数。
有a)不需要在函数签名中指定“可选”参数,b)任何函数都接受任意数量的参数。
function foo() {
console.log(arguments);
}
foo(1,2,3,4); // logs [1, 2, 3, 4]
同样,不需要在函数调用中提供“required”参数:
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);
所谓的rest parameter ...
是该语言的新增功能(ES6 +),可以更方便地使用可变参数函数。 @ArunCM's answer解释了它。
答案 1 :(得分:10)
我知道这个帖子太旧了,但我相信这里缺少了一些东西。
有 Rest parameter (在ECMAScript 6 中引入),这将允许我们将无限期数量的参数表示为阵列即可。
它总是返回一个数组。这意味着即使在防御性的JavaScript领域,也可以在没有防护装置的情况下检查 .length 的休息。
语法:
function(a, b, ...theArgs) {
// ...
}
rest参数和arguments对象之间有三个主要区别:
补充阅读: Spread
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));

答案 2 :(得分:3)
是。 arguments
。
function concatStrings () {
var str = '';
for (var i = 0; i < arguments.length; i++) {
str += arguments[i];
}
return str;
}
请注意,arguments
不是数组,因此它没有join
或push
等方法。它只是一个类似数组的对象(具有数字属性和length
属性),因此可以迭代。
答案 3 :(得分:2)
JavaScript在函数内部有arguments
个对象。它包含传递给函数的所有参数。
答案 4 :(得分:1)
它是特殊变量“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
答案 5 :(得分:0)
默认情况下,Javascript函数可以接受任意数量的参数。您可以使用arguments
变量查看它们。
请参阅here。