一:ES6的数据结构总共有多少种?具体有哪些
总的来说截止到ES6,总共有8种数据解构:7种原始数据解构 + 1种复杂数据解构
7种原始数据解构:

BooleanNullUndefinedNumberBigIntStringSymbol 

1种复杂数据解构:

Object

二:如何判断一个数据的类型
判断一个变量的数据类型有多种方法,但是有些方法并不适用于任何数据类型。

1: typeof
typeof可以用来判断所有的基本数据类型,返回值为一个字符串,其值为类型名字的小写形式。

//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返回值,可能值得我们特殊关注一下:

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);//trueconsole.log(apple instanceof Apple);//trueconsole.log(apple instanceof Function);//falseconsole.log([] instanceof Array);//trueconsole.log([] instanceof Object);//trueconsole.log(new Map() instanceof Map);//trueconsole.log(new Map() instanceof Object);//trueconsole.log({} instanceof Object);//true

这里要特别注意的是,Array,Set, Map它们有自己的构造器,但是Object是根构造器,所以对它们使用instanceOf Object, 当然也是返回true。

3: constructor

语法:o.constructor

constructor返回一个对象的构造函数,而不是一个字符串。概念上好像与instanceOf差不多,但是实际操作之后,结果却不一样,我们先来看一下代码:

let fun = new Function();function Apple() {}let apple = new Apple();console.log(fun.constructor === Function);//trueconsole.log(apple.constructor === Apple);//trueconsole.log(apple.constructor === Function);//falseconsole.log([].constructor === Array);//trueconsole.log([].constructor === Object);//falseconsole.log(new Map().constructor === Map);//trueconsole.log(new Map().constructor === Object);//falseconsole.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]"