天天看点

typeof和instanceof、constructor的关系

javascript中typeof和instanceof常用来判断一个变量是否为空或者是什么类型的;但它们之间还是有区别的:

typeof 是一个一元运算符,放在一个运算数之前检测其是不是基本数据类型,它返回值是一个字符串,该字符串说明运算数的类型;

typeof一般只能返回如下几个结果:number,boolean,string,function,object,undefined;我们可以使用typeof来获取一个变量是否

存在,例如:if(typeof a!="undefined"){alert("ok")},而不要去使用if(a),因为如果a不存在未声明)则会出错;对于array、

null、object等特殊对象,使用typeof一律返回object,这也是typeof的局限性

正因为typeof有这样的局限性,当我们要判断一个对象是否是数组或者变量是否是某个对象的实例时,则要选择使用另一个关键语法

instanceof。

instanceof用于判断一个变量是否为某个对象的实例,返回值是布尔类型的;例如:var a=new array();alert(a instanceof array);

会返回true,同时alert(a instanceof object)也会返回true;这是因为array是object的子类;再例如:alert(window instanceof

object)会返回false,这也说明instanceof测试的object是指js语法中的object,不是指dom模型对象;instanceof操作符的本质,在

于确定左边的操作数的原型链上是否有右边的操作数的prototype属性。

谈到instanceof我们要多插入一个问题,就是function的arguments,我们大家也许都认为arguments是一个array,但如果使用

instaceof去测试会发现arguments不是一个array对象,尽管看起来很像。

需要注意的是,instanceof只能用来判断对象和函数,不能用来判断字符串和数字等,如:

var b = '123';

alert(b instanceof string); //false

alert(typeof b); //string

var c = new string("123");

alert(c instanceof string); //true

alert(typeof c); //object

另外,用instanceof可以判断变量是否为数组

在js语言中,constructor属性是专门为function设计的,它存在于每一个function的prototype属性中,每个具有原型的对象都会自动获得constructor属性,这个constructor保存了指向function的一个引用,除了arguments、enumerator、error、global、math、regexp、regular expression等一些特殊对象外,其他所有的js内置对象都具备constructor属性,如:array、boolean、date、function、number、object、string等,所有主流浏览器均支持该属性;constructor语法为:object.constructor,用法例如:var test=new array();if (test.constructor==array){document.write("this is an array");};其实constructor的出现原本就是用来进行对象类型判断的,但是constructor属性易变,不可信赖;我们一般使用更加安全可靠的判定方法:instanceof 操作符;不过从编程习惯上,我们应该尽量让对象的constructor指向其构造函数以维持这个惯例

constructor属性是个很容易犯错的属性。

1.它的实质是包含在原型中的属性,而该属性是共享的,因此可以通过对象实例访问该属性。

2.当在原型对象中设置constructor属性时,只是屏蔽了原型的constructor属性,而没有覆盖

继续阅读