参数对象应该是ES6中的可迭代对象吗?

时间:2016-01-05 14:57:08

标签: javascript ecmascript-6 iterable

在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,可以在任何可以预期迭代的地方使用。

1 个答案:

答案 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)。

CreateMappedArgumentsObjectCreateUnmappedArgumentsObject都有

  

执行 DefinePropertyOrThrow (obj, @@ iterator ,PropertyDescriptor {[[Value]]:%ArrayProto_values%,[[Writable]]:true,[[Enumerable] ]:false,[[Configurable]]:true})。

这意味着@@iterator属性应该在arguments对象上实际定义。