百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

JS 类型检测:谈 typeof 和 instanceof 的缺陷与优化

zhezhongyun 2025-04-24 10:37 30 浏览

在javascript中,typeof 和 instanceof 是用来判断数据类型比较通用的两个方法,但这两种方式并不能完全解决实际中遇到的问题。因此,这篇文章的目的是通过对这两个方法介绍来分析其存在的问题和不足,并提供一个比较简单的优化方案。

typeof

typeof 返回一个表达式的数据类型的字符串,返回结果为javascript中的基本数据类型,包括:number、boolean、string、object、undefined、function等6种数据类型。

typeof 100; //number
typeof (1==1); //boolean
typeof 'onepixel'; //string
typeof {} ; //object
typeof onepixel; // undefined
typeof parseInt; // function
typeof ;//object
typeof new Date; //object   

可以看出,typeof 可以准确的判断除object以外的基础数据类型,但不能区分object类型的具体类型,比如 Array 、Date 以及自定义类。

instanceof

instanceof 本意是用来判断 A 是否为 B 的实例对象,表达式为:A instanceof B,如果A是B的实例,则返回true,否则返回false。 在这里需要特别注意的是:instanceof检测的是原型,那它是怎么检测的呢,我们用一段伪代码来模拟其内部执行过程:

instanceof (A,B) = {
    var L = A.__proto__;
    var R = B.prototype;
    if(L === R) {
        //A的内部属性__proto__指向B的原型对象
        return true;
    }
    return false;
}

从上述过程可以看出,当 A 的 __proto__ 指向 B 的 prototype 时,就认为A就是B的实例对象,我们再来看几个例子:

 instanceof Array; //true
{} instanceof Object;//true
new Date instanceof Date;//true

function Person{};
new Person instanceof Person;

 instanceof Object; //true
new Date instanceof Object;//true
new Person instanceof Object;//true

从上面的例子中,我们发现,虽然 instanceof 能够正确判断 是Array的实例对象,但 instanceof 认为 也是Object的实例对象,为什么呢? 这还需要从JS的原型链说起,我们首先来分析一下、Array、Object 三者之间的关系: 从instanceof能够判断出 .__proto__ 指向 Array.prototype, 而实际上 Array.prototype.__proto__ 指向了Object.prototype,
Object.prototype.__proto__ 指向了null,标志着原型链的结束。(ps:关于JS原型链请阅读:浅谈javascript原型和原型链) 因此,、Array、Object就形成了一条原型链:

从原型链可以看出, 的 __proto__ 最终指向了Object.prototype,因此,JS认为 也是Object的实例。当然,类似的new Date、new Person 也会形成这样一条原型链,因此,用 instanceof 只能够用来判断已知的数据类型,比如: instanceof Array , 而不能获取一个对象的具体数据类型。

优化方案

对于这个问题,在阅读jQuery源码时,发现 jQuery 实现了一个较好的解决方案来获取数据类型,由于源码之间存在相互调用不便于阅读和理解,因此,我按照其思路进行了整理和封装,代码如下:

(function{

    var class2type = {};
    var typeList = "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " );

    typeList.eachEach(function(item){
        class2type[ "[object " + item + "]" ] = item.toLowerCase;
    }

    return {
        getObjType:function(obj) {
 if ( obj == null ) {
 return obj + "";
 }
 
 if(typeof obj === "object" || typeof obj === "function"){

 return class2type[ toString.call( obj ) ] || "object"

 }else {
 return typeof obj;
 }
        }
    }
})

代码仅供参考,如有不同见解,欢迎交流!

by @ 一像素 2016.01

相关推荐

css 垂直居中的几种实现方式(css怎么实现垂直居中)

前言设计是带有主观色彩的,同样网页设计中的css一样让人摸不头脑。网上列举的实现方式一大把,或许在这里你都看到过,但既然来到这里我希望这篇能让你看有所收获,毕竟这也是前端面试的基础。实现方式备注:...

CSS 中各种居中你真的玩明白了么(css中的居中属性)

页面布局中最常见的需求就是元素或者文字居中了,但是根据场景的不同,居中也有简单到复杂各种不同的实现方式,本篇就带大家一起了解下,各种场景下,该如何使用CSS实现居中前言页面布局中最常见的需求就是元...

浅谈3种css技巧——两端对齐(css两侧对齐)

在出里文字比较多的网页,文字对齐其中采用的两端对齐,两端对齐的方法有三种方法,如下:1.使用text-align:justifytext-align:justify属性是全兼容的,使用它实现两端对...

从零开发HarmonyOS(鸿蒙)运动手表小游戏—数字华容道

本个demo将从零基础开始完成鸿蒙小游戏APP在可穿戴设备上的编译,此处以运动手表为例,在项目中我们所使用到的软件为DevEcoStudio,下载地址为:DevEcoStudio下载、DevEco...

教师如何制作随机点名系统,活跃课堂气氛

上课点名抽学生回答问题,做游戏……由老师口头点名,点谁回答总有点老师本人的情绪,且显得毫无趣味,但做一个点名系统,就不一样了,电脑随机抽出的名字,不仅公平,还会给孩子们带来一种不一样的感受。那么怎么做...

看京铁人如何破解电煤运输"烤"验

“天气太热了!空调是我的避暑必备神器再往冰箱里冻些雪糕和西瓜电风扇也要24小时上岗了”近日京津冀地区迎来高温天气小伙伴们都在分享解暑妙招但这些妙招背后都离不开一个字——“电”为确保电力平稳“迎峰度夏”...

回家的路就是最美的风景 幸福就在前方

2025年春运启动以来,无数在外游子踏上归乡旅程。为了帮助更多旅客按时回家过年,还有很多人不分昼夜、不辞辛苦地奔波在铁路线上。“我的列车飞驰而过,那是梦想的前方,回家的路就是最美的风景。”END&l...

如何做出一个香消玉殒的网页文字特效

最近,迷上了CSS3特效,空闲时间学一些小案例,非专业,爱好。不断学习也能掌握一些更为全面的html,css,JavaScript的知识,以小博大,从兴趣出发再掌握更多网页开发知识。闲言少叙,直接开怼...

第1000篇原创,我想对你说______(2021我想对你说1000)

亲爱的小伙伴今天您看到的这篇推送是“北京铁路”发布的第1000篇原创作品!这不仅是一个数字的跨越更是我们一路走来与每一位关注者共同铸就的辉煌里程碑每一篇文章都承载着我们的心血与热情每一次传播都离不开大...

动车组的“家”在哪里?(动车组的"家"在哪里?举例说明)

夜幕降临随着动车组列车驶入站台乘客陆续离开动车组也完成了一天的工作准备启程回“家”有小伙伴儿会问“为什么大多数动车组列车夜间不运行呢?”这是因为白天行驶一天的动车组要利用晚上的时间进行全面检查、维修和...

这套铁路“高考”卷,请你来作答(郑州铁路职业技术学院高考河南录取分数线)

今天是2025年全国高考的第一天小编为大家准备了一套北京铁路版的试卷满分120分共12道单选题快来试试你能得多少分吧!·<animateattributeName="opacity"begi...

HarmonyOS Text组件Span间距解决方案

HarmonyOSText组件Span间距解决方案一、问题分析在HarmonyOS开发中,Text组件内的Span子组件无法直接设置margin/padding属性,需要通过文本级属性实现间距控制。...

考“火车驾驶证”,难不难?(火车驾驶证怎么考需要什么条件)

····<animateattributeName="height"begin="0.1"dur="0.01s"fill="freeze"to="0"/>00:0002:59未加...

高温?京铁人:我有“物理外挂”!(点开看有多爽)

近几日华北地区气温不断上升高温来袭坚守岗位的京铁人开启清凉避暑的“物理外挂”快动动手指点开看看吧·<animateattributeName="opacity"begin="click+0....

2025年Top30 CSS面试题及答案(css常考面试题)

概述CSS(层叠样式表)是构建美观、响应式网站的关键技术。无论您是在准备前端开发者面试还是复习知识,这里都有一份精心挑选的2025年每个开发者都应该知道的30个CSS面试题及答案。1.什么是CSS...