在ES6中,我试图arguments
在传递给Set
构造函数时将对象用作iterable .它在IE11和Chrome 47中运行良好.它在Firefox 43中不起作用(抛出a TypeError: arguments is not iterable
).我查看了ES6规范,无法真正找到arguments
对象是否应该是可迭代的定义.
这是我尝试做的一个例子:
function destroyer(arr) { var removes = new Set(arguments); return arr.filter(function(item) { return !removes.has(item); }); } // remove items 2, 3, 5 from the passed in array var result = destroyer([3, 5, 1, 2, 2], 2, 3, 5); log(result);
仅供参考,我知道此代码有各种解决方法,例如将arguments对象复制到实数数组或使用rest参数.这个问题是关于ES6中是否arguments
应该使用该对象iterable
,可以在任何可预期的迭代中使用.
我想这是FF实现中的一个错误.
根据9.2.12 FunctionDeclarationInstantiation(func,argumentsList)部分,
如果argumentsObjectNeeded为true,那么
a)如果strict为true或者simpleParameterList为false,则
==> i)让ao成为CreateUnmappedArgumentsObject(argumentsList).
b)否则,
==> i)注意映射的参数对象仅适用于没有rest参数的非严格函数,任何参数默认值初始值设定项或任何析构参数.
==> ii)让我们成为CreateMappedArgumentsObject(func,formals,argumentsList,env).
双方CreateMappedArgumentsObject
并CreateUnmappedArgumentsObject
有
执行DefinePropertyOrThrow(obj,@@ iterator,PropertyDescriptor {[[Value]]:%ArrayProto_values%,[[Writable]]:true,[[Enumerable]]:false,[[Configurable]]:true}).
这意味着@@iterator
应该在arguments
对象上实际定义属性.