instanceof 检查对象原型链是否包含构造函数的 prototype 对象,基于引用相等向上查找 [[Prototype]],不依赖 constructor 属性;原始值返回 false,null 无原型链,undefined 右侧非函数则报错;可由 Symbol.hasInstance 自定义行为。

instanceof 检查的是对象的原型链上是否包含构造函数的 prototype 对象。
它不检查构造函数本身,也不检查对象的 constructor 属性
很多人误以为 instanceof 是看 obj.constructor === Ctor,其实不是。constructor 可以被随意修改,完全不可靠。instanceof 的判断依据只有一条:沿着 obj 的 __proto__(即内部 [[Prototype]])一路向上查找,看能不能找到 Ctor.prototype 这个对象。
如果找到了,返回 true 如果查到原型链尽头(null)都没找到,返回 false 要求右边必须是函数(否则抛错),左边可以是任意值(非对象会直接返回 false)
原型链查找是基于引用相等,不是值相等
instanceof 不关心 Ctor.prototype 上有什么属性或方法,只关心“是不是同一个对象”。哪怕两个函数有完全一样的 prototype 内容,只要不是同一个对象实例,就不会匹配。
例如:
立即学习“Java免费学习笔记(深入)”;
function A() {}function B() {}B.prototype = Object.create(A.prototype); // 继承 Aconst b = new B();console.log(b instanceof A); // true —— 因为 B.prototype.__proto__ === A.prototypeconsole.log(b instanceof B); // true —— 因为 b.__proto__ === B.prototype
注意 null、undefined 和原始值的行为
原始值(如字符串、数字、布尔)用 instanceof 总是返回 false,因为它们不是对象,没有原型链:
"hello" instanceof String → false new String("hello") instanceof String → true null instanceof Object → false(null 没有原型链) undefined instanceof Object → 报错(右侧必须是函数)
ES6 之后可自定义 Symbol.hasInstance
如果构造函数上定义了静态方法 [Symbol.hasInstance](obj),instanceof 就会调用它,而不是走默认原型链查找。这是少数能覆盖默认行为的方式。
class MyArray { static [Symbol.hasInstance](obj) { return Array.isArray(obj) || (obj && typeof obj.length === 'number'); }}console.log([1,2] instanceof MyArray); // trueconsole.log({length: 5} instanceof MyArray); // true
基本上就这些。instanceof 的核心就是原型链上的引用查找,简单但容易忽略细节。
以上就是JavaScript instanceof如何工作_它检查什么?的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1542290.html
微信扫一扫
支付宝扫一扫