为何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
相关产品推荐
相关产品推荐

