lodash的源码(1)
数组篇
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)的更多相关文章
- lodash源码(2)
1.flatten 对深层嵌套数组的抹平 _.flatten([1, [2, 3, [4]]]);* // => [1, 2, 3, [4]]** // using `isDeep`* _.fl ...
- 读lodash源码之从slice看稀疏数组与密集数组
卑鄙是卑鄙者的通行证,高尚是高尚者的墓志铭. --北岛<回答> 看北岛就是从这两句诗开始的,高尚者已死,只剩卑鄙者在世间横行. 本文为读 lodash 源码的第一篇,后续文章会更新到这个仓 ...
- lodash源码分析之chunk的尺与刀
以不正义开始的事情,必须用罪恶使它巩固. --莎士比亚<麦克白> 最近很多事似乎印证了这句话,一句谎言最后要用一百句谎言来圆谎. 本文为读 lodash 源码的第二篇,后续文章会更新到这个 ...
- lodash源码分析之compact中的遍历
小时候, 乡愁是一枚小小的邮票, 我在这头, 母亲在那头. 长大后,乡愁是一张窄窄的船票, 我在这头, 新娘在那头. 后来啊, 乡愁是一方矮矮的坟墓, 我在外头, 母亲在里头. 而现在, 乡愁是一湾浅 ...
- lodash源码分析之Hash缓存
在那小小的梦的暖阁,我为你收藏起整个季节的烟雨. --洛夫<灵河> 本文为读 lodash 源码的第四篇,后续文章会更新到这个仓库中,欢迎 star:pocket-lodash gitbo ...
- lodash源码分析之NaN不是NaN
暗恋之纯粹,在于不求结果,完全把自己锁闭在一个单向的关系里面. --梁文道<暗恋到偷窥> 本文为读 lodash 源码的第五篇,后续文章会更新到这个仓库中,欢迎 star:pocket-l ...
- lodash源码分析之自减的两种形式
这个世界需要一个特定的恶人,可以供人们指名道姓,千夫所指:"全都怪你". --村上春树<当我谈跑步时我谈些什么> 本文为读 lodash 源码的第六篇,后续文章会更新到 ...
- lodash源码分析之List缓存
昨日我沿着河岸/漫步到/芦苇弯腰喝水的地方 顺便请烟囱/在天空为我写一封长长的信 潦是潦草了些/而我的心意/则明亮亦如你窗前的烛光/稍有暧昧之处/势所难免/因为风的缘故 --洛夫<因为风的缘故& ...
- lodash源码分析之缓存方式的选择
每个人心里都有一团火,路过的人只看到烟. --<至爱梵高·星空之谜> 本文为读 lodash 源码的第八篇,后续文章会更新到这个仓库中,欢迎 star:pocket-lodash gitb ...
随机推荐
- Universal JS module loader
With dependency ;(function (root, factory) { if (typeof define === 'function' && define.amd) ...
- Here's what C++ is
Yes this article describes what c++ exactlyis http://www.skywind.me/blog/archives/1398#comment-3671 ...
- Android 热补丁和热修复
参考: 各大热补丁方案分析和比较 Android App 线上热修复方案 1. Xposed Github地址:https://github.com/rovo89/Xposed 项目描述:Xposed ...
- OpenResty 通过二级域名做跳转
if ( $host ~* (\b(?!www\b)\w+)\.\w+\.\w+ ) { #获取nba.test.com域名中的nba set $subdomain $1; } location / ...
- Codeforces Round #245 (Div. 2) A - Points and Segments (easy)
水到家了 #include <iostream> #include <vector> #include <algorithm> using namespace st ...
- 【BZOJ】2729: [HNOI2012]排队
题意 \(n\)个男生\(m\)个女生\(2\)个老师排列,任意两个女生不能相邻,两个老师也不能相邻,每个人都不同.问有多少种排法.(\(n, m \le 2000\)) 分析 组合乱搞. 题解 先放 ...
- Maven_dependencies 和 dependencyManagement 的区别
今天我在配置 sellercenter 的接口测试环境的时候,发现一些依赖的写法不太一致: 比如有的依赖的<scope>是写在子项目中的 <dependencies> 下的&l ...
- pr高的2级域名站点如何做优化?
优化方法: 二级域名的内容建设也需要细致化 很多人认为,优化二级域名没有优化顶级域名那么多工作,只需要发发外链就可以了,这可以说是一个误区.我们的目的是要优化二级域名到首页,让用户能够看到,如果我们的 ...
- 史上最全的Win8快捷键大全
下列的 Win8 快捷键列表汇总均收集自网络,未全部实测,也有可能有Win7时代的热键混迹其中,不管怎样,如有错漏,欢迎大家指正! Win8 常用快捷键: Win键 可在开始屏幕主菜单及最后一个应用程 ...
- C# async
I/O should use async, asynchronous method can be achieved: message, delegate, multi-threading Thread ...