详解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 相关文章推荐
游戏人文件夹程序 ver 4.03
Jul 14 Javascript
firefox中用javascript实现鼠标位置的定位
Jun 17 Javascript
javascript与asp.net(c#)互相调用方法
Dec 13 Javascript
如何在一个页面显示多个百度地图
Apr 07 Javascript
jQuery计算textarea中文字数(剩余个数)的小程序
Nov 28 Javascript
jQuery遍历之next()、nextAll()方法使用实例
Nov 08 Javascript
jquery实现浮动在网页右下角的彩票开奖公告窗口代码
Sep 04 Javascript
全面解析JavaScript的Backbone.js框架中的Router路由
May 05 Javascript
详解vue嵌套路由-query传递参数
May 23 Javascript
JS实现访问DOM对象指定节点的方法示例
Apr 04 Javascript
微信小程序实现漂亮的弹窗效果
May 26 Javascript
Vue2项目中对百度地图的封装使用详解
Jun 16 Vue.js
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实现获取近几日、月时间示例
2019/07/06 PHP
对textarea框的代码调试,而且功能上使用非常方便,酷
2006/06/30 Javascript
javascript cookie操作类的实现代码小结附使用方法
2010/06/02 Javascript
如何判断鼠标是否在DIV的区域内
2013/11/13 Javascript
JS连接SQL数据库与ACCESS数据库的方法实例
2013/11/21 Javascript
js动态拼接正则表达式的两种方法
2014/03/04 Javascript
用js将内容复制到剪贴板兼容浏览器
2014/03/18 Javascript
nodejs实现获取当前url地址及url各种参数值
2015/06/25 NodeJs
JavaScript实现斗地主游戏的思路
2016/02/29 Javascript
jQuery实现标签页效果实战(4)
2017/02/08 Javascript
js时间戳和c#时间戳互转方法(推荐)
2017/02/15 Javascript
使用async-validator编写Form组件的方法
2018/01/10 Javascript
Bootstrap4如何定制自己的颜色和风格
2018/02/26 Javascript
Vue数据双向绑定的深入探究
2018/11/27 Javascript
通过cordova将vue项目打包为webapp的方法
2019/02/02 Javascript
NestJs 静态目录配置详解
2019/03/12 Javascript
vue学习笔记五:在vue项目里面使用引入公共方法详解
2019/04/04 Javascript
微信小程序实现批量倒计时功能
2020/11/01 Javascript
深入理解redux之compose的具体应用
2020/01/12 Javascript
antd中table展开行默认展示,且不需要前边的加号操作
2020/11/02 Javascript
Angular处理未可知异常错误的方法详解
2021/01/17 Javascript
python3.6 +tkinter GUI编程 实现界面化的文本处理工具(推荐)
2017/12/20 Python
Python短信轰炸的代码
2020/03/25 Python
Tensorflow--取tensorf指定列的操作方式
2020/06/30 Python
Python实现迪杰斯特拉算法过程解析
2020/09/18 Python
35款精致的 CSS3 和 HTML5 网页模板 推荐
2012/08/03 HTML / CSS
HTML页面中添加Canvas标签示例
2015/01/01 HTML / CSS
DBA的职责都有哪些
2012/05/16 面试题
试述DBMS的主要功能
2016/11/13 面试题
应届优秀本科大学毕业生自我鉴定
2014/01/21 职场文书
国窖1573广告词
2014/03/21 职场文书
市政管理求职信范文
2014/05/07 职场文书
有限公司股东合作协议书
2014/10/29 职场文书
冰峪沟导游词
2015/02/09 职场文书
售后前台接待岗位职责
2015/04/03 职场文书
农村老人去世追悼词
2015/06/23 职场文书