You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何JavaScript中({a:[]})与({__proto__:[]})的instanceof Array结果不同?

为什么这两个instanceof的结果不一样?

这事儿得从instanceof的核心逻辑说起——它本质上是检查右侧构造函数的prototype属性是否存在于左侧对象的原型链上,和对象内部有没有数组类型的属性完全没关系。咱们拆解两个例子来看:

第一个例子:({ a: [] } instanceof Array)返回false

({ a: [] })是一个普通的字面量对象,它的原型默认指向Object.prototype,完整的原型链是:

普通对象 → Object.prototype → null

虽然这个对象的a属性是一个数组,但这只是对象的一个内部属性而已,完全不会改变对象本身的原型链。当用instanceof Array检查时,Array.prototype不在这个普通对象的原型链上,所以结果是false。

第二个例子:({ __proto__: [] } instanceof Array)返回true

这里的__proto__是用来设置对象内部[[Prototype]](也就是原型)的语法。咱们把这个对象的原型直接设置成了一个数组实例[],那它的原型链就变成了:

当前对象 → 数组实例 → Array.prototype → Object.prototype → null

这时候Array.prototype清清楚楚在这个对象的原型链里,完美符合instanceof的检查规则,所以结果自然是true。

小贴士:现在更推荐用Object.setPrototypeOf()来设置对象的原型,__proto__虽然能用,但属于早期的非标准语法(后来被纳入标准但不推荐作为首选)。

内容的提问来源于stack exchange,提问作者soarinblue

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:33:25