方式一:通过constructor
通过constructor可以直接找到元素的构造函数类型,这种方法能够区分引用数据类型到底是哪种类型,请看下面的例子。
const arr = [1,2,3,5];
const date = new Date();
const num = 666;
const map = new Map();
const set = new Set();
const reg = new RegExp();
const str = '111';
const sym = Symbol(66);
const func = function(){}
console.log(arr.constructor === Array);
console.log(date.constructor === Date);
console.log(num.constructor === Number);
console.log(map.constructor === Map);
console.log(set.constructor === Set);
console.log(reg.constructor === RegExp);
console.log(str.constructor === String);
console.log(sym.constructor === Symbol);
console.log(func.constructor === Function);
需要特别注意的是null和undefined没有constructor属性。
方式二:使用instanceof来判断引用类型到底属于哪种类型
const arr = [1,2,3,5];
const date = new Date();
const map = new Map();
const set = new Set();
const reg = new RegExp();
const func = function(){}
console.log(arr instanceof Array);
console.log(date instanceof Date);
console.log(map instanceof Map);
console.log(set instanceof Set);
console.log(reg instanceof RegExp);
console.log(func instanceof Function);
需要特别注意的是:instanceof 不适用于判断基本类型。
方式三:使用typeof来判断基本数据类型
需要注意的是typeof能够帮助我们判断出基本数据类型和函数,但是引用数据类型一般是object。
const arr = [1,2,3,5];
const date = new Date();
const num = Number(666);
const map = new Map();
const set = new Set();
const reg = new RegExp();
const str = '111';
const sym = Symbol(66);
const func = function(){}
console.log(typeof arr);
console.log(typeof date);
console.log(typeof num);
console.log(typeof map);
console.log(typeof set);
console.log(typeof reg);
console.log(typeof str);
console.log(typeof sym);
console.log(typeof func);
方式四:通过Object.prototype.toString.call()精准确定类型(强烈推荐)
需要注意的是这个方法输出的是一个字符串,这个字符串object是小写的,后面的是大写的。
const arr = [1,2,3,5];
const date = new Date();
const num = Number(666);
const map = new Map();
const set = new Set();
const reg = new RegExp();
const str = '111';
const sym = Symbol(66);
const func = function(){}
console.log(Object.prototype.toString.call(arr));
console.log(Object.prototype.toString.call(date));
console.log(Object.prototype.toString.call(num));
console.log(Object.prototype.toString.call(map));
console.log(Object.prototype.toString.call(set));
console.log(Object.prototype.toString.call(reg));
console.log(Object.prototype.toString.call(str));
console.log(Object.prototype.toString.call(sym));
console.log(Object.prototype.toString.call(func));
问题汇总
RQ1:如何判断一个对象是一个空对象?
- 通过Reflect.ownKeys的长度为零。Reflect.ownKys()可以返回一个由目标对象自身的属性组成的数组。
const obj = {};
console.log(Reflect.ownKeys(obj).length === 0);
- 通过JSON.stringify()
const obj = {};
console.log(JSON.stringify(obj) === '{}');
RQ2:有什么方法可以获取对象的key?
- 使用Object.keys()
- 使用Reflect.ownKeys()
RQ3:对象的中括号运算符和点运算符有什么区别?
中括号中可以用变量,但是点后面不能是一个变量。
const obj = {};
obj.name = '111';
const myName = 'name'
console.log(obj.myName);
console.log(obj[myName]);
|