每天学习API之一 ,zepto源码compact,flatten,uniq

最近决定学习下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

这里写图片描述

Set 和 Map 数据结构

不怎么写博客,如果上面有什么问题,欢迎随时留言指点,谢谢

参考

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值