详解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 相关文章推荐
js实现的仿新浪微博完美的时间组件升级版
Dec 20 Javascript
jquery实现微博文字输入框 输入时显示输入字数 效果实现
Jul 12 Javascript
Jquery创建层显示标题和内容且随鼠标移动而移动
Jan 26 Javascript
js使用Array.prototype.sort()对数组对象排序的方法
Jan 28 Javascript
jQuery实现长按按钮触发事件的方法
Feb 02 Javascript
JavaScript实现控制打开文件另存为对话框的方法
Apr 17 Javascript
关于js里的this关键字的理解
Aug 17 Javascript
ClearTimeout消除闪动实例代码
Feb 29 Javascript
js贪吃蛇游戏实现思路和源码
Apr 14 Javascript
关于javascript中限定时间内防止按钮重复点击的思路详解
Aug 16 Javascript
Vue自定义toast组件的实例代码
Aug 15 Javascript
vue-router重定向和路由别名的使用讲解
Jan 19 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输出英文时间日期的安全方法(RFC 1123格式)
2014/06/13 PHP
php 无限分类 树形数据格式化代码
2016/10/11 PHP
datePicker——日期选择控件(with jquery)
2007/02/20 Javascript
iis6+javascript Add an Extension File
2007/06/13 Javascript
jquery 单引号和双引号的区别及使用注意
2013/07/31 Javascript
登陆成功后自动计算秒数执行跳转
2014/01/23 Javascript
js淡入淡出焦点图幻灯片效果代码分享
2015/09/08 Javascript
JS表格组件神器bootstrap table详解(强化版)
2016/05/26 Javascript
Bootstrap文件上传组件之bootstrap fileinput
2016/11/25 Javascript
javascript判断回文数详解及实现代码
2017/02/03 Javascript
jQuery插件zTree实现获取当前选中节点在同级节点中序号的方法
2017/03/08 Javascript
Vue.js 父子组件通信的十种方式
2018/10/30 Javascript
vue elementUI table 自定义表头和行合并的实例代码
2019/05/22 Javascript
jQuery zTree插件使用简单教程
2019/08/16 jQuery
webpack 如何解析代码模块路径的实现
2019/09/04 Javascript
使用layui定义一个模块并使用的例子
2019/09/14 Javascript
vue组件传值的实现方式小结【三种方式】
2020/02/05 Javascript
python实现数通设备端口监控示例
2014/04/02 Python
Python排序搜索基本算法之归并排序实例分析
2017/12/08 Python
Python之pymysql的使用小结
2019/07/01 Python
PyCharm搭建Spark开发环境的实现步骤
2019/09/05 Python
深入浅析Python 中的sklearn模型选择
2019/10/12 Python
美国背景检查、公共记录和人物搜索网站:BeenVerified
2018/02/25 全球购物
Oracle里面常用的数据字典有哪些
2014/02/14 面试题
大学生专业个人学习的自我评价
2013/10/26 职场文书
历史专业个人求职信范文
2013/12/07 职场文书
2015年元旦文艺汇演主持词
2014/03/26 职场文书
领导班子自我剖析材料
2014/08/16 职场文书
医院见习报告范文
2014/11/03 职场文书
2015年教师自我评价范文
2015/03/04 职场文书
幼儿园小班工作总结2015
2015/04/25 职场文书
丧事酒宴答谢词
2015/09/30 职场文书
大学毕业生自我鉴定范文
2019/06/21 职场文书
如何书写民事调解协议书?
2019/06/25 职场文书
如何将numpy二维数组中的np.nan值替换为指定的值
2021/05/14 Python
vue+springboot实现登录验证码
2021/05/27 Vue.js