如何检测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 相关文章推荐
超级24小时弹窗代码 24小时退出弹窗代码 100%弹窗代码(IE only)
Jun 11 Javascript
P3P Header解决Cookie跨域的问题
Mar 12 Javascript
JavaScript框架(iframe)操作总结
Apr 16 Javascript
javascript实现十六进制颜色值(HEX)和RGB格式相互转换
Jun 20 Javascript
jquery.map()方法的使用详解
Jul 09 Javascript
jQuery遍历节点树方法分析
Sep 08 Javascript
微信小程序 教程之WXML
Oct 18 Javascript
vue中的scope使用详解
Oct 29 Javascript
Vue+Express实现登录注销功能的实例代码
May 05 Javascript
vue.js中导出Excel表格的案例分析
Jun 11 Javascript
JS如何在不同平台实现多语言方式
Jul 16 Javascript
Vue select 绑定动态变量的实例讲解
Oct 22 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
一个简单的PHP投票程序源码
2007/03/11 PHP
a标签的css样式四个状态
2021/03/09 HTML / CSS
How to Auto Include a Javascript File
2007/02/02 Javascript
[原创]提供复制本站内容时出现,该文章转自脚本之家等字样的js代码
2007/03/27 Javascript
JS 事件绑定函数代码
2010/04/28 Javascript
javascript 弹出窗口中是否显示地址栏的实现代码
2011/04/14 Javascript
JavaScript中数组的排序、乱序和搜索实现代码
2011/11/30 Javascript
jQuery 开发者应该注意的9个错误
2012/05/03 Javascript
利用js实现遮罩以及弹出可移动登录窗口
2013/07/08 Javascript
js如何调用qq互联api实现第三方登录
2014/03/28 Javascript
Javascript实现简单的富文本编辑器附演示
2014/06/16 Javascript
js调试工具Console命令详解
2014/10/21 Javascript
javascript鼠标滑动评分控件完整实例
2015/05/13 Javascript
JavaScript中闭包之浅析解读(必看篇)
2016/08/25 Javascript
微信小程序图表插件(wx-charts)实例代码
2017/01/17 Javascript
在vue-cli项目中使用bootstrap的方法示例
2018/04/21 Javascript
Node.js 使用jade模板引擎的示例
2018/05/11 Javascript
vue请求数据的三种方式
2020/03/04 Javascript
vue 使用 v-model 双向绑定父子组件的值遇见的问题及解决方案
2021/03/01 Vue.js
Python脚本简单实现打开默认浏览器登录人人和打开QQ的方法
2016/04/12 Python
python中format()函数的简单使用教程
2018/03/14 Python
简单了解python中对象的取反运算符
2019/07/01 Python
使用python对多个txt文件中的数据进行筛选的方法
2019/07/10 Python
python 装饰器功能与用法案例详解
2020/03/06 Python
flask项目集成swagger的方法
2020/12/09 Python
美国真皮手袋品牌:GiGi New York
2017/03/10 全球购物
Simons官方网站:加拿大时尚零售商
2020/02/20 全球购物
函授本科毕业自我鉴定
2013/10/09 职场文书
最经典的大学生职业生涯规划范文
2014/03/05 职场文书
银行先进个人事迹材料
2014/05/11 职场文书
农村党建工作汇报材料
2014/10/27 职场文书
仓库保管员岗位职责
2015/02/09 职场文书
《夜莺的歌声》教学反思
2016/02/22 职场文书
python实战之90行代码写个猜数字游戏
2021/04/22 Python
HTML中的表单元素介绍
2022/02/28 HTML / CSS
nginx sticky实现基于cookie负载均衡示例详解
2022/12/24 Servers