Javascript 在ES6中,arguments对象应该是iterable吗?
在ES6中,当传递给Javascript 在ES6中,arguments对象应该是iterable吗?,javascript,ecmascript-6,iterable,Javascript,Ecmascript 6,Iterable,在ES6中,当传递给集合构造函数时,我试图将参数对象用作iterable。它在IE11和Chrome 47中工作良好。它在Firefox43中不起作用(抛出一个TypeError:arguments not iterable)。我已经浏览了ES6规范,并没有真正找到参数对象是否应该是iterable的定义 下面是我试图做的一个例子: function destroyer(arr) { var removes = new Set(arguments); return arr.filter(
集合
构造函数时,我试图将参数
对象用作iterable。它在IE11和Chrome 47中工作良好。它在Firefox43中不起作用(抛出一个TypeError:arguments not iterable
)。我已经浏览了ES6规范,并没有真正找到参数
对象是否应该是iterable的定义
下面是我试图做的一个例子:
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中,
参数
对象是否应该是一个iterable
,可以在任何需要iterable的地方使用。我想这是FF实现中的一个bug
根据第节
如果ArgumentsObjectRequired为true,则
a) 如果strict为true或simpleParameterList为false,则
==>i)让ao成为CreateUnmappedGumentsObject(argumentsList)
b) 否则,
==>i)注意,映射参数对象仅为没有rest参数、任何参数默认值初始值设定项或任何非结构化参数的非严格函数提供
==>ii)让ao成为CreateMappedArgumentsObject(函数、形式、参数列表、环境)
两者都有
执行DefinePropertyOrThrow(obj,@@iterator,PropertyDescriptor{[[Value]]:%ArrayProto\u values%,[[Writable]]:true,[[Enumerable]]:false,[[Configurable]]:true})
这意味着,
@@iterator
属性实际上应该在参数
对象上定义。并且,为了明确证明它没有定义:(函数(a){返回参数[Symbol.iterator]})(1)
在FF中生成未定义的
,但是在其他浏览器中有一个函数。为了更好地了解现在要搜索的内容,我搜索了一个关于这个的Firefox bug报告,并在这里找到了它:。它看起来正在被发布(上个月为修复该错误而编写的代码)。Thx是指向ES6规范中正确位置的指针。我本来希望参数对象的描述提到@@iterator
,但根本没有提到它。该规范本身似乎比面向对象的规范更具程序性,这似乎有点讽刺意味。该缺陷修复程序现已发布,并在Firefox 46中运行。这是一个已知的FF缺陷:@apsillers-看起来代码已经编写好修复它(上个月),并且正在进行审查和测试。