目前接觸到的共有四種方法:
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
很是推薦第二種,最全。
