源碼中有這樣一段:數組
class2type = {},
toString = class2type.toString,
function type(obj) {
//obj爲null或者undefined時,直接返回'null'或'undefined'
return obj == null ? String(obj) : class2type[toString.call(obj)] || "object"
}
// Populate the class2type map
//填充class2type的值
$.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function (i, name) {
class2type["[object " + name + "]"] = name.toLowerCase()
})
--------------------------------------------------------------------------------------------------------緩存
在 JavaScript 裏使用 typeof 來判斷數據類型,只能區分基本類型,即 「number」,」string」,」undefined」,」boolean」,」object」 五種。對於數組、對象來講,其關係錯綜複雜,使用 typeof 都會統一返回 「object」 字符串。函數
要想區別對象、數組單純使用 typeof 是不行的。或者你會想到 instanceof 方法,例以下面這樣:this
-
-
-
-
-
-
console.log(a instanceof Object) //true
-
console.log(b instanceof Object) //true
-
console.log(c instanceof Object) //true
-
-
//只有 Array 類型的 b 纔是 Array 的實例
-
console.log(a instanceof Array) //false
-
console.log(b instanceof Array) //true
-
console.log(c instanceof Array) //false
-
-
//只有 Function 類型的 c 纔是 Function 的實例
-
console.log(a instanceof Function) //false
-
console.log(b instanceof Function) //false
-
console.log(c instanceof Function) //true
從以上代碼來看,要判斷複合數據類型,能夠以下判斷:spa
-
-
(a
instanceof Object) && !(a instanceof Function) && !(a instanceof Function)
-
-
(a
instanceof Object) && (a instanceof Array)
-
-
(a
instanceof Object) && (a instanceof Function)
更簡便的方式,便是使用 Object.prototype.toString.call() 來肯定類型,ECMA 5.1 中關於該方法的描述[1]是這樣的:prototype
-
When the toString method is called, the following steps are taken:
-
If the this value is undefined, return 「[object Undefined]」.
-
If the this value is null, return 「[object Null]」.
-
Let O be the result of calling ToObject passing the this value as the argument.
-
Let class be the value of the [[Class]] internal property of O.
-
Return the String value that is the result of concatenating the three Strings 「[object 「, class, and 「]」.
因爲 JavaScript 中一切都是對象,任何都不例外,對全部值類型應用 Object.prototype.toString.call() 方法結果以下:code
-
console.log(Object.prototype.toString.call(123)) //[object Number]
-
console.log(Object.prototype.toString.call('123')) //[object String]
-
console.log(Object.prototype.toString.call(undefined)) //[object Undefined]
-
console.log(Object.prototype.toString.call(true)) //[object Boolean]
-
console.log(Object.prototype.toString.call({})) //[object Object]
-
console.log(Object.prototype.toString.call([])) //[object Array]
-
console.log(Object.prototype.toString.call(function(){})) //[object Function]
全部類型都會獲得不一樣的字符串,幾乎完美。對象
思考:使用return obj == null ? String(obj) : class2type[obj.toString()] || "object" 也是能夠的,做者是先將Object的tostring賦值給toString,three
用意應該是緩存變量, 便於壓縮代碼,
同時可減小在原型鏈中的查找次數(提升代碼效率)