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
用于arguments
和Array
用于空数组[]
。
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#forEach
和 call
借用该方法,将 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 不是一个函数[重复]的主要内容,如果未能解决你的问题,请参考以下文章