请不要担心此代码的用途;这是我退出调试会话的简化。

我希望f表现得像Array,但是如果您在调试器(我已经测试过节点和Chrome)下运行该代码,则由于某种原因(我无法解释),您会看到在执行wtf期间将调用u类。为了使事情变得更怪异,出现了ghostArg,其值为4。你能解释发生了什么吗?



class wtf extends Array {
  constructor(ghostArg){
    super();
    if(ghostArg){
      this.push(...ghostArg);
    }
  }
}

const f = new wtf();

f.push({'n':1});
f.push({'n':0});
f.push({'n':3});
f.push({'n':7});

const u = x => x.map(e=>e.n);
console.log(u(f)); // I expected to see [1,0,3,7] out of here

最佳答案

你能解释发生了什么吗?


.map()创建一个新数组new Array(n),其中n是在其上调用map的数组的长度。在您的情况下,该长度(n)为4

现在,考虑将4作为参数时构造函数的行为:

if(4){               //if(ghostArg){
  this.push(...4);   //  this.push(...ghostArg);
}                    //}


4是不可迭代的,因此...4会抛出错误说明:


  “ TypeError:ghostArg不可迭代”

10-08 17:19