You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
letclass2type={}lettoString=class2type.toString// Populate the class2type map$.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(i,name){class2type["[object "+name+"]"]=name.toLowerCase()})
前言
源码仓库
原文链接
1. 将数组铺平(flatten)
这里先将
$.fn.concat
理解成原生数组的concat方法,我们会发现,其实他只能铺平一层。例如那怎样才能将多层嵌套的数组完全铺平为一层呢?这里介绍两种方式。
方式1
测试
方式2
同样和上面得到的结果一致
2. 数组去重(uniq)
结合数组的filter方法,查看数组的某项出现的索引是不是与idx相等,不相等,肯定出现过2次以上,即将其过滤掉。其实结合es6中的Set数据结构,可以很方便的做到数组去重。
测试
3. 连字符转驼峰(camelize)
4. 判断是否为document对象(isDocument)。
5. 判断obj是否为类数组(likeArray)
类数组对象:
常见的类数组对象有
auguments
,document.getElementsByClassName
等api获取的dom集合,符合上述条件的对象等。代码上了注释,主要我们来对比一下
underscore
中是如何判断是否为类数组的。underscore
中判断类数组比较宽松一些,MAX_ARRAY_INDEX是JavaScript 中能精确表示的最大数字,主要判断对象的length属性是否为数字类型,并且是否大于0且在MAX_ARRAY_INDEX范围内。zepto中类数组判断就比较严格了,因为window和函数其实都有length属性,这里把他们给过滤掉了。
6. 判断是否为window对象
但实际上下面的代码也会被认为是window对象。
7. 判断数据类型
最后class2type会变成
接着就是type函数的定义了
首先如果传入的obj是null或者undefined,则用String函数返货
null
或者undefined
,而toString.call(obj)
返回的正是形如[object Array]
,所以再结合上面的class2type变量,正好就可以得到例如。8. 判断是够为纯粹的对象(isPlainObject)
zepto中是如何判断的呢?
Object.getPrototypeOf() 方法返回指定对象的原型(即, 内部[[Prototype]]属性的值),如果没有继承属性,则返回 null 。
9. 判断是否为空对象(isEmptyObject)
主要是通过走一遍for循环,来确定,所以会将以下数据也认为是空对象。
所以这里判断空对象的初衷到底是不是只为了判断形如
{}
,new Object()
呢结尾
参考资料
读Zepto源码之内部方法
jQuery.isPlainObject
对jQuery.isPlainObject()的理解
Object.getPrototypeOf()
文章记录
原来你是这样的jsonp(原理与具体实现细节)
谁说你只是"会用"jQuery?
向zepto.js学习如何手动触发DOM事件
mouseenter与mouseover为何这般纠缠不清?
The text was updated successfully, but these errors were encountered: