JS arguments.forEach 不是一个函数[重复]

Posted

技术标签:

【中文标题】JS arguments.forEach 不是一个函数[重复]【英文标题】:JS arguments.forEach is not a function [duplicate] 【发布时间】:2017-11-10 02:29:40 【问题描述】:

所以这段代码完美运行

var arr = [1, 2, 3, 4];
arr.forEach(function (el) 
    console.log(el);
)

但如果我尝试这样做:

function printArgsInfo() 
    arguments.forEach(function (el) 
        console.log(el);
    );

printArgsInfo(2, 3, 2.5, -110.5564, false);

arguments.forEach 不是函数

即使 arguments 是一个数组,如果尝试使用 for in 循环执行此操作,它仍然有效。

【问题讨论】:

不要使用arguments。它已经过时了。 Array.prototype.slice.call(arguments).forEach...替换arguments.forEach... 【参考方案1】:

arguments 是类数组对象,但不是数组:

var doThing = function() 
    console.log(arguments.constructor.name)
    console.log([].constructor.name)


doThing("someArgument")


将返回Object 用于argumentsArray 用于空数组[]

ES6 及更新版本

使用 ES6,您可以使用 rest parameters ...,正如 torazaburo 所建议的那样。

rest parameter 语法允许我们将不定数量的参数表示为一个数组。

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


printArgsInfo(2, 3, 2.5, -110.5564, false);

ES5 及更早版本

对于 ES5 及更早版本,您可以从 Array#forEachcall 借用该方法,将 argument 设为 thisArg

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


printArgsInfo(2, 3, 2.5, -110.5564, false);

【讨论】:

我很惊讶你没有建议明显的[...arguments].forEach。或者更可取的是,直接说function printArgsInfo(...args) @torazaburo,对,也补充了,谢谢你的提示。【参考方案2】:

根据 MDN 文档:

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

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

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

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

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

var args = Array.from(arguments);

所以,下面是您的代码的一个工作示例:

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

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


printArgsInfo(2, 3, 2.5, -110.5564, false);

【讨论】:

davidwalsh.name/arguments-arrayye,但解释得更好【参考方案3】:

即使参数是一个数组

不是。

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


myFunc(1,2,3);

Arguments object 是一个类似数组的对象。它不是一个数组。

【讨论】:

也可以看看***.com/questions/960866/… console.log(参数类型);是的,它说它是一个对象,而且似乎不应该去寻找它似乎是合乎逻辑的,从不认为它不是一个数组 console.log(typeof []) — 数组是对象(但并非所有对象都是数组)。

以上是关于JS arguments.forEach 不是一个函数[重复]的主要内容,如果未能解决你的问题,请参考以下文章

[Effective JavaScript 笔记]第51条:在类数组对象上复用通用的数组方法

es5和es6中如何处理不确定参数

JS如何判断一个数组是不是为空、是不是含有某个值

js 判断一个值是不是为数字

如何判断出一个js对象是不是一个dom对象

js判断一个变量或对象是不是存在