在ES6中,我试图在传递给arguments
构造函数时将Set
对象用作可迭代对象。它在IE11和Chrome 47中运行良好。它在Firefox 43中不起作用(抛出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参数。这个问题是关于arguments
对象在ES6中是否应该是iterable
,可以在任何可以预期迭代的地方使用。
答案 0 :(得分:8)
我认为这是FF实施中的一个错误。
根据9.2.12 FunctionDeclarationInstantiation(func, argumentsList)部分,
如果argumentsObjectNeeded为true,则
a)如果strict为true或者simpleParameterList为false,则
==> i)让ao为 CreateUnmappedArgumentsObject (argumentsList)。
b)否则,
==> i)注意映射的参数对象仅适用于没有rest参数的非严格函数,任何参数默认值初始值设定项或任何解构参数。
==> ii)让ao为 CreateMappedArgumentsObject (func,formals,argumentsList,env)。
CreateMappedArgumentsObject
和CreateUnmappedArgumentsObject
都有
执行 DefinePropertyOrThrow (obj, @@ iterator ,PropertyDescriptor {[[Value]]:%ArrayProto_values%,[[Writable]]:true,[[Enumerable] ]:false,[[Configurable]]:true})。
这意味着@@iterator
属性应该在arguments
对象上实际定义。