開始以前,必需要知道js中關於類型的定義。js中有6種基本類型,null,undefined,boolean,string,number,symbol(es6新增的類型)。還有一種引用類型(複雜類型)是object。像是{},function函數,[]數組都是對象。es6
首先,先定義幾種object類型數組
var obj = {}; function fun(){}; var arr = [];
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
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。函數
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
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類型。指針
用法和上面Object.prototype.toString.call()同樣,就是call換成apply。返回結果也同樣。
至於爲何call和apply實現效果同樣。又是另外一個更復雜的問題,改天我會寫一篇文章,詳細分析apply(),call(),bind()三種方法。會回來貼上地址的。code