Performance 我们应该在TypeScript中使用u.foreach()或更好的原生for循环吗

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

我刚开始在一个新项目中使用TypeScript。我来自另一个同样使用TypeScript的项目。由于TypeScript中循环的本机for是可用的,我们决定(旧项目团队)使用这个。特别是对我来说,编写for of循环要方便得多,这与我的java背景有关

现在在新项目中,他们在任何地方都使用u.foreach()循环来迭代数组

我想知道的是,of的原生typescript和u.foreach()之间是否存在性能差异

我已经在jsperf中创建了一个小测试,它们的速度大致相同

的打印脚本

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 我想我更喜欢从TypeScript的“本机”,因为它对我来说更可读


你们建议用什么?是否还有其他要点可用于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
    用于数组、映射和集合

  • for of
    适用于所有类型:数组、字符串、TypeDarray、, 映射、集合、DOM集合和生成器

我会读这一章关于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