请不要担心此代码的用途;这是我退出调试会话的简化。
我希望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不可迭代”