如何判斷JavaScript的數據類型?

本文將講解我目前所知道的判斷JavaScript數據類型的方法。
JavaScript數據類型一共有7種:segmentfault

  • Undefined
  • Null
  • Boolean
  • String
  • Symbol
  • Number
  • Object

除了Object以外的6種屬於原始數據類型。有時,咱們還會細分Object的類型,好比ArrayFunctionDateRegExp等。數組

typeof

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"。注意NumberString做爲普通函數調用的時候,是把參數轉化爲相應的原始數據類型,也就是相似於作一個強制類型轉換的操做,而不是默認當作構造函數調用。注意和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

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

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

Array.isArray(value)能夠用來判斷value是不是數組:

Array.isArray([]) // true
Array.isArray({}) // false
(function () {console.log(Array.isArray(arguments))}()) // false

總結

本文講解了我目前所知道的判斷JavaScript數據類型的方法,但願你們能有所收穫。若是本文有什麼錯誤或者不嚴謹的地方,歡迎在評論區留言。

相關文章
相關標籤/搜索