0

鉴于此功能:

function foo( a,b,c ) {
    //
}

你怎么能做某事,比如对每个参数使用 console.log() ?我知道您可以使用 arguments 关键字来查看参数。参数似乎返回看起来像数组的东西(但类型为“对象”[suprise.. not]),但它不支持.forEach,我使用的是 Chrome。

我尝试将函数修改为此,并希望它能够工作:

function foo( a,b,c ) {
    arguments.forEach(function( arg ){
        console.log( arg );
    });
}

你得到 TypeError: Object # has no method 'forEach' 的错误。

4

7 回答 7

5

arguments对象没有forEach方法,因此您需要使用for循环或for...in循环对其进行迭代。

​function foo () {
    for (var i = 0; i < arguments.length; i++) {
        console.log(arguments[i]);    
    }
}

foo("Foo", { "bar": 0 }); // Output: Foo, Object {bar: 0} 

或者

​function foo () {
    for (var arg in arguments) {
        console.log(arguments[arg]); 
    }    
}

foo("Foo", "Bar"); // Output: Foo, Bar
于 2012-12-05T21:36:15.360 回答
3

或者您可以使用 hack:

Array.prototype.forEach.call(arguments, function (arg) {
    console.log(arg);
});

arguments不是数组,但它足够接近,您可以应用 Array 的原型并使用常规数组函数。我们只是抓住了 Array 的实现并将其强行应用于参数。

于 2012-12-05T21:38:55.257 回答
2

来自MDN

// convert to array
var args = Array.prototype.slice.call(arguments);
args.forEach...
于 2012-12-05T21:37:36.657 回答
1

做一个循环arguments.lengtharguments不是一个数组,所以它没有forEach原型方法。

for ( var i = 0, l = arguments.length; i<l; ++i ) {
  doSomething( arguments[i] );
}
于 2012-12-05T21:36:13.640 回答
1

只需使用普通for循环即可。

function foo( a,b,c ) {
    for(var i = 0, len = arguments.length; i < len; i++){
        console.log(arguments[i]);
    }
}

或者您可以将其转换为真实数组。

function foo( a,b,c ) {
    var args = Array.prototype.slice.call(arguments);
    args.forEach(function( arg ){
        console.log( arg );
    });
}
于 2012-12-05T21:36:42.833 回答
0
var show_args = function (){

    for(var ar in arguments){
        console.log(arguments[ar])
    }
}
于 2012-12-05T21:37:05.793 回答
0

您可以通过调用数组切片方法将“参数”转换为数组:

function foo(a, b, c) {
  var argArray = Array.prototype.slice.call(arguments);
  argArray.forEach(function(x) {
    // ...
  });
}
于 2012-12-05T21:37:36.433 回答