通过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中ajax请求后台数据成功后既不执行success也不执行error的完美解决方法
Dec 24 jQuery
jquery 获取索引值在一定范围的列表方法
Jan 25 jQuery
jQuery zTree搜索-关键字查询 递归无限层功能实现代码
Jan 25 jQuery
集成vue到jquery/bootstrap项目的方法
Feb 10 jQuery
JS实现点击生成UUID的方法完整实例【基于jQuery】
Jun 12 jQuery
jquery-ui 进度条功能示例【测试可用】
Jul 25 jQuery
9种方法优化jQuery代码详解
Feb 04 jQuery
JQuery事件冒泡和默认行为代码实例
May 13 jQuery
JQuery插件tablesorter表格排序实现过程解析
May 28 jQuery
基于jquery实现彩色投票进度条代码解析
Aug 26 jQuery
jQuery实现手风琴特效
Jan 11 jQuery
html5以及jQuery实现本地图片上传前的预览代码实例讲解
Mar 01 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
CI框架中$this-&gt;load-&gt;library()用法分析
2016/05/18 PHP
PHP实现Session入库/存入redis的方法
2017/05/04 PHP
基于JavaScript实现Json数据根据某个字段进行排序
2015/11/24 Javascript
node.js利用redis数据库缓存数据的方法
2017/03/01 Javascript
Node.js Koa2使用JWT进行鉴权的方法示例
2018/08/17 Javascript
mpvue开发音频类小程序踩坑和建议详解
2019/03/12 Javascript
[03:54]Ehome出征西雅图 回顾2016国际邀请赛晋级之路
2016/08/02 DOTA
Python实现的一个找零钱的小程序代码分享
2014/08/25 Python
Python实现的根据IP地址计算子网掩码位数功能示例
2018/05/23 Python
django.db.utils.ProgrammingError: (1146, u“Table‘’ doesn’t exist”)问题的解决
2018/07/13 Python
python调用java的jar包方法
2018/12/15 Python
Python面向对象进阶学习
2019/05/21 Python
python实现月食效果实例代码
2019/06/18 Python
浅谈pycharm使用及设置方法
2019/09/09 Python
Python浮点数四舍五入问题的分析与解决方法
2019/11/19 Python
python-sys.stdout作为默认函数参数的实现
2020/02/21 Python
python环境下安装opencv库的方法
2020/03/05 Python
完美解决pyinstaller打包报错找不到依赖pypiwin32或pywin32-ctypes的错误
2020/04/01 Python
Python json读写方式和字典相互转化
2020/04/18 Python
Python logging模块写入中文出现乱码
2020/05/21 Python
Python不支持 i ++ 语法的原因解析
2020/07/22 Python
HTML5 Canvas实现玫瑰曲线和心形图案的代码实例
2014/04/10 HTML / CSS
马歇尔耳机官网:Marshall Headphones
2020/02/04 全球购物
应届毕业生如何写求职信
2014/02/16 职场文书
绩效工资实施方案
2014/03/15 职场文书
淘宝好评语大全
2014/05/05 职场文书
弘扬民族精神演讲稿
2014/05/07 职场文书
法定代表人身份证明书
2014/09/10 职场文书
在职证明书范本(2014新版)
2014/09/25 职场文书
护士长2014年度工作总结
2014/11/11 职场文书
Python自动化之批量处理工作簿和工作表
2021/06/03 Python
SpringCloud Alibaba项目实战之nacos-server服务搭建过程
2021/06/21 Java/Android
Java GUI编程菜单组件实例详解
2022/04/07 Java/Android
德生2P3收音机开箱评测
2022/04/30 无线电
cypress测试本地web应用
2022/06/01 Javascript
mysql数据库如何转移到oracle
2022/12/24 MySQL