为了编写简洁而快速的代码,我遇到了一个问题,并且有些搜索没有找到答案。在这种情况下编写代码的最佳做法是什么?
for (let i = 0; i < message.timesheets.length; i++) {
if (message.timesheets.length > 1) {
// Run function
} else {
// Run other function
}
};
&#13;
OR
if (message.timesheets.length > 1) {
for(let i = 0; i < message.timesheets.length; i++) {
// Run function
};
} else {
for(let i = 0; i < message.timesheets.length; i++) {
// Run other function
};
}
&#13;
我的想法是第一个选项更容易阅读,但更少的预处理,因为它必须评估每次for循环循环时是否。第二个选项只需要在每次for循环循环时运行包含的函数,但是更难以读取并且更长。这两个片段同样出现的问题是哪种方式做得更好?如果一个人不一定比另一个人更快哪一个?
编辑:你们不明白的是,我并没有将整个项目复制到问题中。为了这个问题,我们假设message.timesheets数组的值可以等于一(1)和多于一(1)。答案 0 :(得分:1)
我会选择第二个选项,因为它只执行一个测试操作然后进入循环,而第一个选项将进入一个循环,它将在每次迭代时执行测试操作。
可以看作:
Loop
|_Test
|_ do
|_Test
|_ do
|_Test
|_ do
|_Test
|_ do
End
和
Test
|_ Loop
|_ do
|_ do
|_ do
|_ do
|_ End
分别我不是这方面的专家,只是我的意见,它还取决于JS解释器(或编译器)如何处理这种情况,可能有一些优化使第一个选项最好(或最差)。如果你想确定,你可以看一下JS引擎代码,比如谷歌的V8 JS引擎
答案 1 :(得分:1)
由于第二个for循环(在第二个例子中)只运行1次迭代,如果条件为假,你可以省略第二个循环。
if (message.timesheets.length > 1) {
for(let i = 0; i < message.timesheets.length; i++) {
// Run function
};
} else if (message.timesheets.length == 1) {
let i=0;
// Run other function
}
感谢Bergi指出else语句应该是else,如果长度为1。
答案 2 :(得分:0)
重复评估循环中相同的if
条件确实较慢。但是,除非您的数组方式非常,否则这无关紧要,相反,您应该专注于编写干净且可读的代码。
您可能(并且应该)简化为
const run = message.timesheets.length > 1 ? oneFunction : otherFunction;
for (const timesheet of message.timesheets)
run(timesheet);
既干又快。
答案 3 :(得分:0)
由于您的测试(数组的大小)在必须循环之前是已知的,因此您无需将其保留到最后一刻。正如bergi指出的那样,使用测试选择要在一个循环中调用的函数。
基本上,这归结为过早优化。这真的无所谓。编写您的代码首先是可读的,然后在将来,如果您遇到性能问题,请调查原因。我敢打赌,这永远不会成为问题。
在编程中,Premature optimisation是在我们知道需要之前优化一段代码的行为。这是一个重要的问题,因为它往往浪费时间;还有其他任务要做,在微观层面看似问题似乎只是整个系统的一小部分。如果不退一步来分析整个
,你无法分辨什么是重要的