位置: 编程技术 - 正文

JavaScript类型检测之typeof 和 instanceof 的缺陷与优化(js检测类型的方法)

编辑:rootadmin

推荐整理分享JavaScript类型检测之typeof 和 instanceof 的缺陷与优化(js检测类型的方法),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:js类型值,js中类型,javascript数据类型检测,js检测类型的方法,javascript数据类型检测,js类型检测,javascript 类型,javascript数据类型检测,内容如对您有帮助,希望把文章链接给更多的朋友!

在javascript中,typeof 和 instanceof 是用来判断数据类型比较通用的两个方法,这篇文章的目的是通过对这两个方法介绍来分析其存在的不足并提出优化方案。

typeof

--------------------------------------------------------------------------------

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

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

instanceof

--------------------------------------------------------------------------------

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

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

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

从原型链可以看出,[]的__proto__最终指向了Object.prototype,类似的new Date()、new Person() 也会形成这样一条原型链,因此,我们用 instanceof 也不能完全精确的判断object类的具体数据类型。

优化方案

--------------------------------------------------------------------------------

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

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

typeof

typeof 是一个一元运算,放在一个运算数之前,运算数可以是任意类型。

它返回值是一个字符串,该字符串说明运算数的类型。typeof 一般只能返回如下几个结果:

JavaScript类型检测之typeof 和 instanceof 的缺陷与优化(js检测类型的方法)

number,boolean,string,function,object,undefined。我们可以使用 typeof 来获取一个变量是否存在,如 if(typeof a!="undefined"){alert("ok")},而不要去使用 if(a) 因为如果 a 不存在(未声明)则会出错,对于 Array,Null 等特殊对象使用 typeof 一律返回 object,这正是 typeof 的局限性。

网上的一个小例子:

instanceof

instance:实例,例子

a instanceof b&#;alert("true"):alert("false"); //a是b的实例?真:假

instanceof 用于判断一个变量是否某个对象的实例,如 var a=new Array();alert(a instanceof Array); 会返回 true,同时 alert(a instanceof Object) 也会返回 true;这是因为 Array 是 object 的子类。再如:function test(){};var a=new test();alert(a instanceof test) 会返回谈到 instanceof 我们要多插入一个问题,就是 function 的 arguments,我们大家也许都认为 arguments 是一个 Array,但如果使用 instaceof 去测试会发现 arguments 不是一个 Array 对象,尽管看起来很像。

另外:

测试 var a=new Array();if (a instanceof Object) alert('Y');else alert('N');

得'Y'

但 if (window instanceof Object) alert('Y');else alert('N');

得'N'

所以,这里的 instanceof 测试的 object 是指 js 语法中的 object,不是指 dom 模型对象。

使用 typeof 会有些区别

alert(typeof(window)) 会得 object

大家知道JavaScript中判断函数参数类型是用typeof还是instanceof吗?

typeof只能判断js已有的几个类型,如function,object,number。

而instanceof可以判断对象是由哪个函数实例化出来的,如:

c instanceof a为true而d instanceof b为false。

而用typeof c和typeof d的结果都是object

“判断函数参数类型”需要根据你的需求来选择用哪个。

浅析JavaScript中的变量复制、参数传递和作用域链 今天在看书的过程中,又发现了自己目前对Javascript存在的一个知识模糊点:JS的作用域链,所以就通过查资料看书对作用域链相关的内容进行了学习。

详解iframe与frame的区别 开门见山了,大家需要注意的地方:HTML5不再支持使用frame,iframe只有src属性一、使用iframe的优缺点优点:1.程序调入静态页面比较方便;2.页面和程序分离;

简单的JS时钟实例讲解 本文实例介绍了JS时钟实现代码,分享给大家供大家参考,具体内容如下效果图:具体代码:!DOCTYPEhtmlhtmllang="en"headmetacharset="gb"titleDocument/titlescripttype

标签: js检测类型的方法

本文链接地址:https://www.jiuchutong.com/biancheng/383790.html 转载请保留说明!

上一篇:分享javascript计算时间差的示例代码(javascript视频教程推荐)

下一篇:浅析JavaScript中的变量复制、参数传递和作用域链(javascript概述及作用)

  • 资源税计入什么科目
  • 偶然所得税什么时候颁布
  • 销售额是含税价还是不含税价
  • 税务系统纳税申报
  • 租赁合同交税一般交多少钱
  • 公司房租发票是专票还是普票
  • 企业辅助生产车间
  • 固定资产清理在财务报表哪里体现
  • 不动产折旧费计算公式
  • 购买办公室电脑桌分录
  • 公司牌车还款从哪里扣款
  • 个人所得税是否分段计算
  • 增值税发票地址变更后开原来的地址能用吗
  • 虚开增值税发票具体操作是怎样的?
  • 采用差额计税开什么发票
  • 非财政专项资金和其他资金的区别
  • 开发票时含税和不含税是什么意思?
  • 资产负债表里的年初余额是什么意思
  • 继续教育专项附加扣除标准
  • 补交去年的企业所得税怎么做账务处理
  • 国际重复征税的类型及范围
  • 企业所得税避税的方法
  • macOSCatalina10.15.5正式版值得升级吗 macOSCatalina10.15.5更新了什么
  • 什么是递延所得税资产和负债
  • 邮件远程控制
  • 结转出租包装物报废的残料价值计入
  • 装修费用账务怎么处理
  • 踩坑视频
  • 前端 input
  • thinkphp教程
  • php自定义函数的关键字是什么
  • vue-plugin-hiprint vue hiprint vue使用hiprint打印控件VUE HiPrint HiPrint简单使用
  • pytorch nn.parameters
  • 应付职工薪酬怎么冲平
  • 收残疾人就业保险合法吗
  • 代发工资怎么做
  • 货币资金包括哪些方面
  • 公司银行开户的费用怎么做账
  • 现金流量表企业所得税
  • 工资薪金个人所得税在哪里申报
  • 总公司所得税汇算
  • 非货币性资产交换以公允价值为基础进行计量
  • 利用java实现计算器
  • 购买银行理财产品的几个必须知道
  • 工会经费的开支包括哪些
  • 已提足折旧的固定资产出售的账务处理
  • 个体户是怎么交公积金的
  • 国际快递运输服务有哪些
  • 发票上的印记能去掉吗
  • 带有折扣的增值税专用发票图片
  • 科技专项资金单独核算原则
  • 内账收入如何确认
  • 应付工资比计提工资高
  • 单位定期存单利息如何记账
  • 原材料入库损耗
  • 工程设计费收入在所得税申报表应填入
  • sql将一个数据库的表导入到另一个数据库
  • centos svn服务器搭建web
  • igs文件是什么文件
  • centos ftp上传文件
  • windows 10 mobile--移动版
  • ps显示操作步骤
  • pqhelper.exe是什么进程 pqhelper进程查询
  • win10家庭版专业版教育版
  • unity发布exe
  • javascript中的数据类型分为两大类
  • perl中哈希如何赋值
  • js实现拖拽元素改编顺序
  • c++ nops
  • html5仿微博代码
  • js判断符
  • python内置函数format
  • unity手柄圆盘
  • javascript学习指南
  • 开票日期是今年但是业务是去年
  • 土地增值税核定征收尾盘销售
  • 郑州房产交契税在哪里交
  • 完税证明在哪里查询打印
  • 个人所得税税率表及速算扣除数
  • 闵行区注册公司,闵行区税务筹划,哪
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设