javascript - 为什么 ({__proto__: []}) 在 JavaScript 中返回 Array 类型的结果
问题描述
在 JavaScript 中,以下给出了 false 的结果:
({ a: [] } instanceof Array);
console.log(({ a: [] } instanceof Array));
以下给出了 true 的结果:
({ __proto__: [] } instanceof Array);
console.log(({ __proto__: [] } instanceof Array));
为什么结果不一样?
解决方案
({ 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
了经典基于类的语言中的概念。
推荐阅读
- python-3.x - 汇总 pandas 数据框中多行的数据
- artifactory - 已部署工件标准的工件执行
- hyperledger-fabric - 如何限制对特定组织的“对等链代码升级”的访问
- javascript - 列表未正确加载到 reactjs 程序中
- java - 如何从嵌套的 HashMaps 中检索键而不是其值
- wpf - WPF/ReactiveUI 应用程序中的 ReactiveCommand 阻塞 UI 线程
- javascript - AngularJS路由不会页面
- svn - 使用 TortoiseSVN 和 Visual Studio Code,我如何将一些无序的更改从 dev 分支合并到 stage 分支?
- kubernetes - 将 alertmanager 添加到 istio prometheus
- python - 我创建了一个猜谜游戏,但我不明白为什么我的 -= 命令功能不起作用