JS類型判斷


關於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)相同的結果。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM