MDN描述:instanceof
运算符用于检测构造函数的 prototype
属性是否出现在某个实例对象的原型链上。
即检测构造函数的原型是否存在于参数的原型链上。
例如:
var o = new C()
o instanceof C // true
因为 Object.getPrototypeOf(o) === C.prototype //true
但是我使用字面量格式缺出现了问题
let a =123
a instanceof Number // false
Object.getPrototypeOf(a) === Number.prototype //true
能解释下为什么 a
不是一个 Number
构造函数的实例么?
let a =123
这里的 a 是基本类型,Number 是包装类型,比如 1.toString() 会将 1 转换为 new Number(1) 包装类型,然后调用这个对象 toString 的方法,这叫自动包装另外 js 不像 java 一样,java 面试题基本都会提到 基本类型 和 对应的包装类型 的区别,js 基本不谈及这个
基本数据类型 没有 原型,
instanceof
也不会触发自动包装,所以a instanceof Number === false
Object.getPrototypeOf(1)
内部触发自动包装,1 会转换成 new Number(1) ,所以得到Number.prototype
想要相等也很简单,触发它的自动包装就行