详解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 相关文章推荐
JQuery的一些小应用收集
Mar 27 Javascript
jQuery(1.6.3) 中css方法对浮动的实现缺陷分析
Sep 09 Javascript
Javascript闭包用法实例分析
Jan 23 Javascript
Node.js 异步编程之 Callback介绍(一)
Mar 30 Javascript
网页从弹窗页面单选框传值至父页面代码分享
Sep 29 Javascript
jquery简单插件制作(fn.extend)完整实例
May 24 Javascript
JS代码实现table数据分页效果
May 26 Javascript
jQuery实现的动态文字变化输出效果示例【附演示与demo源码下载】
Mar 24 jQuery
JS使用栈判断给定字符串是否是回文算法示例
Mar 04 Javascript
微信小程序实现侧边分类栏
Oct 21 Javascript
前端深入理解Typescript泛型概念
Mar 09 Javascript
在vue中给后台接口传的值为数组的格式代码
Nov 12 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文件注释标记及规范小结
2012/04/01 PHP
PHP中in_array函数使用的问题与解决办法
2016/09/11 PHP
TP5(thinkPHP5框架)实现显示错误信息及行号功能的方法
2019/06/03 PHP
php操作redis常见方法示例【key与value操作】
2020/04/14 PHP
用js做一个小游戏平台 (一)
2009/12/29 Javascript
NodeJS框架Express的模板视图机制分析
2011/07/19 NodeJs
javascrip关于继承的小例子
2013/05/10 Javascript
使用jquery hover事件实现表格的隔行换色功能示例
2013/09/03 Javascript
基于JS模仿windows文件按名称排序效果
2016/06/29 Javascript
jquery 实现回车登录详解及实例代码
2016/10/23 Javascript
Node.js中的http请求客户端示例(request client)
2017/05/04 Javascript
vue2中filter()的实现代码
2017/07/09 Javascript
VUE2.0中Jsonp的使用方法
2018/05/22 Javascript
NodeJS 中Stream 的基本使用
2018/07/30 NodeJs
Vue常用的几个指令附完整案例
2018/11/06 Javascript
[01:03:51]2018DOTA2亚洲邀请赛 4.7 淘汰赛 VP vs LGD 第三场
2018/04/09 DOTA
[01:14:31]Secret vs VG 2018国际邀请赛淘汰赛BO3 第一场 8.23
2018/08/24 DOTA
跟老齐学Python之集合的关系
2014/09/24 Python
Python 专题一 函数的基础知识
2017/03/16 Python
利用python实现简单的循环购物车功能示例代码
2017/07/05 Python
Python使用wget实现下载网络文件功能示例
2018/05/31 Python
python3中rank函数的用法
2019/11/27 Python
解决TensorFlow模型恢复报错的问题
2020/02/06 Python
美国性感女装网站:bebe
2017/03/04 全球购物
jurlique茱莉蔻英国官网:澳洲天然护肤品
2018/08/03 全球购物
XMLHttpRequest对象在IE和Firefox中创建方式有没有不同
2016/03/23 面试题
四群教育工作实施方案
2014/03/26 职场文书
幼儿教师师德演讲稿
2014/05/06 职场文书
学校教研活动总结
2014/07/02 职场文书
医药销售自我评价200字
2014/09/11 职场文书
秋季校运会广播稿100字
2014/09/18 职场文书
预备党员群众路线思想汇报2014
2014/10/25 职场文书
小学感恩主题班会
2015/08/12 职场文书
《给予树》教学反思
2016/03/03 职场文书
教你如何用python开发一款数字推盘小游戏
2021/04/14 Python
使用Python开发冰球小游戏
2022/04/30 Python