關於JS中的一些類型確定,盡量使用Object.prototype.toString.call(obj) 去判定類型,使用Typeof會有一些缺陷。
typeof
不能准確判斷一個對象變量null
的結果也是 object,Array
的結果也是 object
1 Object.prototype.toString.call(undefined) 2 "[object Undefined]" 3 Object.prototype.toString.call(NaN) 4 "[object Number]" 5 Object.prototype.toString.call('') 6 "[object String]" 7 Object.prototype.toString.call([]) 8 "[object Array]" 9 Object.prototype.toString.call(null) 10 "[object Null]" 11 typeof(undefined) 12 "undefined" 13 typeof(null) 14 "object" 15 typeof([]) 16 "object" 17 typeof('') 18 "string" 19 typeof(NaN) 20 "number"
同樣是檢測對象obj調用toString方法(,obj.toString()的結果和Object.prototype.toString.call(obj)的結果不一樣,這是為什么?
這是因為toString為Object的原型方法,而Array
,function等類型作為Object的實例,都重寫了toString方法。不同的對象類型調用toString方法時,根據原型鏈的知識,調用的是對應的重寫之后的toString方法(function類型返回內容為函數體的字符串,Array類型返回元素組成的字符串.....),而不會去調用Object上原型toString方法(返回對象的具體類型),所以采用obj.toString()不能得到其對象類型,只能將obj轉換為字符串類型;因此,在想要得到對象的具體類型時,應該調用Object上原型toString方法。
var arr=[1,2,3]; console.log(Array.prototype.hasOwnProperty("toString"));//true console.log(arr.toString());//1,2,3 delete Array.prototype.toString;//delete操作符可以刪除實例屬性 console.log(Array.prototype.hasOwnProperty("toString"));//false console.log(arr.toString());//"[object Array]"
刪除了Array的toString方法后,同樣再采用arr.toString()方法調用時,不再有屏蔽Object原型方法的實例方法,因此沿着原型鏈,arr最后調用了Object的toString方法,返回了和Object.prototype.toString.call(arr)相同的結果。