typeof、instanceof 与 constructor 详解
typeof 一元运算符
返回一个表达式的数据类型的字符串,返回结果为js基本的数据类型,包括number,boolean,string,object,undefined,function.
语法:typeof(data) 或 typeof data
实例:
var test = [123, true, "abc", {}, function() {}]; for(var i = 0; i <= test.length; i++) { console.log(typeof test[i]); } // number // boolean // string // object // function // undefine注: typeof null == object
instanceof 二元运算符
返回一个布尔值,该值指示一个对象是否为特定类的一个实例。
语法: object instanceof class
如果 object 是 class 的一个实例,则 instanceof 运算符返回 true。如果 class 存在于对象的原型链中(为 true),则该运算符返回 true。如果 object 不是 class 的实例,或 object 为 null,则该运算符返回 false。
其本质是判断 class.prototype 是否存在于object对象的原型链上,关于原型链请点击这里
实例:
function A(){ } var a = new A(); console.log( a instanceof A);//true console.log(a instanceof Object);//true
constructor 属性,存在于Object.prototype的属性
返回对象的构造函数
语法: object.constructor
返回值是函数的引用,不是函数名:
JavaScript 数组 constructor 属性返回 function Array() { [native code] }
JavaScript 数字 constructor 属性返回 function Number() { [native code] }
JavaScript 字符串 constructor 属性返回 returns function String() { [native code] }
如果一个变量是数组你可以使用 constructor 属性来定义。
实例:
function A(){ } var a = new A(); console.log(a.constructor,a.constructor === A); //true console.log(a.constructor === Object); //false
对象的构造器 constructor 是可以改变的,但我们一般不建议这样做,因为这样会使程序的逻辑混乱。实例:
function A(){ } function B(){ } A.prototype.constructor = B; var a = new A(); console.log(a.constructor,a.constructor === A); //false console.log(a.constructor === B); //true