關於js中的一些型別確定,盡量使用object.prototype.tostring.call(obj) 去判定型別,使用typeof會有一些缺陷。
typeof
不能準確判斷乙個物件變數null
的結果也是 object,array
的結果也是 object
1object.prototype.tostring.call(undefined)
2 "[object undefined]"
3object.prototype.tostring.call(nan)
4 "[object number]"
5 object.prototype.tostring.call('')
6 "[object string]"
7object.prototype.tostring.call()
8 "[object array]"
9 object.prototype.tostring.call(null
)10 "[object null]"
11typeof
(undefined)
12 "undefined"
13typeof(null
)14 "object"
15typeof
()16 "object"
17typeof('')
18 "string"
19typeof
(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)相同的結果。
js型別判斷
typeoftypeof 返回值有七種可能 number,string,boolean,object,function,undefined,symbol 侷限性 對於array,null等特殊物件使用typeof一律返回object。numbers typeof 37 number typeof m...
js型別判斷
js型別判斷,有如下三種 1 typeof 2 instanceof 3 object.prototype.tostring.call 4 arg.proto contructor.name 以判斷陣列為例,有如下幾種方法 function isarray arg return arg instan...
判斷JS型別
一 js的型別 js的基本型別共有七種 bigint bigint是一種內建物件,是處symbol外的第二個內建型別 number string boolen symbol undefined null。複雜資料型別有物件 object 包括基本的物件 函式 function 陣列 array 和內...