typeof、instanceof、class、constructor

本文深入探讨JavaScript中typeof、instanceof、class和constructor的应用场景及局限性。解释如何使用这些工具来区分基本类型与复杂对象,包括内置对象和自定义构造函数创建的对象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这节我们来说说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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值