最近决定学习下Zepto源码,以提升原生JavaScript的能力,每天学习几个API,总有一天咱的js也会牛逼的,哈哈
定义
var emptyArray = [],
concat = emptyArray.concat,
filter = emptyArray.filter,
slice = emptyArray.slice;
zepto 一开始就定义了一个空数组 emptyArray,定义这个空数组是为了取得数组的 concat、filter、slice 方法
**
数组方法
**
compact —删除数组中的 null 和 undefined
function compact(array) {
return filter.call(array, item => {
return item != null;
};
}
以上方法是删除null 和 undefined 这里删除null显而易见,但是为什么也可以返回undefined呢?注意上面用的是 !=
而非 !==,!=比较时, 会将null 和 undefined 转化为false,再去作比较。
关于 null 和 undefined 推荐看看这篇文章:null 和 undefined的区别
filter方法,返回true表示保留该元素,false则不保留该元素,filter返回一个新的通过测试(true)的元素的集合的数组
filter具体详见MDN
flatten —将数组扁平化
function flatten(array) {
return array.length > 0 ? concat.apply([],array) : array;
}
将数组扁平化,例如将数组 [1,[2,3],[4,5],6,[7,[89]]] 变成 [1,2,3,4,5,6,7,[8,9]]
,这个方法只能展开一层,多层嵌套也只能展开一层。
这里比较巧是用到了apply,【apply允许我们将一个数组”解开”成为一个个的参数再传递给调用函数】
关于上面巧用apply,推荐看这片文章。Apply和数组:三个技巧
uniq 数组去重
function uniq(array) {
return filter.call(array, function(item, idx) {
return array.indexOf(item) === idx;
})
}
数组去重原理,检查item第一次出现的位置是否和item在数组中的位置是否相等,如果不相等,则证明不是第一次出现,将其过滤掉。
源码有一点我不是清楚,array.indexOf(item) 的结果是 number类型,idx 也是number类型,为什么不用===
而用 ==,经测 === 也是可以的(有哪位大神指导,留言告知,谢谢)关于数组去重还有更好的方法,比如利用ES6 Set
不怎么写博客,如果上面有什么问题,欢迎随时留言指点,谢谢
参考