小结 javascript中的类型检测
先吐槽一下博客园的编辑器,太不好用了,一旦粘贴个表格进来就会卡死,每次都要用html编辑器写,不爽!
关于javascript的类型检测,早在实习的时候就应该总结,一直拖到现在,当时因为这个问题还出了线上bug。今天回顾《编写可维护的javascript》第八章“避免空比较”,里面详细说明了javascript中各种类型比较问题,现在想来当时的代码基本把所有的忌讳都犯了一遍,就那么上线了简直对不起党和人民。。。
| 类型检测 | |||||
| 类型 | 检测方法 | 检测对象 | 检测结果 | 缺点 | 备注 |
| 原始值 | typeof | 字符串 | string | ||
| 数字 | number | ||||
| 布尔值 | boolean | ||||
| undefined | undefined | ||||
| null | object | 引用类型的typeof结果为object,不能够起到检测的作用 | 检测null应用===或!== | ||
| 引用值 | instanceof | 内置类型:Object,Date,Error,RegExp | true/false | instanceof会检测原型链,每个对象都继承自Object | |
| 自定义类型及内置类型中的function、Array | true/false | frame A、B中分别定义构造函数Person,且两个Person完全相同。A中创建实例传入B中,则有, frameAPersonInstance instanceof frameAPerson //true frameAPersonInstance instanceof frameBPerson //false |
唯一的检测方法 | ||
| typeof | function | function //IE8以上 object //IE8及以下 |
针对IE8及以下版本,由于其未将DOM实现为内置的javascript方法,需使用 if("xxx" in document)(){};来检测DOM的方法 |
||
| Array.isArray() | Array | true/false | ECMAScript5,适用于IE9+,FF4+,SF5+,O10.5+,Chrome | ||
| Object.prototype.toString.call(value) === "[Object Array]" |
true/false | 这种方法适用于所有内置对象,如JSON等 | |||
| 属性是否在对象中存在 | “XXX”in object | 属性 | 会深入检测实例及其继承的对象原型 | ||
| hasOwnProperty() | true/false //IE8以上 无此方法 //IE8及以下 |
针对IE8及以下版本,由于DOM对象并非继承自Object,因此不包含此方法。所以需要检测方法是否存在: if(object.hasOwnProperty("related")){}; //针对非DOM对象 if("hasOwnProperty" in object && object.hasOwnProperty("related")){}; //不确定是否为DOM对象时 |
调用DOM对象的hasOwnProperty方法之前应先检测其是否存在!若已经知道对象不是DOM则可省略检测存在。 | ||
总的来说:
一、表总结
typeof通常用于基本类型(null除外)及function的检测;
instanceof通常用于自定义类型的检测;
准确的 引用类型 检测使用Object.prototype.toString.call(value) === "[Object Array]"等;
属性 的检测使用in和hasOwnProperty()。
二、补充
通过constructor进行类型检测,参考http://www.cnblogs.com/zhengchuyu/archive/2008/07/21/1247764.html
不过不推荐文中使用正则表达式match检测,正则会对性能有一定影响,并且正则的使用稍不留意就会给自己留下各种坑儿~~
三、性能
非IE系:typeof>.toString.call()>10*constructor
IE系列:typeof>constructor>.toString.call()
小结 javascript中的类型检测的更多相关文章
- javascript中的类型检测
最常见的是使用 typeof 来判断数据类型 可以区分4种基本类型,即 “number”,”string”,”undefined”,”boolean”,第5种基本类型null类型返回值为object( ...
- Javascript学习1 - Javascript中的类型对象
原文:Javascript学习1 - Javascript中的类型对象 1.1关于Numbers对象. 常用的方法:number.toString() 不用具体介绍,把数字转换为字符串,相应的还有一个 ...
- JavaScript中值类型和引用类型的区别
JavaScript的数据类型分为两类:原始类型和对象类型.其中,原始类型包括:数字.字符串和布尔值.此外,JavaScript中还有两个特殊的原始值:null和undefined,它们既不是数字也不 ...
- javascript 中的类型
javascript 中的类型 js 是一门弱语言,各式各样的错误多种多样,特别是确定返回值有问题的时候,你会用什么来进行表示错误? 我一般有三个选择: null '' error {} 第一个选择 ...
- JavaScript中Float类型保留两位小数
JavaScript中Float类型保留两位小数 核心方法: num:要操作的数字 size:要保留的位数 parseFloat(num).toFixed(size); 实现代码如下:var ...
- JavaScript中值类型与引用类型
JavaScript中的变量类型有哪些? 值类型:字符串(string).数值(number).布尔值(boolean).null.undefined 引用类型:对象(Object).数组(Array ...
- 编程笔记:JavaScript 中的类型检查
在Badoo的时候我们写了大量的JS脚本,光是在我们的移动web客户端上面就有大概60000行,可想而知,维护这么多JS可是相当具有挑战性的.在写如上规模js脚本客户端应用的时候我们必须对一件事保持警 ...
- 浅谈 JavaScript 中 Array 类型的方法使用
前言:Array 类型是 JavaScript 中除了 Object 类型以外最常用的类型. 一.创建数组 JavaScript 中的数组与其他语言中的数组有着很大的区别.例如Java.PHP等语言中 ...
- 【你不知道的javaScript 中卷 笔记1】javaScript中的类型与值
一.类型与值 1.0 javaScript 七种内置类型: 空值(null) 未定义(undefined) 布尔值( boolean) 数字(number) 字符串(string) 对象(object ...
随机推荐
- Windows-009-Win7 操作系统安装图文详解
此文主要讲述 Win7 操作系统的安装,配以详细的图文介绍,希望能对亲有所帮助,若有不足之处,敬请大神指正,不胜感激! 若是亲在虚拟机(VirtualBox)中安装 Win7,其前期虚拟硬件系统的操作 ...
- django GET POST
django需要读取客户端get和post请求的值.读取处理方法和异常记录于此. 参考链接: http://stackoverflow.com/questions/12518517/request-p ...
- 怎么使用git来管理项目版本?
怎么使用git来管理项目版本和存放代码? 作者:rongfangliu 转载请注明出处:http://www.cnblogs.com/rongfangliu/p/howuseGit.html 工具: ...
- cat 命令(转)
cat命令的用途是连接文件或标准输入并打印.这个命令常用来显示文件内容,或者将几个文件连接起来显示,或者从标准输入读取内容并显示,它常与重定向符号配合使用. 1.命令格式: cat [选项] [文件] ...
- 30天,O2O速成攻略【8.15长沙站】
活动概况 时间:2015年08月15日13:30-16:30 地点:库可咖啡(长沙市岳麓区阜埠河路139号天马都乐街,湖南大学天马学生公寓东侧) 主办:APICloud.爱立示.兰软 网址:www.a ...
- RabbitMQ学习总结 第二篇:快速入门HelloWorld
目录 RabbitMQ学习总结 第一篇:理论篇 RabbitMQ学习总结 第二篇:快速入门HelloWorld RabbitMQ学习总结 第三篇:工作队列Work Queue RabbitMQ学习总结 ...
- 奥威Power-BI V11——凤凰涅槃,重磅来袭
时隔一年,奥威Power-BI重磅再推新版,在之前V10 WEB可视化前端分析工具基础上,更加注重用户体验这一块.V11站在用户的角度,以用户的视野去设计研发新版本,最终在前端框架的优化.移动设备的体 ...
- iOS 可延展视图(点击前显示部分文字,点击后显示全部)
#import <UIKit/UIKit.h> @interface AppDelegate : UIResponder <UIApplicat ...
- bash变量操作
1.条件变量替换: Bash Shell可以进行变量的条件替换,既只有某种条件发生时才进行替换,替换 条件放在{}中. (1) ${value:-word} 当变量未定义或者值为空时,返回值为word ...
- python pickle 和 shelve模块
pickle和shelve模块都可以把python对象存储到文件中,下面来看看它们的用法吧 1.pickle 写: 以写方式打开一个文件描述符,调用pickle.dump把对象写进去 dn = {'b ...