面試題中常常會考 js 數據類型檢測,今天我來分享一下 js 中經常使用的幾種方法來判斷數據類型,歡迎指點更正。 廢話很少說,直入正題。前端
數據類型分爲如下兩種 :面試
一、基本數據類型數組
String、 Number、 Boolean、 Symbol、 Undefined、 Null
學習
二、引用數據類型prototype
Object、 Function、 Array、 Date...
指針
基本類型也稱爲簡單類型,指的是不一樣變量會分配不一樣的存儲空間,爲了便於提高變量查詢速度,將其存儲在棧中。code
引用類型也稱爲複合類型,因爲其值的大小會改變,將值存儲在堆中。對象
怎麼檢測數據類型呢 ?原型鏈
1、typeof 檢測數據類型的運算符原型
console.log(typeof ''); //string
console.log(typeof 1); //number
console.log(typeof Symbol()); //symbol
console.log(typeof true); //boolean
console.log(typeof new Function()); //function
console.log(typeof undefined); //undefined
console.log(typeof {}); //object
console.log(typeof null); //object 無效
console.log(typeof []); //object 無效
console.log(typeof new Date()); //object 無效
console.log(typeof new RegExp()); //object 無效
經過以上輸出結果,能夠看到 :
對於基本類型,除 null 之外,都可以返回正確的結果。
對於引用類型,除 function 之外,一概返回 object 類型。
對於 null ,返回 object 類型。
對於 function 返回 function 類型。
侷限性 :
一、由於 null 值表示一個空對象指針,因此這也正是使用 typeof 操做符檢測 null 值時會返回 "object" 的緣由,其實 null 的數據類型是 Null ;
一、引用類型中的 數組、日期、正則 也都有屬於本身的具體類型 ; 而 typeof 對於這些類型的處理,只返回了處於其原型鏈最頂端的 Object 類型。
2、instanceof 檢測某一個實例是否屬於某個類
主要用來彌補 typeof 不能檢測具體屬於哪一個對象的侷限性。
console.log("1" instanceof String); //false
console.log(1 instanceof Number); //false
console.log(true instanceof Boolean); //false
console.log(null instanceof Object); //false
console.log(undefined instanceof Object); //false
console.log([] instanceof Array); //true
console.log(function(){} instanceof Function); //true
console.log({} instanceof Object); //true
侷限性:
一、不能用於檢測和處理字面量方式建立出來的基本數據類型值,即基本數據類型。
二、instanceof的特性:只要在當前實例的原型鏈上的對象,咱們用其檢測出來都爲true。
3、Object.prototype.toString.call() 原型鏈上的Object對象的toString方法
返回值的類型爲string類型,是最全面也是最經常使用的檢測數據類型的方式。
Object.prototype.toString.call('') ; // [object String]
Object.prototype.toString.call(1) ; // [object Number]
Object.prototype.toString.call(true) ; // [object Boolean]
Object.prototype.toString.call(Symbol()) ; //[object Symbol]
Object.prototype.toString.call(undefined) ; // [object Undefined]
Object.prototype.toString.call(null) ; // [object Null]
Object.prototype.toString.call(new Function()) ; // [object Function]
Object.prototype.toString.call(new Date()) ; // [object Date]
Object.prototype.toString.call([]) ; // [object Array]
Object.prototype.toString.call(new RegExp()) ; // [object RegExp]
Object.prototype.toString.call(new Error()) ; // [object Error]
好了,今天就說到這裏,歡迎關注個人博客,一塊兒交流學習前端知識。
前端發展速度之快,只有不斷的學習積累,才能緊跟時代的步伐。