详解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 相关文章推荐
分享20款好玩的jQuery游戏
Apr 17 Javascript
JS动态添加option和删除option(附实例代码)
Apr 01 Javascript
JS过滤url参数特殊字符的实现方法
Dec 24 Javascript
介绍一个简单的JavaScript类框架
Jun 24 Javascript
详解JavaScript实现设计模式中的适配器模式的方法
May 18 Javascript
jQuery学习笔记——jqGrid的使用记录(实现分页、搜索功能)
Nov 09 Javascript
基于zTree树形菜单的使用实例
Dec 25 Javascript
Vue+Express实现登录注销功能的实例代码
May 05 Javascript
手把手教你使用TypeScript开发Node.js应用
May 06 Javascript
Vue项目中如何使用Axios封装http请求详解
Oct 23 Javascript
JavaScript Tab菜单实现过程解析
May 13 Javascript
Vue实现手机计算器
Aug 17 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中static关键字原理的学习研究分析
2011/07/18 PHP
关于更改Zend Studio/Eclipse代码风格主题的介绍
2013/06/23 PHP
VB中的RasEnumConnections函数返回632错误解决方法
2014/07/29 PHP
php实现的生成排列算法示例
2019/07/25 PHP
extjs form textfield的隐藏方法
2008/12/29 Javascript
基于jquery的blockui插件显示弹出层
2011/04/14 Javascript
对象无length属性时IE6/IE7中无法将其转换成伪数组(ArrayLike)
2011/07/31 Javascript
使用javascipt---实现二分查找法
2013/04/10 Javascript
PHP+MySQL+jQuery随意拖动层并即时保存拖动位置实例讲解
2015/10/09 Javascript
简单的jQuery banner图片轮播实例代码
2016/03/04 Javascript
JS控制FileUpload的上传文件类型实例代码
2016/10/07 Javascript
jquery 判断div show的状态实例
2016/12/03 Javascript
jquery拼接ajax 的json和字符串拼接的方法
2017/03/11 Javascript
AngularJS基于factory创建自定义服务的方法详解
2017/05/25 Javascript
Angular.js中$resource高大上的数据交互详解
2017/07/30 Javascript
React-Native做一个文本输入框组件的实现代码
2017/08/10 Javascript
vue组件实现文字居中对齐的方法
2017/08/23 Javascript
详解node单线程实现高并发原理与node异步I/O
2017/09/21 Javascript
javascript将json格式数组下载为excel表格的方法
2017/12/22 Javascript
JS求Number类型数组中最大元素方法
2018/04/08 Javascript
Angular网络请求的封装方法
2018/05/22 Javascript
vue使用better-scroll实现下拉刷新、上拉加载
2018/11/23 Javascript
python 获取文件列表(或是目录例表)
2009/03/25 Python
Python使用pandas处理CSV文件的实例讲解
2018/06/22 Python
在dataframe两列日期相减并且得到具体的月数实例
2018/07/03 Python
python中tab键是什么意思
2020/06/18 Python
会计专业毕业生求职信分享
2014/01/03 职场文书
公司成立感言
2014/01/11 职场文书
高三体育教学反思
2014/01/29 职场文书
一帮一活动总结
2014/05/08 职场文书
高中军训的心得体会
2014/09/01 职场文书
2014年会计人员工作总结
2014/12/10 职场文书
党员民主生活会材料
2014/12/15 职场文书
2015年药店店长工作总结
2015/04/29 职场文书
Python Pandas读取Excel日期数据的异常处理方法
2022/02/28 Python
Mysql表数据比较大情况下修改添加字段的方法实例
2022/06/28 MySQL