如何判斷JavaScript的資料型別?
JavaScript
資料型別
本文將講解我目前所知道的判斷JavaScript
資料型別的方法。
JavaScript
資料型別一共有7
種:
- Undefined
- Null
- Boolean
- String
- Symbol
- Number
- Object
除了Object
之外的6
種屬於原始資料型別。有時,我們還會細分Object
的型別,比如Array
,Function
,Date
,RegExp
等。
判斷JavaScript
資料型別:
typeof
1 typeof undefined // "undefined" 2 typeof null // "object" 3 typeof 1 // "number" 4 typeof"1" // "string" 5 typeof Symbol() // "symbol" 6 typeof function() {} // "function" 7 typeof {} // "object"
問題一:typeof
不能識別null
,如何識別null
?答案:如果想要判斷是否為null
,可以直接使用===
全等運算子來判斷(或者使用下面的Object.prototype.toString
方法):
1 let a = null 2 a === null // true
問題二:typeof
作用於未定義的變數,會報錯嗎?答案:不會報錯,返回"undefined"。
1 typeof randomVariable //"undefined"
問題三:typeof Number(1)
的返回值是什麼?答案:"number"
。注意Number
和String
作為普通函式呼叫的時候,是把引數轉化為相應的原始資料型別,也就是類似於做一個強制型別轉換的操作,而不是預設當做建構函式呼叫。注意和Array
區分,Array(...)
等價於new Array(...)
。
1 typeof Number(1) // "number" 2 typeof String("1") // "string" 3 4 Array(1, 2, 3) 5 // 等價於 6 new Array(1, 2, 3)
問題四:typeof new Number(1)
"object"
。
1 typeof new Number(1) // "object" 2 typeof new String(1) // "object"
instanceof
instanceof
不能用於判斷原始資料型別的資料:
3 instanceof Number // false '3' instanceof String // false true instanceof Boolean // false
instanceof
可以用來判斷物件的型別:
1 var date = new Date() 2 date instanceof Date // true 3 4 var number = new Number() 5 number instanceof Number // true 6 7 var string = new String() 8 string instanceof String // true
需要注意的是,instanceof
的結果並不一定是可靠的,因為在ECMAScript7
規範中可以通過自定義Symbol.hasInstance
方法來覆蓋預設行為。詳情參見ECMAScript7規範中的instanceof操作符。
Object.prototype.toString
1 Object.prototype.toString.call(undefined).slice(8, -1) // "Undefined" 2 Object.prototype.toString.call(null).slice(8, -1) // "Null" 3 4 Object.prototype.toString.call(3).slice(8, -1) // "Number" 5 Object.prototype.toString.call(new Number(3)).slice(8, -1) // "Number" 6 7 Object.prototype.toString.call(true).slice(8, -1) // "Boolean" 8 Object.prototype.toString.call('3').slice(8, -1) // "String" 9 Object.prototype.toString.call(Symbol()).slice(8, -1) // "Symbol"
由上面的示例可知,該方法沒有辦法區分數字型別和數字物件型別,同理還有字串型別和字串物件型別、布林型別和布林物件型別。
另外,ECMAScript7
規範定義了符號Symbol.toStringTag
,你可以通過這個符號自定義Object.prototype.toString
方法的行為:
1 'use strict' 2 var number = new Number(3) 3 number[Symbol.toStringTag] = 'Custom' 4 Object.prototype.toString.call(number).slice(8, -1) // "Custom" 5 6 function a () {} 7 a[Symbol.toStringTag] = 'Custom' 8 Object.prototype.toString.call(a).slice(8, -1) // "Custom" 9 10 var array = [] 11 array[Symbol.toStringTag] = 'Custom' 12 Object.prototype.toString.call(array).slice(8, -1) // "Custom"
因為Object.prototype.toString
方法可以通過Symbol.toStringTag
屬性來覆蓋預設行為,所以使用這個方法來判斷資料型別也不一定是可靠的。
Array.isArray
Array.isArray(value)
可以用來判斷value
是否是陣列:
Array.isArray([]) // true Array.isArray({}) // false (function () {console.log(Array.isArray(arguments))}()) // false
總結
本文講解了我目前所知道的判斷JavaScript
資料型別的方法,希望大家能有所收穫。