Performance 我们应该在TypeScript中使用u.foreach()或更好的原生for循环吗
我刚开始在一个新项目中使用TypeScript。我来自另一个同样使用TypeScript的项目。由于TypeScript中循环的本机for是可用的,我们决定(旧项目团队)使用这个。特别是对我来说,编写for of循环要方便得多,这与我的java背景有关 现在在新项目中,他们在任何地方都使用u.foreach()循环来迭代数组 我想知道的是,of的原生typescript和u.foreach()之间是否存在性能差异 我已经在jsperf中创建了一个小测试,它们的速度大致相同 的打印脚本Performance 我们应该在TypeScript中使用u.foreach()或更好的原生for循环吗,performance,typescript,foreach,lodash,Performance,Typescript,Foreach,Lodash,我刚开始在一个新项目中使用TypeScript。我来自另一个同样使用TypeScript的项目。由于TypeScript中循环的本机for是可用的,我们决定(旧项目团队)使用这个。特别是对我来说,编写for of循环要方便得多,这与我的java背景有关 现在在新项目中,他们在任何地方都使用u.foreach()循环来迭代数组 我想知道的是,of的原生typescript和u.foreach()之间是否存在性能差异 我已经在jsperf中创建了一个小测试,它们的速度大致相同 的打印脚本 for
for (let num: string of list){
console.log(num);
}
在JavaScript中
var list = "9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9".split();
//Transpiled TypeScript for of | **19,937 ±5.04%
for (var _i = 0, list_1 = list; _i < list_1.length; _i++) {
var num = list_1[_i];
console.log("" + num);
}
//lodash | 20,520 ±1.22%
_.forEach(list, function(item) {
console.log("" + item)
});
9,9,9,9,9 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9“。split();
//为|**19937±5.04%
对于(var_i=0,list_1=list;_i你们建议用什么?是否还有其他要点可用于of或更好?forEach我无法评论lodash,我没有使用过它。但以下是一些可能会有所帮助的背景 TypeScript 1.5中引入了“For of”,用于循环数组列表中的每个元素。如果您检查JS输出(取决于您是针对ECMA脚本5还是6),您应该会发现在ECMAScript 5的情况下,以下两个的输出是相同的。以及ES6/2015目标将如何影响产出 关于ForEach的Typescript实现,在GitHub上有一个有趣的讨论。特别是在有条件的跳出循环的情况下
for (let line of v.lineEntry) {
}
for (var _i = 0, list_1 = list; _i < list_1.length; _i++) {
}
for(让v.lineEntry的行){
}
对于(var_i=0,list_1=list;_i
基于您的测试,我使用本机数组.prototype.forEach添加了另一个:
list.forEach(function(item) {
console.log("" + item)
});
事实上,这是我喜欢的方式,因为它实际上更容易打字。此外,它更接近于您可能希望使用数组执行的其他操作,例如map
/filter
等
请注意,这三种方法都没有合理的性能差异 除了阅读之外,我对typescript没有任何经验,但我对ES6/ES2015有相当多的经验过去是,现在仍然是最终确定的ES2015规范的一部分。我会阅读MDN上关于of的的文章
以下是of
和forEach
的一些相同点和不同点(这些是我目前发现和了解的):
- lodash中的
适用于作为数组、对象或对象的集合 字符串forEach
- 本机
用于数组、映射和集合forEach
适用于所有类型:数组、字符串、TypeDarray、, 映射、集合、DOM集合和生成器for of
(探索ES6是一本很好的书。它非常彻底。它也是免费的在线。)其中的一些东西对我来说是关于of的不同的,它们不在forEach
中
断开并继续在循环的内部工作
break
和continue
未在forEach
中公开。在forEach中,最接近continue
的方法是使用return
,这实际上几乎是一样的。至于break
,虽然我看不到其他选择(但不要低估lodash,因为大多数需要休息的事情,比如查找和返回单个项目,已经包含在lodash的大部分库中)
还应注意的是,async/await中的await
关键字在for of
中可用,其中as-forEach使得阻止周围的块等待forEach块中等待的承诺变得相当困难,但是可以使用forEach
,尽管使用映射
或reduce
可能使等待比forEach简单得多(取决于您对这些功能的熟悉程度)。下面是三种不同的等待承诺的实现,它们是顺序和并行的,使用、for of
、forEach
、和reduce
和map
,以查看可能的差异
consttimeout=ms=>newpromise(res=>setTimeout(()=>res(ms),ms));
常数倍=[100,50,10,30];
异步函数forOf(){
log(“运行顺序forOf:”);
for(持续时间次){
等待超时(时间);
log(`waited${time}ms`);
}
log(“运行并行forOf:”);
常量承诺=[];
for(持续时间次){
const promise=超时(时间)。然后(函数(毫秒){
log(`waited${ms}ms`);
});
承诺。推动(承诺);
}
等待承诺。所有(承诺);
};
异步函数forEach(){
log(“运行顺序forEach:”);
让承诺=承诺。解决();
times.forEach(函数(时间){
promise=promise.then(异步函数(){
等待超时(时间);
log(`waited${time}ms`);
});
});
等待承诺;
log(“运行并行forEach:”);
常量承诺=[];
times.forEach(函数(时间){
const promise=超时(时间)。然后(函数(毫秒){
log(`waited${ms}ms`);
});
承诺。推动(承诺);
});
等待承诺。所有(承诺);
};
异步函数reduceAndMap(){
log(“运行顺序减少:”);
const promise=times.reduce(函数)(promise,time