typeof
typeof运算符会返回一个字符串表示变量的类型。
主要用来判断 基本类型变量和对象。
typeof "Hello world"; // string
typeof 123; // number
typeof true; // boolean
typeof undefined; // undefined
typeof null; // object
typeof {a:1}; // object
typeof function(){} // function
说明:
typeof是根据变量的二进制数据前三位来表示类型的。
'000'表示object类型,而null的二进制数据全为0,所以typeof会把null判断为object类型。
Object.prototype.toString.call()
toString()会返回一个表示该对象的字符串(包含对象子类型信息)。
可以用来判断内嵌对象子类型和基本类型变量。
let toString = Object.prototype.toString;
toString.call([]); // '[object Array]'
toString.call(new Date); // '[object Date]'
toString.call(function(){}); // '[object Function]'
toString.call(123); // '[object Number]'
toString.call("Hello"); // '[object String]'
toString.call(undefined); // '[object Undefined]'
toString.call(null); // '[object Null]'
toString.call(true); // '[object Boolean]'
说明:
- Object原型的toString方法会被对象"继承",同时也有可能被"覆盖",所以这里调用的是Object原型的方法,而不是对象本身的方法。
- toString返回的是对象内部属性[[Class]]的值,所以该方法无法判断自定义构造函数创建的对象类型。
function Foo(){}
let foo = new Foo();
Object.prototype.toString.call(foo); // [object Object]
instanceof
instanceof运算符 用来判断 一个对象是否是某个构造函数的实例。
[] instanceof Array; // true
new Date() instanceof Date; // true
let foo = new Foo();
foo instanceof Foo; // true
1 instanceof Number; // false
说明:
/**
* instanceof用于判断一个对象是否是某个构造函数的实例。
* 原理:检查构造函数的prototype原型对象是否在对象的原型链上。
*/
function instanceof(obj,func){
let prototype = func.prototype;
let proto = Object.getPrototypeOf(obj);
while(proto){
if(prototype == proto){
return true;
}
proto = Object.getPrototypeOf(proto);
}
return false;
}
总结
- 优先使用Object.prototype.toString.call(),可用于准确判断内置对象子类型和基本类型变量。
- typeof可用于区分对象类型和基本类型。
- instanceof可用于判断自定义构造函数的实例对象。