如何检测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 相关文章推荐
HTML TO JavaScript 转换
Jun 26 Javascript
google地图的路线实现代码
Aug 20 Javascript
详解JavaScript基本类型和引用类型
Dec 09 Javascript
jQuery简单入门示例之用户校验demo示例
Jul 09 Javascript
纯JS实现可拖拽表单的简单实例
Sep 02 Javascript
jQuery动态添加与删除tr行实例代码
Oct 18 Javascript
利用fecha进行JS日期处理
Nov 21 Javascript
canvas压缩图片转换成base64格式输出文件流
Mar 09 Javascript
微信、QQ、微博、Safari中使用js唤起App
Jan 24 Javascript
Vue的H5页面唤起支付宝支付功能
Apr 18 Javascript
对node通过fs模块判断文件是否是文件夹的实例讲解
Jun 10 Javascript
layui 解决form表单点击无反应的问题
Oct 25 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
一些花式咖啡的配方
2021/03/03 冲泡冲煮
织梦模板标记简介
2007/03/11 PHP
解析php中两种缩放图片的函数,为图片添加水印
2013/06/14 PHP
php发送post请求函数分享
2014/03/06 PHP
php使用iconv中文截断问题的解决方法
2015/02/11 PHP
php单例模式实现方法分析
2015/03/14 PHP
学习php设计模式 php实现访问者模式(Visitor)
2015/12/07 PHP
Thinkphp3.2实用篇之计算型验证码示例
2017/02/09 PHP
关于Yii中模型场景的一些简单介绍
2019/09/22 PHP
bootstrap网页框架的使用方法
2016/05/10 Javascript
canvas实现十二星座星空图
2017/02/14 Javascript
Angular-Ui-Router+ocLazyLoad动态加载脚本示例
2017/03/02 Javascript
Javascript中八种遍历方法的执行速度深度对比
2017/04/25 Javascript
对angular 监控数据模型变化的事件方法$watch详解
2018/10/09 Javascript
微信公众平台 发送模板消息(Java接口开发)
2019/04/17 Javascript
JS实现横向轮播图(初级版)
2020/06/24 Javascript
JavaScript实现猜数字游戏
2020/05/20 Javascript
js实现简单音乐播放器
2020/06/30 Javascript
Vue.js暴露方法给WebView的使用操作
2020/09/07 Javascript
Python中获取对象信息的方法
2015/04/27 Python
Python多线程threading和multiprocessing模块实例解析
2018/01/29 Python
python 将print输出的内容保存到txt文件中
2018/07/17 Python
使用python画社交网络图实例代码
2019/07/10 Python
用Python在Excel里画出蒙娜丽莎的方法示例
2020/04/28 Python
Django正则URL匹配实现流程解析
2020/11/13 Python
纯CSS实现的大小渐变、渐远效果
2014/04/15 HTML / CSS
英国和世界各地鲜花速递专家:Arena Flowers
2018/02/10 全球购物
南京迈特望C/C++面试题
2012/07/09 面试题
事业单位竞聘上岗实施方案
2014/03/28 职场文书
《宿建德江》教学反思
2014/04/23 职场文书
8和9的加减法教学反思
2014/05/01 职场文书
2014年个人业务工作总结
2014/11/17 职场文书
英语教师求职信范文
2015/03/20 职场文书
教师节大会主持词
2015/07/06 职场文书
关于社会实践的心得体会(2016最新版)
2016/01/25 职场文书
Java新手教程之ArrayList的基本使用
2021/06/20 Java/Android