如何检测JavaScript的各种类型


Posted in Javascript onJuly 30, 2016

一、先介绍下5种原始类型

JavaScript中5种原始类型为stringnumberbooleanundefinednull

var name = "Jack";
var age = 32;
var single = false;
var app;  //undefined

console.log(typeof name);  //string
console.log(typeof age);  //number
console.log(typeof single); //boolean
console.log(typeof app);  //undefined
console.log(typeof null);  //object

发现除null外的其他4种基本类型均可以用typeof来识别:

if(typeof name === "string") { name += "Zhang"; }
if(typeof age === "number") { age++; }
if(typeof single === "boolean" && single) { … }
if(typeof app === "undefined") { app = {}; }

因为typeof null会得到object,所以直接用===来检测null:

if(el === null) { … }

二、对象

JavaScript的对象包括内置对象(Date,RegExp ,Error等)和自定义对象

(注意,Function和Array虽然也都是内置对象,但下一节单独讲)

对象不能像基本类型那样用typeof来检测了,因为检测出来的结果都是object

console.log(typeof new Date());  //object
console.log(typeof new RegExp()); //object
console.log(typeof new Error());  //object
console.log(typeof new Person()); //用typeof检测出自定义对象也是object

要改用instanceof来检测:

var date = new Date();
var reg = new RegExp();
var err = new Error();
var me = new Person();

if(date instanceof Date) {  //检测日期
  year = date.getFullYear(); 
}
if(reg instanceof RegExp) {  //检测正则表达式
  reg.test(...); 
}
if(err instanceof Error) {  //检测异常
  throw err; 
}
if(me instanceof Person) {  //检测自定义对象
  ... 
}

但自定义对象有个问题,假设浏览器frameA里和frameB里都定义了Person。 frameA里定义了me对象,用me instanceof Person检测出来为true。但当自定义对象me传给frameB后,在frameB里instanceof会是false。

本节一开头就说了,Function和Array虽然也都是内置对象,但留到下一节讲。原因就是Function和Array也有和自定义对象相同的上述问题。因此Function和Array一般不用instanceof

三、Function

上面说了用instanceof检测Function不能跨frame。因此用typeof来检测,它可跨frame:

var func = function(){};
if(typeof func === 'function') { … }

但IE8以前用typeof来检测DOM系函数会得到object,因此IE8以前改用in:

console.log(typeof document.getElementById);    //object,不是function
console.log(typeof document.getElementsByTagName); //object,不是function
console.log(typeof document.createElement);     //object,不是function

//IE8以前的IE浏览器,要改用in来检测是否支持DOM函数
if("getElementById" in document) { … }    
if("getElementsByTagName" in document) { … }
if("createElement" in document) { … }

四、Array

上面说了用instanceof检测Array不能跨frame。ES5之前都自定义检测方法。其中最精确的方法:依赖Array的toString会返回固定字符串”[Object Array]”的事实来检测

function isArray(arr) {
  return Object.prototype.toString.call(arr) === "[Object Array]";
}

该方法精确且优雅,因此被很多库所采纳,最终在ES5被作为isArray方法引入了Array,参照MDN。现在你不需要自定义检测方法了,直接用isArray()即可。

其他检测方法,都各有缺陷,不能100%精确。但作为一种思路是可以借鉴的。例如依赖Array是唯一包含sort方法的对象的事实来检测:

function isArray(arr) {
  return typeof arr.sort === "function";
}

如果是自定义对象也定义了sort方法,该方法就失效了。

五、属性

检测属性是否在实例对象中应该用hasOwnProperty。如果你不关心属性是在实例对象中还是在原型对象中,可以简单点用in

例如检测字面量对象属性:

var Person = {
  name: "Jack",
  age: 33
};
if("name" in Person) { … }         //true
if(Person.hasOwnProperty("name")) { … }  //true

例如实例对象属性:

var Person = function (name, age) {
  this.name = name;
  this.age = age;
};
Person.prototype.location = "Shanghai";

var me = new Person("Jack", 33)
if("name" in me) { … }         //true
if(me.hasOwnProperty("name")) { … }  //true
if("location" in me) { … }       //true
if(me.hasOwnProperty("location")) { … }//false

除此之外其他方法都不好:

if (object[propName])      //Not Good,你怎么知道属性值不是0或1?
if (object[propName] === null)    //Not Good,你怎么知道属性值不是null?
if (object[propName] === undefined)  //Not Good,你怎么知道属性值不是undefined?

总结

用typeof检测string,number,boolean,undefined,Function

用===检测null

用isArray()检测Array

用instanceof检测内置对象(除Function和Array)和自定义对象

用hasOwnProperty检测属性是否在实例对象中。如果你不关心属性是在实例对象中还是在原型对象中,可以简单点用in

好了,本篇介绍如何检测JavaScript各种类型的内容就到这里了,希望大家能够认真学习本文的内容,或许对大家学习JavaScript有所帮助。

Javascript 相关文章推荐
JavaScript 定义function的三种方式小结
Oct 16 Javascript
javascript基础知识大集锦(二) 推荐收藏
Jan 13 Javascript
jQuery 实现侧边浮动导航菜单效果
Dec 26 Javascript
js中不同的height, top的区别对比
Sep 24 Javascript
深入学习jQuery Validate表单验证
Jan 18 Javascript
jquery实现简单Tab切换菜单效果
Jul 17 Javascript
jQuery DOM节点的遍历方法小结
Aug 15 jQuery
jsTree事件和交互以及插件plugins详解
Aug 29 Javascript
React Native 搭建开发环境的方法步骤
Oct 30 Javascript
微信小程序事件 bindtap bindinput代码实例
Aug 26 Javascript
countUp.js实现数字滚动效果
Oct 18 Javascript
微信小程序实现弹幕墙(祝福墙)
Nov 18 Javascript
详解js中的apply与call的用法
Jul 30 #Javascript
javascript回到顶部特效
Jul 30 #Javascript
javascript鼠标滑过显示二级菜单特效
Nov 18 #Javascript
避免jQuery名字冲突 noConflict()方法
Jul 30 #Javascript
分享jQuery封装好的一些常用操作
Jul 28 #Javascript
一个仿微博登陆邮箱提示框js开发案例
Jul 28 #Javascript
利用JS实现数字增长
Jul 28 #Javascript
You might like
coreseek 搜索英文的问题详解
2013/06/08 PHP
PHP使用xmllint命令处理xml与html的方法
2014/12/15 PHP
PHP+Mysql+jQuery查询和列表框选择操作实例讲解
2015/10/22 PHP
ExtJS DOM元素操作经验分享
2013/08/28 Javascript
jquery实现多屏多图焦点图切换特效的方法
2015/05/04 Javascript
如何使用angularJs
2017/05/08 Javascript
VUE中v-model和v-for指令详解
2017/06/23 Javascript
vue中使用element-ui进行表单验证的实例代码
2018/06/22 Javascript
解决vue2.0 element-ui中el-upload的before-upload方法返回false时submit()不生效问题
2018/08/24 Javascript
layui添加动态菜单与选项卡
2019/07/26 Javascript
koa2+vue实现登陆及登录状态判断
2019/08/15 Javascript
vue实现随机验证码功能(完整代码)
2019/12/10 Javascript
基于Vue全局组件与局部组件的区别说明
2020/08/11 Javascript
javaScript代码飘红报错看不懂?读完这篇文章再试试
2020/08/19 Javascript
vue+canvas实现拼图小游戏
2020/09/18 Javascript
Python实现从脚本里运行scrapy的方法
2015/04/07 Python
python实现颜色空间转换程序(Tkinter)
2015/12/31 Python
黑科技 Python脚本帮你找出微信上删除你好友的人
2016/01/07 Python
使用python实现个性化词云的方法
2017/06/16 Python
详解python string类型 bytes类型 bytearray类型
2017/12/16 Python
python爬虫实例详解
2018/06/19 Python
python实现Dijkstra静态寻路算法
2019/01/17 Python
Python 实现使用空值进行赋值 None
2020/03/12 Python
Windows下Anaconda安装、换源与更新的方法
2020/04/17 Python
Luxplus丹麦:香水和个人护理折扣
2018/04/23 全球购物
StubHub希腊:购买体育赛事、音乐会和剧院门票
2019/08/03 全球购物
美国工业用品采购网站:Zoro.com
2020/10/27 全球购物
工商管理专业实习生自我鉴定
2013/09/29 职场文书
保洁主管岗位职责
2013/11/20 职场文书
青年志愿者先进事迹
2014/05/06 职场文书
经典禁毒标语
2014/06/16 职场文书
村班子对照检查材料
2014/08/18 职场文书
八项规定整改方案
2014/10/01 职场文书
运动会闭幕词
2015/01/28 职场文书
挂职锻炼个人总结
2015/03/05 职场文书
供应商食品安全承诺书
2015/04/29 职场文书