使用 Javascript 的軟體專案
JavaScript資料型別一共有7種:
- Undefined
- Null
- Boolean
- String
- Symbol
- Number
- Object
除了Object之外的6種屬於原始資料型別。有時,我們還會細分Object的型別,比如Array,Function,Date,RegExp等。
typeof
typeof可以用來區分除了Null型別以外的原始資料型別,物件型別的可以從普通物件裡面識別出函式:
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方法):
本次給大家推薦一個免費的學習群,裡面概括移動應用網站開發,css,html,webpack,vue node angular以及面試資源等。
對web開發技術感興趣的同學,歡迎加入Q群:864305860,不管你是小白還是大牛我都歡迎,還有大牛整理的一套高效率學習路線和教程與您免費分享,同時每天更新視訊資料。
最後,祝大家早日學有所成,拿到滿意offer,快速升職加薪,走上人生巔峰。
let a = null
a === null // true
複製程式碼
問題二:typeof作用於未定義的變數,會報錯嗎?
答案:不會報錯,返回"undefined"。
typeof randomVariable // "undefined"
複製程式碼
問題三:typeof Number(1)的返回值是什麼?
答案:"number"。注意Number和String作為普通函式呼叫的時候,是把引數轉化為相應的原始資料型別,也就是類似於做一個強制型別轉換的操作,而不是預設當做建構函式呼叫。注意和Array區分,Array(...)等價於new Array(...)。
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不能用於判斷原始資料型別的資料:
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操作符。
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資料型別的方法,希望大家能有所收穫。如果本文有什麼錯誤或者不嚴謹的地方,歡迎在評論區留言。