首页 > 解决方案 > 为什么 ({__proto__: []}) 在 JavaScript 中返回 Array 类型的结果

问题描述

在 JavaScript 中,以下给出了 false 的结果:

({ a: [] } instanceof Array);
console.log(({ a: [] } instanceof Array));

以下给出了 true 的结果:

({ __proto__: [] } instanceof Array);
console.log(({ __proto__: [] } instanceof Array));

为什么结果不一样?

标签: javascript

解决方案


({ a: [] } instanceof Array);

返回 false ,因为您在询问使用数组属性初始化的对象本身是否是数组。明显的答案,不,console.log 是假的。

({ __proto__: [] } instanceof Array);

询问使用对象初始化器创建的对象,它将其继承链中的第一个对象设置为空数组(通过将__proto__要初始化的对象的属性设置为空数组)是否是 Array 的实例。

答案是正确的,因为 JavaScriptinstanceof X运算符仅报告X(在这种情况下Array.prototype)的原型属性是否在运算符左侧的对象的继承链中intanceof。由于第二个示例对象在其继承链中包含一个 Array 对象,该对象本身继承自Array.prototype,因此答案是true

JavaScript 不是经典意义上的基于类的语言,它instance of报告对象的继承链,在大多数但不是所有情况下,这反映instanceof了经典基于类的语言中的概念。


推荐阅读