In ES6, I was trying to use the arguments
object as an iterable when passed to the Set
constructor. It works fine in IE11 and in Chrome 47. It does not work in Firefox 43 (throws a TypeError: arguments is not iterable
). I've looked through the ES6 spec and cannot really find a definition of whether the arguments
object should be an iterable or not.
Here's an example of what I was trying to do:
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, I know there are various work-arounds for this code such as copying the arguments object into a real array or using rest arguments. This question is about whether the arguments
object is supposed to be an iterable
or not in ES6 that can be used anywhere iterables are expected.
I suppose it is a bug in FF's implementation.
As per 9.2.12 FunctionDeclarationInstantiation(func, argumentsList) section,
If argumentsObjectNeeded is true, then
a) If strict is true or if simpleParameterList is false, then
==> i) Let ao be CreateUnmappedArgumentsObject(argumentsList).
b) Else,
==> i) NOTE mapped argument object is only provided for non-strict functions that don’t have a rest parameter, any parameter default value initializers, or any destructured parameters .
==> ii) Let ao be CreateMappedArgumentsObject(func, formals, argumentsList, env).
Both CreateMappedArgumentsObject
and CreateUnmappedArgumentsObject
have
Perform DefinePropertyOrThrow(obj, @@iterator, PropertyDescriptor {[[Value]]:%ArrayProto_values%, [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: true}).
It means that @@iterator
property should have been actually defined on the arguments
object.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With