js類型檢測的幾種方式盤點

開始以前,必需要知道js中關於類型的定義。js中有6種基本類型,null,undefined,boolean,string,number,symbol(es6新增的類型)。還有一種引用類型(複雜類型)是object。像是{},function函數,[]數組都是對象。es6

首先,先定義幾種object類型數組

var obj = {};
  function fun(){};
  var arr = [];

1.typeof

console.log(typeof null);  //object
    console.log(typeof fun);  //function
    console.log(typeof obj);  //object
    console.log(typeof arr);  //object
    console.log(typeof "abc");  //string
    console.log(typeof 23);  //number
    console.log(typeof false);  //boolean

返回值類型:string
總結:通常只用來檢測基本數據類型。function能正確返回,像是數組和對象都只會返回object。null做爲基本類型也返回object,由於null在js中的定義就是用來表示一個空對象指針。app

2.instanceof

console.log("string" instanceof String);  //false
    console.log(23 instanceof Number);  //false
    console.log(false instanceof Boolean);  //false
    console.log(null instanceof Object);  //false
    console.log(obj instanceof Object);  //true
    console.log(fun instanceof Object);  //true
    console.log(fun instanceof Function);  //true
    console.log(obj instanceof Function);  //false
    console.log(arr instanceof Object);  //true
    console.log(arr instanceof Array);  //true

返回值類型:boolean
總結:通常用來檢測object,沒法正確檢測基本數據類型。可是注意,由於function和array都是object類型。除了相對應的Function和Array會返回true之外,instanceof Object也會返回true。函數

3.constructor

console.log(obj.constructor == Object);  //true
    console.log(arr.constructor == Object);  //false
    console.log(arr.constructor == Array);  //true
    console.log(arr.constructor === Array);  //true
    console.log(fun.constructor == Object);  //false
    console.log(fun.constructor == Function);  //true
    console.log(fun.constructor === Function);  //true
    console.log("fun".constructor == String);  //true
    console.log(false.constructor == Boolean);  //true

返回值類型:boolean
總結:constructor(構造函數)檢測,這是我以爲最好的檢測方式了。能正確判斷是那種基本類型和那種object類型。並且經過constructor和prototype(原型)在有些時候能用來判斷兩個對象是否相等。prototype

4.Object.prototype.toString.call()

console.log(Object.prototype.toString.call("rerqw"));  //[object String]
    console.log(Object.prototype.toString.call(16));  //[object Number]
    console.log(Object.prototype.toString.call(false));  // [object Boolean]
    console.log(Object.prototype.toString.call(null));  //[object Null]
    console.log(Object.prototype.toString.call(undefined));  //[object Undefined]
    console.log(Object.prototype.toString.call(fun));  //[object Function]
    console.log(Object.prototype.toString.call(arr));  //[object Array]
    console.log(Object.prototype.toString.call(obj));  //[object Object]

返回值類型:string
總結:這也是比較好的返回方式了。雖然返回的樣式怪怪的。可是能正確返回基本類型和各類object類型。指針

5.Object.prototype.toString.apply()

用法和上面Object.prototype.toString.call()同樣,就是call換成apply。返回結果也同樣。
至於爲何call和apply實現效果同樣。又是另外一個更復雜的問題,改天我會寫一篇文章,詳細分析apply(),call(),bind()三種方法。會回來貼上地址的。code

相關文章
相關標籤/搜索