JS arguments.forEach不是一个函数

Все*_*дно 5 javascript foreach

所以这段代码完美无缺

var arr = [1, 2, 3, 4];
arr.forEach(function (el) {
    console.log(el);
})
Run Code Online (Sandbox Code Playgroud)

但如果我尝试这样做:

function printArgsInfo() {
    arguments.forEach(function (el) {
        console.log(el);
    });
}
printArgsInfo(2, 3, 2.5, -110.5564, false);
Run Code Online (Sandbox Code Playgroud)

参数.forEach不是函数即使tought参数是一个数组,如果尝试用forin循环执行它仍然有效.

Nin*_*olz 8

arguments是一个类似于对象的数组,但不是数组。在这种情况下,你可以从借用的方法Array#forEach,并call用它argument作为thisArg

function printArgsInfo() {
    [].forEach.call(arguments, function (el) {
        console.log(el);
    });
}

printArgsInfo(2, 3, 2.5, -110.5564, false);
Run Code Online (Sandbox Code Playgroud)

使用ES6,您可以使用rest参数...,如torazaburo建议的那样。

其余参数语法允许我们表示的参数的不确定数目为一个数组。

function printArgsInfo(...args) {
    args.forEach(el => console.log(el));
}

printArgsInfo(2, 3, 2.5, -110.5564, false);
Run Code Online (Sandbox Code Playgroud)

  • 我很惊讶您没有建议明显的`[... arguments] .forEach`。更优选地,只需说出`function printArgsInfo(... args)`。 (2认同)

Que*_*tin 5

甚至tought参数也是一个数组

事实并非如此.

function myFunc() {
    console.log(arguments instanceof Array);
}

myFunc(1,2,3);
Run Code Online (Sandbox Code Playgroud)

参数对象是一个数组状物体.它不是一个数组.


小智 5

根据 MDN 文档:

arguments 对象是一个类数组对象,对应于传递给函数的参数。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/arguments

所以,它不是一个真正的数组,也不共享 Array 对象的原型——这forEach是定义方法的地方。

有趣的是,同样来自 MDN 文档:

您还可以使用 Array.from() 方法或扩展运算符将参数转换为真正的数组

var args = Array.from(arguments);
Run Code Online (Sandbox Code Playgroud)

因此,这是您的代码的工作示例:

function printArgsInfo() {
    var args = Array.from(arguments);

    args.forEach(function (el) {
        console.log(el);
    });
}

printArgsInfo(2, 3, 2.5, -110.5564, false);
Run Code Online (Sandbox Code Playgroud)