说明
如果 object 是 class 的一个实例,则 instanceof 运算符返回 true 。如果 object不是指定类的一个实例,或者 object 是 null ,则返回 false 。
用于判断一个变量是否某个对象的实例,
如var a=new Array();alert(a instanceof Array);会返回true,同时alert(a instanceof Object)也会返回true;这是因为Array是object的子类。
再如:function test(){};var a=new test();alert(a instanceof test)会返回true。
注意:
关于function 的 arguments,我们大家也许都认为 arguments 是一个 Array,但如果使用 instaceof 去测试会发现 arguments 不是一个 Array 对象,尽管看起来很像。
此外还有类似的情况,例如:
var a=new Array();if (a instanceof Object) alert('Y');else alert('N'); 得'Y'
但 if (window instanceof Object) alert('Y');else alert('N'); 得'N'
所以,这里的 instanceof 测试的 object 是指 js 语法中的 object,不是指 dom 模型对象。
而此时使用 typeof 会有些区别: alert(typeof(window)) 会得 object
引申:JavaScript中的instanceof操作符的原理是什么?
学习js时,了解到在判断js中一个实例是否属于某一种类型时,可以使用instanceof操作符,比如function Person(){}
var person = new Person(); alert(person instanceof Person);//返回true
那么在执行instanceof这个操作时经过了怎样的判断,返回了true/false?
会不会是通过判断Person.prototype与person的内部指针[[prototype]]两者引用是否相同而得出结果的?
其实,凡是能在实例的"原型对象链"中找到该构造函数的prototype属性所指向的原型对象,就返回true。
而prototype根本就不是实例具有的属性(或者说实例的prototype属性为undefined),而是它原型对象中的属性,如果被篡改了,这个判断方法就不能正确返回了。
另外,能不能直接判断 person.constructor == Person来取得想要的结果呢?
我们做个测试,如下JavaScript代码:
复制代码 代码如下:
function Person(name,sex){this.name=name;this.sex=sex;}
document.write ("<br>typeof Person:"+typeof Person);
document.write ("<br>typeof Person.prototype:"+typeof Person.prototype);
document.write ("<br>typeof Person.constructor:"+typeof Person.constructor);
var person = new Person();
document.write ("<br><br>var person = new Person();");
document.write ("<br>typeof person:"+typeof person);
document.write ("<br>typeof person.prototype:"+typeof person.prototype);
document.write ("<br>typeof person.constructor:"+typeof person.constructor);
document.write ("<br><br>Function.constructor:"+Function.constructor);
document.write ("<br><br>Function.prototype:"+Function.prototype);
document.write ("<br><br>Person.constructor:"+Person.constructor);
document.write ("<br><br>Person.prototype:"+Person.prototype);
document.write ("<br><br>person.constructor:"+person.constructor);
document.write ("<br><br>person.prototype:"+person.prototype);
输出如下:
typeof Person:function
typeof Person.prototype:object
typeof Person.constructor:function
var person = new Person();
typeof person:object
typeof person.prototype:undefined
typeof person.constructor:function
Function.constructor:function Function() { [native code] }
Function.prototype:function Empty() {}
Person.constructor:function Function() { [native code] }
Person.prototype:[object Object]
person.constructor:function Person(name,sex){this.name=name;this.sex=sex;}
person.prototype:undefined
和Function类似,Number()为Number对象的构造函数,Number()用于将其参数转换为数字number类型,并返回转换结果(若不能转换则返回NaN)。
在JavaScript中constructor较少使用,variable.constructor返回其对象类的构造函数的字符串表示。
那么在JavaScript中判断数据类型时,我们可以使用以下方式来得到其详细数据类型:
if((typeof a=="object") && (a.constructor==Array)){
…
}
注意:constructor只能对已有变量进行判断,而typeof则可对未声明变量或空对象进行判断(返回undefined)。
您可能感兴趣的文章: