数组篇

1.compact,就是将数组中的false值去掉

function compact(array) {
var index = -1,
length = array ? array.length : 0,
resIndex = -1,
result = []; while (++index < length) { //while循环还是比较好的
var value = array[index];
if (value) {
result[++resIndex] = value;
}
}
return result;
} 2.slice 分割数组,禁用了原生的slice方法,重写了slice方法.但是对于重写的slice方法,原生的方法效率更高.

function baseSlice(array, start, end) {
var index = -1,
length = array.length;

start = start == null ? 0 : (+start || 0);
if (start < 0) {
start = -start > length ? 0 : (length + start);
}
end = (end === undefined || end > length) ? length : (+end || 0);
if (end < 0) {
end += length;
}
length = start > end ? 0 : ((end - start) >>> 0);    //定义获取数组的长度
start >>>= 0;

var result = Array(length);                                   //定义一个具有长度的数组
while (++index < length) {
result[index] = array[index + start];                    //数组赋值操作
}
return result;
}

在lodash中,对slice方法进行了重写,原生的js方法是ArrayObject.slice(start,end)

3.drop方法
drop方法是用了slice的方法
function drop(array, n, guard) {
var length = array ? array.length : 0;
if (!length) {
return [];
}
if (guard ? isIterateeCall(array, n, guard) : n == null) {
n = 1;
}
return baseSlice(array, n < 0 ? 0 : n);
}
4.difference方法,获取到第一个中与第二个的不同的元素,在while循环中,++则要小于一个值,--则直接while(valuesIndex--)  这样是先判断减的值 当valuesIndex为1时,仍通过.
var difference = restParam(function(array, values) {
return isArrayLike(array)
? baseDifference(array, baseFlatten(values, false, true))
: [];
});
主方法中的baseDifference
function baseDifference(array, values) {
var length = array ? array.length : 0,
result = []; if (!length) {
return result;
}
var index = -1,
indexOf = baseIndexOf,
isCommon = true,
cache = (isCommon && values.length >= 200) ? createCache(values) : null,
valuesLength = values.length; if (cache) {
indexOf = cacheIndexOf;
isCommon = false;
values = cache;
}
outer:
while (++index < length) {
var value = array[index]; if (isCommon && value === value) { //对于NaN是不等于本身的.
var valuesIndex = valuesLength;
while (valuesIndex--) { //从后向前循环
if (values[valuesIndex] === value) {
continue outer; //注意continue以后就不会执行result.push(value),而是将会这一次循环outer中断,开始下一次主循环.
}
}
result.push(value);
}
else if (indexOf(values, value, 0) < 0) {
result.push(value);
}
}
return result;
}
带标签的break和continue的终端层数问题:这里的标签是break outermost是停止外面的主循环(如果没有标签咱们在内存不能停掉外面主循环的),continue outer是指停掉外面的本次的主循环,下次主循环又从i=3开始.
带标签是为了从内部控制主循环.
//--------------------------------------------
var iNum = 0;
var inum = 0;
outermost:
for (var i = 0; i < 4; i++) {
for (var j = 0; j < 4; j++) {
if (i == 2 && j == 2) {
break outermost;
}
iNum++;
}
inum++;
}
console.log(iNum,inum); //10 2
//---------------------------------------------
var Num = 0;
var num = 0;
outer:
for (var i = 0; i < 4; i++) {
for (var j = 0; j < 4; j++) {
if (i == 2 && j == 2) {
continue outer;
}
Num++;
}
num++;
}
console.log(Num,num); //14 3
//---------------------------------------------
本身与本身不相等情况:NaN不与NaNx相等
var arr = [{},function(){},undefined,null,'',NaN,/.^/,[]];
var length = arr.length;
while(length--){
var value = arr[length];
console.log(value === value); //其中只有NaN不相等
}
5.fill是指的替换
_.fill([4, 6, 8], '*', 1, 2);
// => [4, '*', 8]
核心算法如下:这个方法的目的是将数组内的值进行替换.
>>>0 为无符号右移0位,如果是负数,则是取补码,如果是正数则不会改变值.
-1 >>> 0 //4294967295 因为1的2^32 = 4294967296
1 >>> 0 //1
length = start > end ? 0 : (end >>> 0);
start >>>= 0; while (start < length) {
array[start++] = value;
}
return array; 数组的原声的替换如下:
arrayObject.splice(index,howmany,item1,.....,itemX)

var arr = ['George','John','Thomas','James','Adrew','Martin']
var arr2 = arr.splice(2,1,'77')
//arr2 ['George','John','77','James','Adrew','Martin'] index=2的值是Thomas,替换1个,替换值是'77'
												

lodash的源码(1)的更多相关文章

  1. lodash源码(2)

    1.flatten 对深层嵌套数组的抹平 _.flatten([1, [2, 3, [4]]]);* // => [1, 2, 3, [4]]** // using `isDeep`* _.fl ...

  2. 读lodash源码之从slice看稀疏数组与密集数组

    卑鄙是卑鄙者的通行证,高尚是高尚者的墓志铭. --北岛<回答> 看北岛就是从这两句诗开始的,高尚者已死,只剩卑鄙者在世间横行. 本文为读 lodash 源码的第一篇,后续文章会更新到这个仓 ...

  3. lodash源码分析之chunk的尺与刀

    以不正义开始的事情,必须用罪恶使它巩固. --莎士比亚<麦克白> 最近很多事似乎印证了这句话,一句谎言最后要用一百句谎言来圆谎. 本文为读 lodash 源码的第二篇,后续文章会更新到这个 ...

  4. lodash源码分析之compact中的遍历

    小时候, 乡愁是一枚小小的邮票, 我在这头, 母亲在那头. 长大后,乡愁是一张窄窄的船票, 我在这头, 新娘在那头. 后来啊, 乡愁是一方矮矮的坟墓, 我在外头, 母亲在里头. 而现在, 乡愁是一湾浅 ...

  5. lodash源码分析之Hash缓存

    在那小小的梦的暖阁,我为你收藏起整个季节的烟雨. --洛夫<灵河> 本文为读 lodash 源码的第四篇,后续文章会更新到这个仓库中,欢迎 star:pocket-lodash gitbo ...

  6. lodash源码分析之NaN不是NaN

    暗恋之纯粹,在于不求结果,完全把自己锁闭在一个单向的关系里面. --梁文道<暗恋到偷窥> 本文为读 lodash 源码的第五篇,后续文章会更新到这个仓库中,欢迎 star:pocket-l ...

  7. lodash源码分析之自减的两种形式

    这个世界需要一个特定的恶人,可以供人们指名道姓,千夫所指:"全都怪你". --村上春树<当我谈跑步时我谈些什么> 本文为读 lodash 源码的第六篇,后续文章会更新到 ...

  8. lodash源码分析之List缓存

    昨日我沿着河岸/漫步到/芦苇弯腰喝水的地方 顺便请烟囱/在天空为我写一封长长的信 潦是潦草了些/而我的心意/则明亮亦如你窗前的烛光/稍有暧昧之处/势所难免/因为风的缘故 --洛夫<因为风的缘故& ...

  9. lodash源码分析之缓存方式的选择

    每个人心里都有一团火,路过的人只看到烟. --<至爱梵高·星空之谜> 本文为读 lodash 源码的第八篇,后续文章会更新到这个仓库中,欢迎 star:pocket-lodash gitb ...

随机推荐

  1. UVa 11388 & 丝帛

    一直在想丝帛题要不要贴呢...后来觉得还是贴了吧...反正没人看...blog是开给自己看的...偶尔无聊打打blog也显得生活非常充实... 题意: 给一个gcd和lcm求满足啊他们的最小的a和b. ...

  2. HttpLuaModule 获取Get和Post参数

    Get方式: local id = tostring(ngx.var.arg_id) local type = tostring(ngx.var.arg_type) Post方式: ngx.req.r ...

  3. HTML5与移动端web学习笔记

    HTML5 提供了很多新的功能,主要有: 新的 HTML 元素,例如 section, nav, header, footer, article 等 用于绘画的 Canvas 元素 用于多媒体播放的 ...

  4. Update UI from an asynchronous thread

    One of the most common tasks you need to perform in a Windows Phone application is updating the UI f ...

  5. 黑马程序员----java基础笔记上(毕向东)

    ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 笔记一共记录了毕向东的java基础的25天课程,分上.中.下 本片为上篇,涵盖前10天课程 1. ...

  6. [LintCode] Longest Increasing Continuous Subsequence 最长连续递增子序列

    Give an integer array,find the longest increasing continuous subsequence in this array. An increasin ...

  7. [CareerCup] 18.4 Count Number of Two 统计数字2的个数

    18.4 Write a method to count the number of 2s between 0 and n. 这道题给了我们一个整数n,让我们求[0,n]区间内所有2出现的个数,比如如 ...

  8. PLSQL Developer注册码

    Product Code:4t46t6vydkvsxekkvf3fjnpzy5wbuhphqzserial Number:601769password:xs374ca

  9. Oracle 部分函数使用说明

    oracle有些函数可能我知道是什么作用,但是具体其实说不清楚,这里是我这几天看到的函数使用方法及说明,记录一下,以后看看 --1.replace('str',oldVal,newVal)替换功能方法 ...

  10. 一些变态的PHP一句话后门收集

    这类后门让网站.服务器管理员很是头疼,经常要换着方法进行各种检测,而很多新出现的编写技术,用普通的检测方法是没法发现并处理的.今天我们细数一些有意思的PHP一句话木马. 利用404页面隐藏PHP小马 ...