有没有办法传递未知数量的参数,例如:
var print_names = function(names) {
foreach(name in names) console.log(name); // something like this
}
print_names('foo', 'bar', 'baz');
另外,如何获得传入的参数数量?
有没有办法传递未知数量的参数,例如:
var print_names = function(names) {
foreach(name in names) console.log(name); // something like this
}
print_names('foo', 'bar', 'baz');
另外,如何获得传入的参数数量?
Answers:
您可以通过magicarguments对象访问传递给任何javascript函数的参数,该对象的行为类似于数组。使用arguments您的函数看起来像
var print_names = function() {
for (var i=0; i<arguments.length; i++) console.log(arguments[i]);
}
这是需要注意的重要的arguments是不是一个数组。MDC上有一些很好的文档:https : //developer.mozilla.org/en/Core_JavaScript_1.5_Guide/Functions#Using_the_arguments_object
如果你想打开arguments到一个数组,这样就可以做这样的事情.slice(),.push()等等,使用这样的事情:
var args = Array.prototype.slice.call(arguments);
有更好的方法!新的rest参数功能为您服务:
var print_names = function(...names) {
for (let i=0; i<names.length; i++) console.log(names[i]);
}
spread syntax这里非常不正确。那是rest parameter你给的例子。好的答案,但令人困惑,它被称为spread
Array.prototype.slice.call(arguments):medium.com/@andrewsburke/…–
利用rest参数语法。
function printNames(...names) {
console.log(`number of arguments: ${names.length}`);
for (var name of names) {
console.log(name);
}
}
printNames('foo', 'bar', 'baz');
rest参数和arguments对象之间有三个主要区别:
function print_args() {
for(var i=0; i<arguments.length; i++)
console.log(arguments[i])
}
有一个隐藏的对象传递给JavaScript中称为的每个函数arguments。
您将只用于arguments.length获取传递给函数的参数数量。
要遍历参数,可以使用循环:
for(var i = arguments.length; i--) {
var arg = arguments[i];
}
请注意,这arguments不是真正的数组,因此,如果您需要将其作为数组,则可以将其转换为:
var args = Array.prototype.slice.call(arguments);
var args = Array.prototype.slice.call(arguments);,var args = Array.apply(null, arguments);等,有很多方法……
arguments.length。您可以在其上使用for循环。
(function () {
for (var a = [], i = arguments.length; i--;) {
a.push(arguments[i]);
};
return a;
})(1, 2, 3, 4, 5, 6, 7, 8)
for并不需要分号之后的分号,但是我将在最后一行的末尾添加一个。
您可以使用spread / rest运算符将您的参数收集到数组中,然后length数组的就是您传递的参数数量:
function foo(...names) {
console.log(names);
return names;
}
console.log(foo(1, 2, 3, 4).length);
使用BabelJS我将函数转换为oldschool JS:
"use strict";
function foo() {
for (var _len = arguments.length, names = new Array(_len), _key = 0; _key < _len; _key++) {
names[_key] = arguments[_key];
}
console.log(names);
return names;
}
我喜欢这样做:
如果您不知道参数的数量,这将无济于事,但如果您不想记住参数的顺序,则无济于事。
/**
* @param params.one A test parameter
* @param params.two Another one
**/
function test(params) {
var one = params.one;
if(typeof(one) == 'undefined') {
throw new Error('params.one is undefined');
}
var two = params.two;
if(typeof(two) == 'undefined') {
throw new Error('params.two is undefined');
}
}