js instanceof判断问题

问题描述

类型判断

问题出现的环境背景及自己尝试过哪些方法

类型判断

相关代码

a = true
b = new Boolean(true)
b instanceof Boolean // true
a.constructor === b.constructor // true

why?
a instanceof Boolean ? false

你期待的结果是什么?实际看到的错误信息又是什么?

是否能分析a = true和 new Boolean(true)区别, instanceof判断原理

阅读 5.2k
3 个回答
  • 在控制台输入 typeof a 你会发现他是一个'boolean' 而不是一个Boolean
  • 然后再输入 typeof b 你会发现输出的是一个'object' js中Boolean只是一个对象
  • instanceof 判断的是 左边的对象的原型对象是否是右边的构造函数的同级prototype. 当判断a instanceof Boolean的时候,js底层会把a转换成具有属性的对象,其实在底层来说他们是一样的,但是他又不是new 出来的 所以 instanceof 返回的是false
  • 试想一下 你自定义了一个类 在你没通过new调用的时候 用其他的方式产生了一个属于该类的实例,程序是不是变得有点不可预测了?
  • 以上仅个人愚见,并非权威解答,大神见了莫喷,大家可以互相交流学习.

首先解释下instanceof,
instanceof 运算符用来检测 constructor.prototype 是否存在于参数 object 的原型链上。

A instanceof B // 检测构造函数B的原型是否有出现在对象A的原型链上。
所以你通过这种声明方式创建的简单数据类型:a = true是没办法用instanceof的。因为它不是一个对象实例。

对于 a.constructor === b.constructor // true
在a.constructor其实js内部做了一个自动装箱的操作。不然简单数据类型本身是不含属性和方法的。
回想一下我们是不是经常会写这样的代码 var a = '123'; if (a.length > 0) ...

关于js里的类型判断可以看下我的总结 https://segmentfault.com/a/11...

a = true
b = new Boolean(true)
b instanceof Boolean   //true  因为b是Boolean对象的实例,b是对象,a不是对象;

instanceof运算符只能用于对象,不能用于原始类型的值
其次之所以a有constructor,是因为console.log(new Boolean(a).constructor);

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题