一:ES6 的数据结构总共有多少种?具体有哪些
总的来说截止到 ES6,总共有 8
种数据解构: 7 种原始数据解构 + 1 种复杂数据解构
7 种原始数据解构:
Boolean
Null
Undefined
Number
BigInt
String
Symbol
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);//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。
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]"