instanceof 为什么无法判断字面量?

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 构造函数的实例么?

阅读 1.9k
2 个回答

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

想要相等也很简单,触发它的自动包装就行

function test() {
    "use strict";
    return this
}
test.apply(123) instanceof Number === true
let a = new Number(123);
console.log(a instanceof Number);  // true
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题