JavaScript數據類型以及如何判斷

一:ES6的數據結構總共有多少種?具體有哪些
總的來講截止到ES6,總共有8種數據解構:7種原始數據解構 + 1種複雜數據解構
7種原始數據解構:數據結構

Boolean
Null
Undefined
Number
BigInt
String
Symbol

1種複雜數據解構:app

Object

二:如何判斷一個數據的類型
判斷一個變量的數據類型有多種方法,可是有些方法並不適用於任何數據類型。函數

1: typeof
typeof能夠用來判斷全部的基本數據類型,返回值爲一個字符串,其值爲類型名字的小寫形式。prototype

//6種原始數據類型
console.log(typeof 'a');//"string"
console.log(typeof 1);//"number"
console.log(typeof true);//"boolean"
console.log(typeof Symbol());//"symbol"
console.log(typeof undefined);//"undefined"
console.log(typeof null);//"object"
//對象類型
console.log(typeof {});//"object"
console.log(typeof []);//"object"
console.log(typeof new Map());//"object"
console.log(typeof new Set());//"object"
//function類型
console.log(typeof function () {});//"function"

從上面的代碼咱們能夠看到有三類數據的typeof返回值,可能值得咱們特殊關注一下:code

1: null 雖然是原始數據類型,可是typeof(null)獲得的是 'object'
2: Array,Set,Map類型的數據,typeof的結果都是'object'
3: function是JavaScript整個語言的核心,對一個function使用typeof,獲得'function'

2: instanceOf對象

語法:object instanceof constructor

instanceOf用於判斷一個對象是不是某個構造函數的實例,返回值爲true或者false。instanceOf與typeof的區別就在於,instanceOf只用在對象類型的數據上繼承

let fun = new Function();
function Apple() {}
let apple = new Apple();

console.log(fun instanceof Function);//true
console.log(apple instanceof Apple);//true
console.log(apple instanceof Function);//false

console.log([] instanceof Array);//true
console.log([] instanceof Object);//true

console.log(new Map() instanceof Map);//true
console.log(new Map() instanceof Object);//true

console.log({} instanceof Object);//true

這裏要特別注意的是,Array,Set, Map它們有本身的構造器,可是Object是根構造器,因此對它們使用instanceOf Object, 固然也是返回true。ip

3: constructor字符串

語法:o.constructor

constructor返回一個對象的構造函數,而不是一個字符串。概念上好像與instanceOf差很少,可是實際操做以後,結果卻不同,咱們先來看一下代碼:原型

let fun = new Function();
function Apple() {}
let apple = new Apple();

console.log(fun.constructor === Function);//true
console.log(apple.constructor === Apple);//true
console.log(apple.constructor === Function);//false

console.log([].constructor === Array);//true
console.log([].constructor === Object);//false

console.log(new Map().constructor === Map);//true
console.log(new Map().constructor === Object);//false

console.log({}.constructor === Object);//true

當咱們對Array,Map獲取constructor的時候,會獲得最具體的構造函數,因此它們的構造函數不等於Object。

4: prototype
prototype是原型對象,全部實例化的對象,都會繼承prototype對象上的屬性和方法。
全部的對象,例如{}都會繼承Object.prototype上的屬性和方法;Array,Set,Map也都是繼承自Object,因此咱們也能夠利用prototype來判斷對象的類型:

let fun = new Function();
function Apple() {}
let apple = new Apple();

console.log(Object.prototype.toString.call(fun)); //"[object Function]"
console.log(Object.prototype.toString.call(apple)); //"[object Object]"
console.log(Object.prototype.toString.call([]));//"[object Array]"
console.log(Object.prototype.toString.call(new Map()));//"[object Map]"
console.log(Object.prototype.toString.call({}));//"[object Object]"
相關文章
相關標籤/搜索