数组篇

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. Storm系统高可用性HA表现

    关于Storm的高可用,有以下几个方面: (1)数据利用阶段可以通过ACK机制保证数据被处理: (2)在进程级别,worker失效,supervisor会自动重启worker线程; (3)在组件级别, ...

  2. linux安装SVN

    1. 下载软件包 http://archive.apache.org/dist/subversion/ http://archive.apache.org/dist/subversion/subver ...

  3. UVA 11427 (概率DP+期望)

    题目链接: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=35396 题目大意:每晚打游戏.每晚中,赢一局概率p,最多玩n局, ...

  4. 阴影:box-shaw

    box-shaw:0px 0px 2px 3px while; 水平方向  垂直方向  模糊半径  模糊系数(大小)颜色

  5. ubuntu 安装Firefox 29.0

    下载Firefox 29.0 % cd ~/Downloads % sudo cp firefox-29.0.tar.bz2 /opt % cd /opt % sudo tar -xvjf firef ...

  6. [BZOJ2803][Poi2012]Prefixuffix

    2803: [Poi2012]Prefixuffix Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 219  Solved: 95[Submit][St ...

  7. Servlet处理get请求时的中文乱码问题

    我们都知道,使用Servlet处理get请求时,如果get请求的参数中有中文,直接接收会是乱码,这个时候我们使用类似下面的语句来处理乱码: 12345 String name = request.ge ...

  8. Hbase1.0 客户端api

    最近在试用Hbase1.0的客户端API,发觉变化还是挺大(以前版本也不熟).到处都是deprecated. 现在应该是这样子: Configuration  conf = HBaseConfigur ...

  9. osgearth_city例子总结

    osgearth_city例子总结 转自:http://blog.csdn.net/taor1/article/details/8242480 int main(int argc, char** ar ...

  10. C#:实现快捷键自定义设置(转)

    项目开发过程中,需要实现类似有道词典的软件设置中的自定义快捷键功能,如下图所示: 当我们相继按下Ctrl+Alt+M的时候,软件就会自动将快捷键显示在文本框中. 最终的效果如下图所示: private ...