I have a Array extending class A which I want to filter. It seems like the constructor gets called another time with just 0
as parameter. Why is that?
Here is an example showing the problem:
class A extends Array { constructor(...a){ console.log(a) super(...a); } } let a = new A("ok", "long"); let b = a.filter((e) => { return e.length === 4; }); console.log(b);
Which logs:
[ "ok", "long" ] [ 0 ] [ "long" ]
Where is the 0 comming from?
Advertisement
Answer
Array.prototype.filter
is returning a new (array) value. That value needs to be of the same “type” as the original array, i.e. it has to be an instance of your class.
.filter
creates a new empty instance of your class:
1. Let O be ? ToObject(this value).
[…]
5. Let A be ? ArraySpeciesCreate(O, 0).
[…]
https://www.ecma-international.org/ecma-262/9.0/index.html#sec-array.prototype.filter
but why would it give me a 0 and not just no paramenter
Because the spec says that the new array is created by calling its constructor with (length) 0
as argument.