關於JS中的一些類型肯定,儘可能使用Object.prototype.toString.call(obj) 去斷定類型,使用Typeof會有一些缺陷。函數
typeof
不能準確判斷一個對象變量null
的結果也是 object,Array
的結果也是 objectspa
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)的結果不同,這是爲何?prototype
這是由於toString爲Object的原型方法,而Array
,function等類型做爲Object的實例,都重寫了toString方法。不一樣的對象類型調用toString方法時,根據原型鏈的知識,調用的是對應的重寫以後的toString方法(function類型返回內容爲函數體的字符串,Array類型返回元素組成的字符串.....),而不會去調用Object上原型toString方法(返回對象的具體類型),因此採用obj.toString()不能獲得其對象類型,只能將obj轉換爲字符串類型;所以,在想要獲得對象的具體類型時,應該調用Object上原型toString方法。code
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)相同的結果。對象