当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《参数对象应该是ES6中的可迭代对象吗?》经验,为你挑选了1个好方法。

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



1> thefourtheye..:

我想这是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).

双方CreateMappedArgumentsObjectCreateUnmappedArgumentsObject

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

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


为了更好地了解现在要搜索的内容,我搜索了一个关于此的Firefox错误报告并在此处找到:[参数对象应该支持ES6 @@ iterator协议](https://bugzilla.mozilla.org/show_bug. CGI?ID = 1067049).看起来它正处于发布过程中(上个月为修复bug而编写的代码).
推荐阅读
跟我搞对象吧
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有