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
lettestArr=['qianlongo','fe','juejin']lettestObj={name: 'qianlongo',sex: 'boy'}$.each(testArr,function(i,val){console.log(i,val)})// 0 "qianlongo"// 1 "fe"// 2 "juejin"$.each(testObj,function(key,val){console.log(key,val)})// name qianlongo// sex boy
前言
源码仓库
原文链接
具体各个api如何使用可以参照英文文档Zepto.js 中文文档Zepto.js
1. $.camelCase
2. $.contains
举例
源码
用了
document.documentElement.contains
做判断,如果浏览器支持该方法,就用node.contains
重新包了一层得到一个函数,差别就在于如果传入的两个节点相同,那么原生的node.contains
返回true
,具体用法可以查看MDN Node.contains但是$.contains
返回false
。如果原生不支持就需要我们自己写一个方法了。主要逻辑还是通过一个
while
循环,判断传入的node
节点的父节点是否为parent
,如果一个循环下来,还不是最后才返回false
其实这里应该是可以做一个优化的,一进来的时候就先判断两个节点是否为同一节点,不是再进行后续的判断
3. $.each
举例
需要注意的是,此时回调函数中的
this
指向的就是数组或者对象的某一项。这样主要是方便内部的一些其他方法在遍历dom节点的时候,this很方便地就指向了对应的dom源码实现
likeArray已经在这些Zepto中实用的方法集说过了,可以点击查看。
4. $.extend
源码实现
可以看到首先对第一个参数是否为布尔值进行判断,有意思的是,只要是布尔值都表示深拷贝,你传
true
或者false
都是一个意思。接着就是对多个source
参数进行遍历调用内部方法extend
。接下来我们主要来看内部方法
extend
。整体实现其实还挺简单的,主要是遇到对象或者数组的时候,并且指定为深赋值,则递归调用
extend
本身,从而完成复制过程。5. $.grep
直接看源码实现
通过
call
形式去调用原生的数组方法filter
,过滤出符合条件的数据项。6. $.inArray
$.inArray(element, array, [fromIndex]) ⇒ number
举例
源码实现
可见其内部也是调用的原生
indexOf
方法。7. $.isArray
我们知道判断一个值是否为对象,方式其实挺多的,比如下面的这几种方式
而Zepto中就是采用的第二种方式
如果支持isArray方法就用原生支持的,否则通过
instanceof
判断,其实不太清楚为什么第二种方式,我们都知道这是有缺陷的,在有iframe场景下,就会出现判断不准确的情况.8. $.isFunction
源码实现
主要还是通过内部方法
type
来实现的,详情可以点击这些Zepto中实用的方法集查看。9. $.isNumeric
举例
源码
首先
val
经过Number
函数转化,得到num
,然后获取val
的类型得到type
。我们来回顾一下
Number(val)
的转化规则,这里截取一张图。看起来转化规则非常复杂,但是有几点我们可以确定,
1
,1.3
那转化后的还是数字,'123'
,'12.3'
那转化后的也是数字''
那转化后得到的是0'123aaa'
,那转化后得到的是NaN
所以再结合下面的判断
通过
val != null
排除掉null
和undefined
通过
type != 'boolean'
排除掉,true
和false
通过
isFinite(num)
限定必须是一个有限数值通过
!isNaN(num)
排除掉被Number(val)
转化为NaN
的值(type != 'string' || val.length)
,val
为字符串,并且字符串的长度大于0,排除''
空字符串的场景。以上各种判断下来基本就满足了这个函数原来的初衷要求。
9. $.isPlainObject
10. $.isWindow
该两个方法在这些Zepto中实用的方法集也聊过了,可以点击查看一下。
11. $.map
我们先看几个例子
运行结果如下
可以看出
resultArr1
和resultArr3
的区别是$.map
把undefined
和null
给过滤掉了。resultArr2
与resultArr4
的区别是$.map
把回调函数的返回值给铺平了。接下来看看源码是怎么实现的。
从源码实现上可以看出因为
value != null
以及flatten(values)
造成了上述差异。12. $.noop
比如。我们定义了几个变量,他未来是作为函数使用的。
如果直接这样
宿主环境就不必为我们创建多个匿名函数了。
其实还有一种可能用的不多的场景,在判断一个变量是否是
undefined
的时候,可以用到。因为函数没有返回值,默认返回undefined
,也就是排除了那些老式浏览器undefined可以被修改的情况13. $.parseJSON
源码实现
14. $.trim
源码实现
15. $.type
该方法内部实现其实就是内部的
type
函数,并且已经在这些Zepto中实用的方法集聊过了,可以点击查看。结尾
参考资料
读zepto源码之工具函数
MDN trim
MDN typeof
MDN isNaN
MDN Number
MDN Node.contains
文章记录
原来你是这样的jsonp(原理与具体实现细节)
谁说你只是"会用"jQuery?
向zepto.js学习如何手动触发DOM事件
mouseenter与mouseover为何这般纠缠不清?
这些Zepto中实用的方法集
The text was updated successfully, but these errors were encountered: