查阅了很多文档,总结下自己的理解。
1、typeof
官方文档说明: typeof 操作符返回一个字符串,表示未经计算的操作数的类型。
typeof 之所以会判定Null类型为 Object 类型,是因为JavaScript 数据类型在底层都是以二进制的形式表示的,二进制的前三位为 0 会被 typeof 判断为对象类型,而 null 的二进制位恰好都是 0 ,因此,null 被误判断为 Object 类型。
示例:
let a = [24, 8],
b = 24,
c = 'Kobe',
d = function () {
console.log('Kobe Bryant')
},
e = true,
f = null,
g;
console.log(typeof (a)); //object
console.log(typeof (b)); //number
console.log(typeof (c)); //string
console.log(typeof (d)); //function
console.log(typeof (e)); //boolean
console.log(typeof (f)); //object
console.log(typeof (g)); //undefined
缺点:只能区分基本类型,即:number、string、undefined、boolean、function,不能区分object、null,array,会统一返回object,如:
const a = [24, 8],
f = null,
console.log(typeof (a)); //object
console.log(typeof (f)); //object
2、instanceof
官方文档说明:instanceof 运算符用来测试一个对象在其原型链中是否存在一个构造函数的 prototype 属性。
通俗点说,就是用来判断 A 是否为 B 的实例,表达式为A (object) instanceof B (constructor),如果 A 是 B 的实例,则返回 true,否则返回 false。
实例:
let a = [24, 8],
b = function () {
console.log('Kobe Bryant')
},
c = {}
console.log(a instanceof Array);//true
console.log(b instanceof Function);//true
console.log(c instanceof Object);//true
缺点:无法判断字面量定义的number,boolean,string并且判断是否处于原型链上的判断方法不严谨 它判断的是是否处于原型链上,而不是是不是处于原型链最后一位,所以会出现下面这种情况, 如:
const a = 24,
b = 'Kobe',
c = true
arr = [24, 8];
console.log(arr instanceof Array) // true
console.log(arr instanceof Object); // true
function fn() {}
console.log(fn instanceof Function) // true
console.log(fn instanceof Object) // true
console.log(a instanceof Number) //false
console.log(b instanceof Number) //false
console.log(c instanceof Number) //false
3、Object.prototype.toString.call()
可以很好的区分各种类型,但是同样是检测对象obj调用toString方法,obj.toString()的结果和Object.prototype.toString.call(obj)的结果不一样,这是为什么呢?
这是因为toString()为Object的原型方法,而Array 、Function等类型作为Object的实例,都重写了toString方法。不同的对象类型调用toString方法时调用的是对应的重写之后的toString方法(返回对应的字符串),而不会去调用Object上原型toString方法(返回对象的具体类型),所以结果不同。因此,在想要得到对象的具体类型时,应该调用Object原型上的toString方法。
示例:
console.log(Object.prototype.toString.call("Kobe")); //[object String]
console.log(Object.prototype.toString.call(24)); //[object Number]
console.log(Object.prototype.toString.call([24, 8])); //[object Array]
console.log(Object.prototype.toString.call(true)); //[object Boolean]
console.log(Object.prototype.toString.call(function () {})); //[object Function]
console.log(Object.prototype.toString.call(null)); //[object Null]
console.log(Object.prototype.toString.call(undefined)); //[object Undefined]
console.log(Object.prototype.toString.call(new Date)); //[object Date]
console.log(Object.prototype.toString.call(/\d/)); //[object RegExp]
function Person() {
name: "Kobe Bryant"
};
console.log(Object.prototype.toString.call(new Person)); //[object Object]