目前接触到的共有四种方法:
1、typeof,
typeof对大多数的类型判断都是正确的,返回的都是小写的字符串类型,但是无法区分数组,null,和真正的Object,它的判断都是"object"。
2、Object.prototype.toString.call(),
Object.prototype.toString.call()的方法,各种类型都合适,判断准确,也是我准备长期使用的一种方法,返回的结果如[Object Array],据我所知,jQuery的内部工具、vue的内部工具,mock的内部工具,都是采用的这种方法。
jQuery实现方法,采用对象方式存储,
初始化变量class2type={},
3、instanceof
MDN给出的解释是:instanceof
运算符用来检测 constructor.prototype
是否存在于参数 object
的原型链上。
instanceof右侧要求是对象,而不能是null或者undefined,否则会抛出异常。
2019.07.05看了《你不知道的JavaScript》原型链章节以后,发现此处理解有误。现更正如下:
instanceof 操作符的左操作数是一个普通的对象,右操作数是一个函数。a instanceof Foo 回答的问题是:在 a 的整条 [[Prototype]] 链中是否有指向 Foo.prototype 的对象。
测试了以下场景:
字符串:
var a = ''; a instanceof String // false
var a = new String(''); a instanceof String //true,
数字:
var a = 3; a instanceof Number // false
var a = new Number(3); a instanceof Number //true,
数组:
var a= [1,2,3]; a instanceof Array //true
var a = new Array(1,2,3); a instanceof Array //true
函数:
var a = function(){} a instanceof Fuction // true
var a = new Function(); a instanceof Function //true
// 对象
var a= {};a instanceof Object //true
// 正则
var a= /ppp/; a instanceof RegExp // true
// undefined,null的没法说了
总结:凡是简单字面量的像number,string的必须用new才识别,而复杂点的像数组,对象,函数,正则都可以直接用。但是原型链上的返回都是true,比如
var a = new String(''); a instanceof String // true, a instanceof Object肯定也是true.
这里给出了一篇深入底层的文章链接,该文章从底层彻底讲解了instanceof的问题关键所在:https://www.ibm.com/developerworks/cn/web/1306_jiangjj_jsinstanceof/index.html。
4、constructor.name
该方式大部分情况下都可以,弊端是undefined,或者null没有constructor。好像跟3有点像,3是表示constructor.prototype,首先得有constructor才能有constructor.prototype。
用法例:
var a = ''
a.constructor.name // 返回String
很是推荐第二种,最全。