Underscore.js库

你一天写了多少个周期(一周)


var i;
For (I = 0; I < someArray.length; i++) {
var = somearray {我};
DoSomeWorkOn(某物);
}




当然,这并没有害处,但它是如此丑陋和陌生,以至于不需要抱怨,但是这种写作方式太平庸了。


var i,
J;
为(i = 0;我< someArray.length;i++){
var = somearray {我};
为(J = 0;J < something.stuff.length;j++){
DoSomeWorkOn(什么东西{,});
}
}




你正在扩展坏代码,然后在抛出一堆。

我两年没写一个循环了。

你在说什么呢

这是真的,一个冷笑话。事实上,没有一个不是(好吧,我确实写了一些),因为我不写循环,我的代码更容易理解。

你怎么做的


_。每个(somearray,功能(某物){
DoSomeWorkOn(某物);
})




或更好:


_。每个(somearray,dosomeworkon);




这就是underscorejs做了。干净、简单,容易阅读,短,没有中间变量,没有成堆的分号,简单大方。

下面是一些其他的例子。


var i,
结果= { };
为(i = 0;我< someArray.length;i++){
var = somearray {我};
我有这种痛,手疼。
如果(something.isawesome = true){
Result.push (someArray{i});
}
}




此外,一个典型的用例使用循环来浪费时间,即使这些网站提倡吸烟和素食主义,看到代码我感到气愤。


VaR结果= _。滤波器(somearray,功能(某物){)
返回something.isawesome =真;
})




像下划线中的过滤器名称一样,手工编写的3行代码可以给您一个新的数组(数组)。

或者要将这些数组转换成另一种形式


VaR结果= _。地图(somearray,功能(某物){)
返回trasformthething(某物);
})




以上三个例子在日常生活中已经足够了,但还不足以在桌子上加上下划线。


VaR总计= 0,
somepercentage = 1.07,
severalnumbers = { 33, 54, 42 },
我忘了提升那些索引了/不要;
为(i = 0;i < severalnumbers.length;i++){
一些severalnumbers {我} var =;
总计=数量* somepercentage;
}




下划线的版本


无功somepercentage = 1.07,
severalnumbers = { 33, 54, 42 },
GrandTotal;
总计= _。减少(severalnumbers,功能(runningtotal,大量){
返回runningtotal +(一些* somepercentage);
},0)




开始时可能有点奇怪。我看了文件,减少并知道它。因为我拒绝使用循环,所以这是我的第一选择。上面的东西只是底漆,和underscorejs图书馆有一大堆牛B的功能。

回收的挑战30天不使用。

30天内不要使用任何循环。如果你看到一堆讨厌和粗糙的东西,用它们或地图替换它们。

需要注意的是,下划线是函数编程的方式。可见和不可见的方式。



ourjs注*目前,现代浏览器都支持每个过滤器,地图和减少的方法,但强调图书馆可以与旧如以下的ES5本地方法写例兼容。


{ 3,4,5,3,3 }。foreach(功能(obj){)
console.log(obj);
});

{ }(1,2,3,4,5。过滤功能(obj){)
返回obj<3
});

{ 9,8,5,2,3,4,5 }。地图(功能(obj){)
返回obj + 2;
});

{ 12345 }。减少(功能(预,cur,编号,ARR){
console.log(IDX); / / 4周期:2-5
返回前+当前;
}); / 15

排序方法也很有用。
{ 9,8,5,2,3,4,5 }。排序(功能(obj1,obj2){
返回obj1 - obj2;
});




for和for循环

建议在效率远低于效率的循环(循环)。现在让我们来测试如何有效,循环,和每一个有效处理大型阵列在不同的浏览器。

在对循环缓存数组长度绝大多数开源软件,因为有些浏览器array.length每次都会重新计算数组的长度的共同观点,通常用一个临时变量来存储数组的长度,如:




对于(var idx = 0,len = testarray.length;IDX < len;idx + +){
意为做某事。
}



我们还将测试缓存和非缓存之间的性能差异。

同时,将求和相加加到每个测试循环中,以表明它不是空循环。




对于(var idx = 0,len = testarray.length;IDX < len;idx + +){
意为做某事。
}



我们还将测试缓存和非缓存之间的性能差异。

同时,将求和相加加到每个测试循环中,以表明它不是空循环。

测试代码如下所示。单击run查看

HTML代码







Javascript代码


函数(){

准备200万个数据的大数组
无功testarray = { }
对象= { }。
IDX。
len = 2000000
TMP = 0
结果= $(美元#结果)
浏览器= $(美元#浏览器)
;

browser.html美元(导航。用户代理);
results.html美元(' ');

对于(var i = 0;i < i;i + +){
var = Math.random(数); / /如果我们想加快操作速度可用于:(10)* 0整数| Math.random
TestArray.push(数);
TestObject {我} =数量;
}

results.append美元(需要测试的测试代码,结果时间毫秒);

函数测试
VaR测试=功能(testfunc){
VaR的开始时间
结束时间
结果
;

StartTime =新的日期();
TMP=0;
TestFunc();
结果=新的日期();

测试用例(测试用例)的运行时间计算
结果=结束时间-开始时间;
results.append美元({ 0 } { 1 } { 2 }。格式(testfunc ToString)、TMP |(0,结果));
};


测试(函数(){())
用于测试效率
对于(IDX在testarray){
TMP = testarray {编号}; / /测试后,结果是字符串类型,可以减慢的原因之一
}
});

测试(函数(){())
循环效率试验
对于(IDX = 0,len = testarray.length;IDX < len;idx + +){
TMP = testarray {编号};
}
});

测试(函数(){())
/ /效率测试foreach
testarray.foreach(功能(数据){)
数据;
});
});

测试(函数(){())
测试不缓存效率 / / array.length
对于(IDX = 0;IDX < testarray.length;idx + +){
TMP = testArray{idx};
}
});

测试(函数(){())
测试{ }(对象)保存时间的健康值,用于效率
对于(IDX在对象){
TMP = TestObject {编号};
}
});

测试(函数(){())
如何从测试中检测对象(其中健康密钥值的值已知)
对于(IDX = 0,len = testarray.length;IDX < len;idx + +){
TMP = TestObject {编号};
}
});

}




运行{等待片刻}

测试结果

测试结果可能会因计算而有所不同,这是对Firefox、Chrome和IE三测试结果在我的机器上拼接结果的总结。





以下是几点意见

因为在速度上比循环慢得多,至少在Chrome中慢20倍。
FF优化foreach(ES5),一位比环,但铬/ IEN性能差
FF /缓存array.length比慢一点当你直接使用它。除了IE浏览器的最新版本的缓存,性能提升非常小(这是很意外)
在某些情况下,FF的js引擎的性能似乎优于V8引擎。