1. 程式人生 > >如何判斷JavaScript的資料型別?

如何判斷JavaScript的資料型別?

JavaScript資料型別

本文將講解我目前所知道的判斷JavaScript資料型別的方法。

JavaScript資料型別一共有7種:

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

除了Object之外的6種屬於原始資料型別。有時,我們還會細分Object的型別,比如ArrayFunctionDateRegExp等。

判斷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"。注意NumberString作為普通函式呼叫的時候,是把引數轉化為相應的原始資料型別,也就是類似於做一個強制型別轉換的操作,而不是預設當做建構函式呼叫。注意和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資料型別的方法,希望大家能有所收穫。