JS判斷變量類型


目前接觸到的共有四種方法:

1、typeof,

typeof對大多數的類型判斷都是正確的,返回的都是小寫的字符串類型,但是無法區分數組,null,和真正的Object,它的判斷都是"object"。

2、Object.prototype.toString.call(),

Object.prototype.toString.call()的方法,各種類型都合適,判斷准確,也是我准備長期使用的一種方法,返回的結果如[Object Array],據我所知,jQuery的內部工具、vue的內部工具,mock的內部工具,都是采用的這種方法。

jQuery實現方法,采用對象方式存儲,

初始化變量class2type={},

// Populate the class2type map
jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) {
  class2type[ "[object " + name + "]" ] = name.toLowerCase();
});
然后類型判斷方法:
type: function( obj ) {
    if ( obj == null ) {
      return String( obj );
    }
    return typeof obj === "object" || typeof obj === "function" ?
      class2type[ core_toString.call(obj) ] || "object" :   // 返回對象中有的結果
      typeof obj;   // 返回typeof本身可以判斷的。
  }
 
Vue內部判斷方法,簡單粗暴:
var _toString = Object.prototype.toString;
function toRawType (value) {
  return _toString.call(value).slice(8, -1)  // 直接從第八位返回到倒數第二位
}
 
Mock的內部工具方法, 使用正則:
Util.type = function type(obj) {
return (obj === null || obj === undefined) ? String(obj) : Object.prototype.toString.call(obj).match(/\[object (\w+)\]/)[1].toLowerCase()
}

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 

很是推薦第二種,最全。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM