带有数组扩展类构造函数调用的JS Array.prototype.filter

时间:2018-12-27 21:58:07

标签: javascript arrays inheritance filter

我有一个数组扩展类A,我想过滤它。似乎仅以0作为参数调用了构造函数。为什么会这样?

以下是显示问题的示例:

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);

哪个日志:

[
    "ok",
    "long"
]
[
    0
]
[
    "long"
]

0是哪里来的?

1 个答案:

答案 0 :(得分:3)

Array.prototype.filter返回一个新的(数组)值。该值必须与原始数组具有相同的“类型”,即它必须是您的类的实例。

.filter创建您的类的新的空实例:

  

1。让 O 为? ToObject值)。
  [...]
  5.让 A 为? ArraySpeciesCreate O ,0)。
  [...]

https://www.ecma-international.org/ecma-262/9.0/index.html#sec-array.prototype.filter

  

但是为什么会给我0而不是没有参数

因为该规范说新数组是通过以(length)0作为参数调用其构造函数来创建的。