在JS中我们常用 typeof 运算符来判断一个变量的类型, 在使用 typeof 时如果采用引用类型存储值会出现一个问题,就是无论引用的是什么类型的对象,它返回都是 “object” .
ECMAScript 引用了Java运算符 instanceof 来解决这个问题。
instanceof 跟 typeof 都是用来识别正在处理的对象类型,不同之处是 instanceof 方法要求明确指定对象为某种特定类型对象。
例一:
var string = new String(‘love you‘);
string instanceof String; //输出 true
instanceof 运算符常规用法
例二:
//判断 foo 是否是 Foo 类的实例
function Foo(){};
var foo = new Foo();
foo instanceof Foo; //输出 true
更重要的一点, instanceof 可以在继承关系中判断一个实例是否属于它的父类型
例三:
// 判断 foo 是否是 Foo类的实例, 并且是否是其父类型的实例
function Aoo(){};
function Foo(){};
Foo.prototype = new Aoo(){};
var foo = new Foo();
foo instanceof Foo; //输出 true
foo instanceof Aoo; //输出 true
instanceof 复杂操作
例四:
Object instanceof Object //true
Function instanceof Function //true
Number instanceof Number //false
String instanceof String //false
Function instanceof Object //true
Foo instanceof Function //true
Foo instanceof Foo //false
想要了解上面的奥秘,需要从两方面着手:
1、语言规范中是如何定义这个运算符的;
2、JavaScript 原型继承机制
JavaScript instanceof 运算符代码
例六:
function instance_of(L,R){ //L代表左表达式,R代表右表达式
var W = R.prototype; //取R的显示原型
L = L.__proto__; //取L的隐士原型
while(true){
if(L === null){
return false;
}
if(W === L){ //重点,当W严格等于L时,返回true
return true;
}
L = L.__proto__;
}
}
JavaScript 原型继承机制
本文涉及显示原型和隐式原型,在JavaScript中用 __proto__ 表示对象隐式原型,所有对象都有 __proto__ 属性,但只有Object.prototype.__proto__ 为null。
JavaScript 用prototype 属性表示显示的原型。