详解js类型判断


Posted in Javascript onMay 22, 2018

js类型转换中typeof会将null也识别为object, 而且返回的类型比少,我们用Object.prototype.toString来实现

第一版

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

function isFunction(value){
  return Object.prototype.toString.call(value) === "[object Function]";
}

但是这样写,一个个去判断数组,函数,对象的话很麻烦,比较过程化

第二版

我们想用type(obj)的方式返回对应的类型字符串,因为typeof是小写,所以我们也返回小写的标准

function type(obj){
  // -1 代表截止到倒数一位
  return Object.prototype.toString.call(obj).slice(8,-1).toLowerCase()
}

type([]) // "array"

但是这样每次都需要对判断的类型进行slice和toLowerCase也是比较耗性能的, 而且判断类型只有几种,所以我们可以用对象提前将可能的结果缓存起来

第三版

//将types放外面 而不是放在type函数里面, 利用闭包,优化性能,不用每次判断都声明一次typess
var types = {
  '[object Function]': 'function',
  '[object Number]': 'number',
  ...
}

function type(obj) {
  var str = Object.prototype.toString.call(obj)
  return types[str]
}

当然上面的types我们还可以这样优化

// 参考自jquery源码
var types = {}
当然也可以直接用数组存储
"Boolean Number String Function Array Date RegExp Object Error".split(" ").forEach(function(e,i){
  types [ "[object " + e + "]" ] = e.toLowerCase();
}) ;

判断window对象

利用window对象的window属性等于自身

function isWindow( obj ) {
  // obj !== undefined 是为了防止没传参数的时候后面报错
  // Uncaught TypeError: Cannot read property 'window' of undefined的错误
  
  return obj !== undefined && obj === obj.window;
}

判断是不是dom元素

isElement = function(obj) {
  return !!(obj && obj.nodeType === 1);
}
Javascript 相关文章推荐
对YUI扩展的Gird组件 Part-1
Mar 10 Javascript
Javascript 兼容firefox的一些问题
May 21 Javascript
js清空form表单中的内容示例
May 20 Javascript
node.js中的buffer.Buffer.isBuffer方法使用说明
Dec 14 Javascript
jQuery插件PageSlide实现左右侧栏导航菜单
Apr 12 Javascript
JQuery插件jcarousellite的参数中文说明
May 11 Javascript
JavaScript之AOP编程实例
Jul 17 Javascript
js实现图片无缝滚动
Dec 23 Javascript
JavaScript设计模式初探
Jan 07 Javascript
jQuery实现的鼠标滑过弹出放大图片特效
Jan 08 Javascript
微信小程序返回多级页面的实现方法
Oct 27 Javascript
bootstrap-closable-tab可实现关闭的tab标签页插件
Aug 09 Javascript
vue.js过滤器+ajax实现事件监听及后台php数据交互实例
May 22 #Javascript
swiper 自动图片无限轮播实现代码
May 21 #Javascript
JS动态插入脚本和插入引用外部链接脚本的方法
May 21 #Javascript
通过jquery toggleClass()属性制作文章段落更改背景颜色
May 21 #jQuery
基于Vue的延迟加载插件vue-view-lazy
May 21 #Javascript
jQuery获取随机颜色的实例代码
May 21 #jQuery
JS实现常见的查找、排序、去重算法示例
May 21 #Javascript
You might like
PHP图片等比例缩放生成缩略图函数分享
2014/06/10 PHP
php Imagick获取图片RGB颜色值
2014/07/28 PHP
PHP实现动态执行代码的方法
2016/03/25 PHP
PHP微信开发用Cache 解决数据缓存
2016/07/11 PHP
jQuery判断复选框是否勾选的原理及示例
2014/05/21 Javascript
JavaScript 事件对象介绍
2015/04/13 Javascript
jquery模拟多级复选框效果的简单实例
2016/06/08 Javascript
微信小程序购物商城系统开发系列-目录结构介绍
2016/11/21 Javascript
EasyUI学习之DataGird分页显示数据
2016/12/29 Javascript
javascript实现QQ空间相册展示源码
2017/12/12 Javascript
vue 实现全选全不选的示例代码
2018/03/29 Javascript
JavaScript中发出HTTP请求最常用的方法
2018/07/12 Javascript
JavaScript"模拟事件"的注意要点详解
2019/02/13 Javascript
vue.config.js中配置Vue的路径别名的方法
2020/02/11 Javascript
[00:36]DOTA2上海特级锦标赛 LGD战队宣传片
2016/03/04 DOTA
github配置使用指南
2014/11/18 Python
requests和lxml实现爬虫的方法
2017/06/11 Python
浅析python中的迭代与迭代对象
2018/10/08 Python
一看就懂得Python的math模块
2018/10/21 Python
libreoffice python 操作word及excel文档的方法
2019/07/04 Python
Tensorflow中的图(tf.Graph)和会话(tf.Session)的实现
2020/04/22 Python
亚历山大·王官网:Alexander Wang
2017/06/23 全球购物
Theory美国官网:后现代都市风时装品牌
2018/05/09 全球购物
恶意软件的定义
2014/11/12 面试题
高一历史教学反思
2014/01/13 职场文书
《荷花》教学反思
2014/04/16 职场文书
锦旗标语大全
2014/06/23 职场文书
月度优秀员工获奖感言
2014/08/16 职场文书
2014红色之旅心得体会
2014/10/07 职场文书
2014年初三班主任工作总结
2014/12/05 职场文书
优秀员工自荐书
2015/03/06 职场文书
英文产品推荐信
2015/03/27 职场文书
反腐倡廉心得体会2016
2016/01/13 职场文书
Python基于Opencv识别两张相似图片
2021/04/25 Python
Python趣味挑战之给幼儿园弟弟生成1000道算术题
2021/05/28 Python
elementui的el-popover修改样式不生效的解决
2021/06/30 Javascript