typeof、instanceof、class、constructor
这节我们来说说typeof、instanceof、class、construct的应用场景,什么时候能用它们,各自的局限性
1、typeof
首先typeof的返回值有number、string、boolean、object、function、undefined六种,
来看倒数第二条的“任意内置对象(非函数)”,我们知道的内置对象有Date、regExp、Math、Array、Function、Object这里除了Math,其它typeof的值都是function,因为其他几个都是构造函数(可以用new的形式创建对象,如new Date();它们的__proto__都是Function.prototype);
typeof用来区分对象和其他原始值是很有帮助的,因为对象和数组返回的都是object,但是内置对象这些就不能区分开。
2、instanceof
instanceof运算符的值是通过原型链追溯的,比如 a instanceof b 它会沿着a的原型链一直追溯,如果等于b.prototype,就返回true,一直到原型链的最顶端null,没匹配到,就返回false。这里涉及了原型链的知识。
这里要主注意,instanceof运算符的右边必须是可调用的对象,instanceof更多的体现了一种继承关系
3、class
对象的类属性(class attribut)是一个字符串,ECMAScript3、ECMAScript5都没有提供这个方法,我们只能通过Object的toString()方法间接的查询它,返回如下格式的字符串“[object class]”。但很多对象的toString()方法会被重写,所以,需要接用Object.toString()来找到它
Object.prototype.toString.call(o).slice(8,-1)
自定一个测试对象类型的方法classof
function classof(o){
if(0===null) return "Null";
else if(0===undefined) return "Undefined"
else return Object.prototype.toString.call(o).slice(8,-1);
}
通过class我们可以区分出对象所对应的类型Null,Number、String、Boolean、Array、Date、RegExp、Object、Window。相比typeof,这里增加了内置对象的判断。我们经常对后台返回的结果进行循环解析的时候都要先判断是否是数组从而再进行解析,这里可以用class来进行判断
4、constructor
每个js函数(例如fn)都自动拥有一个原型对象(ECMAScript 里Function.bind()方法返回的函数除外),原型对象里就有一个constructor属性(不可枚举属性),该属性指向构造器(fn)(这个在原型链里有详细的记载)。
constructor可以个找到对象的构造器(构造对象),相比class,它能进一步判断自定义构造函数创建对象的构造类比如:
var fn = function(){}
var instanceFn = new fn();
instanceFn .__proto__.constructor==fn //true
推荐阅读
-
typeof、instanceof、class、constructor
-
反射中Class、Method、Field、 Constructor类的使用
-
java中instanceof与Class的等价性代码示例
-
详解JavaScript中typeof与instanceof用法
-
java中instanceof与Class的等价性代码示例
-
instanceof和typeof运算符的区别详解
-
typeof 和 instanceof 区别
-
js中关于typeof与instanceof的区别讲解
-
typeof和instanceof代码实例分析
-
Javascript typeof与instanceof的区别