本文將講解我目前所知道的判斷JavaScript
數據類型的方法。JavaScript
數據類型一共有7
種:segmentfault
除了Object
以外的6
種屬於原始數據類型。有時,咱們還會細分Object
的類型,好比Array
,Function
,Date
,RegExp
等。數組
typeof
能夠用來區分除了Null
類型之外的原始數據類型,對象類型的能夠從普通對象裏面識別出函數:dom
typeof undefined // "undefined" typeof null // "object" typeof 1 // "number" typeof "1" // "string" typeof Symbol() // "symbol" typeof function() {} // "function" typeof {} // "object"
問題一:typeof
不能識別null
,如何識別null
?
答案:若是想要判斷是否爲null
,能夠直接使用===
全等運算符來判斷(或者使用下面的Object.prototype.toString
方法):函數
let a = null a === null // true
問題二:typeof
做用於未定義的變量,會報錯嗎?
答案:不會報錯,返回"undefined"
。prototype
typeof randomVariable // "undefined"
問題三:typeof Number(1)
的返回值是什麼?
答案:"number"
。注意Number
和String
做爲普通函數調用的時候,是把參數轉化爲相應的原始數據類型,也就是相似於作一個強制類型轉換的操做,而不是默認當作構造函數調用。注意和Array
區分,Array(...)
等價於new Array(...)
。code
typeof Number(1) // "number" typeof String("1") // "string" Array(1, 2, 3) // 等價於 new Array(1, 2, 3)
問題四:typeof new Number(1)
的返回值是什麼?
答案:"object"
。對象
typeof new Number(1) // "object" typeof new String(1) // "object"
instanceof
不能用於判斷原始數據類型的數據:ip
3 instanceof Number // false '3' instanceof String // false true instanceof Boolean // false
instanceof
能夠用來判斷對象的類型:字符串
var date = new Date() date instanceof Date // true var number = new Number() number instanceof Number // true var string = new String() string instanceof String // true
須要注意的是,instanceof
的結果並不必定是可靠的,由於在ECMAScript7
規範中能夠經過自定義Symbol.hasInstance
方法來覆蓋默認行爲。詳情參見ECMAScript7規範中的instanceof操做符。get
Object.prototype.toString.call(undefined).slice(8, -1) // "Undefined" Object.prototype.toString.call(null).slice(8, -1) // "Null" Object.prototype.toString.call(3).slice(8, -1) // "Number" Object.prototype.toString.call(new Number(3)).slice(8, -1) // "Number" Object.prototype.toString.call(true).slice(8, -1) // "Boolean" Object.prototype.toString.call('3').slice(8, -1) // "String" Object.prototype.toString.call(Symbol()).slice(8, -1) // "Symbol"
由上面的示例可知,該方法沒有辦法區分數字類型和數字對象類型,同理還有字符串類型和字符串對象類型、布爾類型和布爾對象類型。
另外,ECMAScript7
規範定義了符號Symbol.toStringTag
,你能夠經過這個符號自定義Object.prototype.toString
方法的行爲:
'use strict' var number = new Number(3) number[Symbol.toStringTag] = 'Custom' Object.prototype.toString.call(number).slice(8, -1) // "Custom" function a () {} a[Symbol.toStringTag] = 'Custom' Object.prototype.toString.call(a).slice(8, -1) // "Custom" var array = [] array[Symbol.toStringTag] = 'Custom' Object.prototype.toString.call(array).slice(8, -1) // "Custom"
由於Object.prototype.toString
方法能夠經過Symbol.toStringTag
屬性來覆蓋默認行爲,因此使用這個方法來判斷數據類型也不必定是可靠的。
Array.isArray(value)
能夠用來判斷value
是不是數組:
Array.isArray([]) // true Array.isArray({}) // false (function () {console.log(Array.isArray(arguments))}()) // false
本文講解了我目前所知道的判斷JavaScript
數據類型的方法,但願你們能有所收穫。若是本文有什麼錯誤或者不嚴謹的地方,歡迎在評論區留言。