通过jQuery学习js类型判断的技巧


Posted in jQuery onMay 27, 2019

1. isFunction中typeof的不靠谱

源码:

var isFunction = function isFunction( obj ) {
// Support: Chrome <=57, Firefox <=52
// In some browsers, typeof returns "function" for HTML <object> elements
// (i.e., `typeof document.createElement( "object" ) === "function"`).
// We don't want to classify *any* DOM node as a function.
return typeof obj === "function" && typeof obj.nodeType !== "number";
};

typeof 是为了区分数据类型,下面是MDN中总结的typeof中所有存在的值

通过jQuery学习js类型判断的技巧

问题一:我们都知道typeof null 出来的结果是‘object',可这是为啥呢?MDN给出了答案 :因为null是空指针,而空指针在大多数平台中使用0x00表示,而js在实现初期通过用 0 作为对象的标签,所以对null也被判断为object。

问题二:既然typeof能够判断出function,为何jquery额外判断 typeof obj.nodeType !== "number" 呢?

long long ago,在那些古老的浏览器中:

1. typeof document.body.childNodes // function 这在古老的 safari 3 中会出现

2.typeof document.createElement("object") // function 同理还有 'embed' 'applet' , 在古老的firefox中会出现,目前新版本不会存在

3.typeof /s/ // function 这种情况会在古老浏览器中出现,目前都会被判定为 object

通过以上问题我们可以看出,通过typeof判断数据类型在古老的浏览器中是极为不靠谱的,所以在jquery的isFunction的判断中额外添加了判断 检测对象是否为dom 对象2.靠谱的数据类型判断

源码:

var class2type = {};
var toString = class2type.toString;
// Populate the class2type map,这里并没有undefined
jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ),
function( i, name ) {
class2type[ "[object " + name + "]" ] = name.toLowerCase();
} );
function toType( obj ) {
if ( obj == null ) {
return obj + "";
}
// Support: Android <=2.3 only (functionish RegExp)
return typeof obj === "object" || typeof obj === "function" ?
class2type[ toString.call( obj ) ] || "object" :
typeof obj;
}

在代码中jquery做了这几件事:

1.jquery先提取出toString 这个方法

2.将写好的类型字符串分割并存入class2type中,class2type 数据结构如下:

通过jQuery学习js类型判断的技巧

3.定义toType方法,因为 toString(null)会得出‘ [object Undefined]'的结果,所以需要把null单独判断,注意null是没有toString这个方法的,所以通过 obj+''这个方式得到 'null'

4.在单独判断null后是一个三元运算符:等价于

1 if(typeof obj === "object" || typeof obj === "function"){
2 // 因为上文提到存在typeof /s/ 为 function的情况,所以需要toString详细判断
3 // 对于判断不出的数据类型默认为object
4 retrun class2type[ toString.call( obj ) ] || "object";
5 } else {
6 // 通过上面typeof对类型判断的表格,判断非object function还是很可靠的,所以直接用原生方法
7 return typeof obj;
8 }

结论: 通过用toString方法可以判断出Boolean、Number、 String、 Function、 Array、 Date、 RegExp、 Object、 Error、 Symbol、undefined 这些数据类型,但是并不能判断出null,所以要综合判断,就酱

除此之外jquery还额外判断了当前对象是否为window,只用了如下的方法:

var isWindow = function isWindow( obj ) {
return obj != null && obj === obj.window;
};

前方的obj!=null 是为了防止开发人员在调用函数 isWindow时传入null 、undefined的时候报Uncaught TypeError: Cannot read property 'window' of null/undefined的错误。

还有isArrayLike,判断当前对象是不是类数组对象,类数组对象是什么,建议大家百度一下

function isArrayLike( obj ) {
// Support: real iOS 8.2 only (not reproducible in simulator)
// `in` check used to prevent JIT error (gh-2145)
// hasOwn isn't used here due to false negatives
// regarding Nodelist length in IE
var length = !!obj && "length" in obj && obj.length,
type = toType( obj );
if ( isFunction( obj ) || isWindow( obj ) ) {
return false;
}
return type === "array" || length === 0 ||
typeof length === "number" && length > 0 && ( length - 1 ) in obj;
}

首先判断obj中是否有length属性并取出length

然后排除obj是否是window 及 function

最后取值条件:1.是否是array(类数组对象集合当然包括数组) 2.存在length属性但length是0 3.判定length是数字且大于零,并在obj对象中存在length-1属性

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

jQuery 相关文章推荐
jQuery源码解读之extend()与工具方法、实例方法详解
Mar 30 jQuery
jquery dataTable 后台加载数据并分页实例代码
Jun 07 jQuery
jQuery选择器之属性过滤选择器详解
Sep 28 jQuery
jQuery实现动态显示select下拉列表数据的方法
Feb 05 jQuery
jQuery+Cookie实现切换皮肤功能【附源码下载】
Mar 25 jQuery
jQuery实现的电子时钟效果完整示例
Apr 28 jQuery
基于jQuery实现无缝轮播与左右点击效果
May 13 jQuery
jQuery的Ajax接收java返回数据方法
Aug 11 jQuery
使用jquery模拟a标签的click事件无法实现跳转的解决
Dec 04 jQuery
Easyui 关闭jquery-easui tab标签页前触发事件的解决方法
Apr 28 jQuery
jQuery实现图片随机切换、抽奖功能(实例代码)
Oct 23 jQuery
jQuery实现动态向上滚动
Dec 21 jQuery
jQuery中使用validate插件校验表单功能
May 24 #jQuery
jQuery操作attr、prop、val()/text()/html()、class属性
May 23 #jQuery
jquery+php后台实现省市区联动功能示例
May 23 #jQuery
jQuery Migrate 插件用法实例详解
May 22 #jQuery
jQuery实现的鼠标拖动画矩形框示例【可兼容IE8】
May 17 #jQuery
jQuery实现的点击显示隐藏下拉菜单功能完整示例
May 17 #jQuery
jQuery控制input只能输入数字和两位小数的方法
May 16 #jQuery
You might like
PHP析构函数destruct与垃圾回收机制的讲解
2019/03/22 PHP
Thinkphp 3.2框架使用Redis的方法详解
2019/10/24 PHP
jquery 应用代码 方便的排序功能
2010/02/06 Javascript
有关于JS辅助函数inherit()的问题
2013/04/07 Javascript
js传中文参数controller里获取参数乱码问题解决方法
2014/01/03 Javascript
jQuery的DOM操作之删除节点示例
2014/01/03 Javascript
浅谈JS日期(Date)处理函数
2014/12/07 Javascript
Bootstrap每天必学之警告框插件
2016/04/26 Javascript
BootStrap智能表单实战系列(七)验证的支持
2016/06/13 Javascript
微信小程序 loading 详解及实例代码
2016/11/09 Javascript
javascript中的try catch异常捕获机制用法分析
2016/12/14 Javascript
ES6概念 Symbol toString()方法
2016/12/25 Javascript
JavaScript编写的网页小游戏,很给力
2017/08/18 Javascript
详解tween.js的使用教程
2017/09/14 Javascript
vue-cli2.9.3 详细教程
2018/04/23 Javascript
彻底弄懂 JavaScript 执行机制
2018/10/23 Javascript
JavaScript实现新年倒计时效果
2018/11/17 Javascript
javascript设计模式 ? 抽象工厂模式原理与应用实例分析
2020/04/09 Javascript
javascript前端和后台进行数据交互方法示例
2020/08/07 Javascript
python实现生命游戏的示例代码(Game of Life)
2018/01/24 Python
Python3使用Matplotlib 绘制精美的数学函数图形
2019/04/11 Python
Python reshape的用法及多个二维数组合并为三维数组的实例
2020/02/07 Python
Python多进程multiprocessing、进程池用法实例分析
2020/03/24 Python
解决启动django,浏览器显示“服务器拒绝访问”的问题
2020/05/13 Python
Django框架实现在线考试系统的示例代码
2020/11/30 Python
春秋航空官方网站:Spring Airlines
2017/09/27 全球购物
KENZO官网:高田贤三在法国创立的品牌
2019/05/16 全球购物
屈臣氏马来西亚官网:Watsons马来西亚
2019/06/15 全球购物
2014学年自我鉴定
2014/02/23 职场文书
新教师培训方案
2014/06/08 职场文书
2014年后勤管理工作总结
2014/12/01 职场文书
2015年秋季小班开学寄语
2015/05/27 职场文书
学校运动会通讯稿
2015/07/18 职场文书
导游词之西湖雷峰塔
2019/09/18 职场文书
python实战之90行代码写个猜数字游戏
2021/04/22 Python
pytorch 实现在测试的时候启用dropout
2021/05/27 Python