Объект аргументов, который должен быть итерируемым в ES6?

В ES6 я пытался использовать объект arguments в качестве итерабельного при передаче конструктору Set. Он отлично работает в 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);

FYI, я знаю, что для этого кода существуют различные способы работы, такие как копирование объекта аргументов в реальный массив или использование аргументов отдыха. Этот вопрос связан с тем, должен ли объект arguments быть iterable или нет в ES6, который может использоваться везде, где ожидаются ожидаемые итерации.

Ответ 1

Я предполагаю, что это ошибка в реализации FF.

В соответствии с 9.2.12 Раздел FunctionDeclarationInstantiation (func, argumentsList),

Если аргументыObjectNeeded истинны, то

a) Если strict является истинным или если simpleParameterList является ложным, то

== > i) Пусть ao CreateUnmappedArgumentsObject (argumentsList).

b) Else,

== > 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.