继续耻辱面试的面经。被问到了如何辨别对象与数组(对象的类型),以及如何判断某个实例是否属于这个类,在面试的时候用了很愚蠢的方法的自杀式回答,回来之后痛定思痛,当时其实是想到这两个操作符了的,还是还不熟悉了。这回一次性搞清楚。
1、typeof
我们的老朋友。typeof操作符返回一个字符串,表示未经计算的操作数的类型。主要有这几种结果:
类型 | 结果 |
---|---|
Undefined | "undefined" |
Null | "object" |
Boolean | "boolean" |
Number | "number" |
String | "string" |
Symbol (ES 6 新增) | "symbol" |
函数对象 | "function" |
任何其他对象 | "object" |
比较需要注意的是,使用基本类型对应的构造函数构造出来的的实例的数据类型是 object:
typeof new Boolean(true) === 'object';
typeof new Number(1) === 'object';
typeof new String("abc") === 'object';
2、instanceof
instanceof 的语法如下,用来检测 constructor.prototype 是否存在于参数 obj 的原型链上。
obj instanceof constructor
简单地分辨数组与对象:
let a = [1,2,3]
let b = {name:"franko"}
function judge(obj){
if(obj instanceof Array) return "Array"
if(obj instanceof Object) {
return "Object"
}else{
return "Not an Object"
}
}
更优雅的方法:
function judge2(obj){
if(Array.isArray(obj)){
return "Array"
}else{
return "Not an Array"
}
}
但是这种方法并不能告诉我们对象的具体类型,如果我们要进行判断,就要一种一种地试。以及对象是否就是某个类的实例也不能判断,因为只要在 obj 的原型链上的构造函数都能够返回 true。
3、最终的答案
获取对象具体类型的方法是,使用 Object.prototype.toString.call 方法。具体操作如下:
console.log(Object.prototype.toString.call("jerry"));
//[object String]
console.log(Object.prototype.toString.call(12));
//[object Number]
console.log(Object.prototype.toString.call(true));
//[object Boolean]
console.log(Object.prototype.toString.call(undefined));
//[object Undefined]
console.log(Object.prototype.toString.call(null));
//[object Null]
console.log(Object.prototype.toString.call({name: "jerry"}));
//[object Object]
console.log(Object.prototype.toString.call(function(){}));
//[object Function]
console.log(Object.prototype.toString.call([]));
//[object Array]
console.log(Object.prototype.toString.call(new Date));
//[object Date]
console.log(Object.prototype.toString.call(/\d/));
//[object RegExp]
function Person(){};
console.log(Object.prototype.toString.call(new Person));
//[object Object]
这种方法正好满足了我们判断对象类型的需要,正如我们所见的,这种方法不能用来判断实例所在的类,判断实例所在的类则可以使用 Object.getPrototypeOf(obj).constructor.name 的方法。Object.getPrototypeOf() 方法返回指定对象的原型。如:
var proto = {};
var obj = Object.create(proto);
Object.getPrototypeOf(obj) === proto; // true
var reg = /a/;
Object.getPrototypeOf(reg) === RegExp.prototype; // true
console.log(Object.getPrototypeOf(reg).constructor.name)
// "RegExp"
以上就是本篇博客中关于 typeof 和 instanceof 的所有内容。可见这些知识虽然细,但是在关键时候还是用得上的,希望我能记住吧。