是否有充分的理由避免在 JS 中没有最终表达式的 FOR 循环?
Posted
技术标签:
【中文标题】是否有充分的理由避免在 JS 中没有最终表达式的 FOR 循环?【英文标题】:Is there a good reason to avoid FOR loops without a final-expression in JS? 【发布时间】:2012-02-26 11:28:28 【问题描述】:把反向循环写成这样是不是一个坏习惯:
for (i = N; i--;)
为了访问 (N-1) 到 0
如果是这样,为什么? jsLint 肯定不喜欢它。
【问题讨论】:
您的代码不起作用。应该是for (i = N; i > 0; i--);
。不过,我不知道你为什么要这样做。 N
仍将是其原始值。 i
最终将为 0。我不确定你想要达到什么目的
可读性是立即浮现在脑海中的唯一原因。
另一种更常见的反向循环语法是while(i--)
@benekastah:它确实有效。请记住,for
语句中的第二个表达式决定循环是否继续;当i
到达0
时,第二个表达式将是假的,因此循环停止。 (此外,benekastah 的评论无意中验证了我的评论,即这是不可读的。)
@benekastah 哦,它确实有效jsfiddle.net/sU3HL 它只是在“条件”期间进行减量,而不是使用最终表达式。
【参考方案1】:
这没有任何技术原因不起作用。但是,它clearly 存在可读性问题,因为有人立即说出了“这行不通!”反应。
这是 jQuery 团队struggles with 提出的问题——是否使用以牺牲清晰度和可维护性为代价来节省字节的新颖结构。这真的归结为是否值得节省 1 或 3 个字节:
for(var i=9;i--;)
var i=9;while(i--)
for(var i=9;i>0;i--)
在这种情况下,可能不会。
【讨论】:
这似乎是共识。感谢所有的答案,但乔希真的在这里总结了。【参考方案2】:它的可读性较差,如果没有您的解释,我需要几秒钟才能理解循环的作用。为什么不简单:
while(i-- > 0)
?
【讨论】:
好问题。虽然我认为等价的应该是while(i--)
。所以同样适用,这是“可读”的吗?【参考方案3】:
您考虑过可读性吗?你自己可能很好理解,但其他开发人员可能会感到困惑,因为for
“成语”的部分是usually named as:
for ([initialization]; [condition]; [final-expression])
虽然条件在技术上可以是任何表达式,但您的版本不符合这个习惯用法,因为您使用的“条件”部分不仅仅是定义条件 - 它还偷偷地减少 i
。
【讨论】:
这就是我的想法。现在这似乎是一种相当普遍的模式,但如果它足以让 SO 上的“那行不通”,那么我想它不像我那么可读。 @Sinetheta:不一定不可读,但我想说将递减和条件部分放在for
循环的适当的、单独的部分中并没有什么坏处。【参考方案4】:
“把反向循环写成这样是不是一个坏习惯:”
for (i = N; i--;)
这是一个见仁见智的问题,但它实际上是带有初始化的 while
的反向操作,所以在我的意见中这不是一个“坏习惯”。这只是一种编码风格。
规范使for
的部分可选为开发人员提供了灵活性。
“jsLint 肯定不喜欢它。”
谁在乎。你不一定要听从 jsLint 的意见。
【讨论】:
【参考方案5】:我猜答案是非常主观的。我不认为这是一个坏习惯,但我确实觉得它在美学上令人不快。这可以更优雅地表达为:
for (i = N - 1; i >= 0; i--)
// do something here.
// And if it is really important that i should be 0 here
// as it is in your original code.
i = 0
在浏览大量恰好包含此代码的代码时,我们的大脑更容易理解此代码。
【讨论】:
【参考方案6】:是的。有一个很好的理由。可读性。
【讨论】:
以上是关于是否有充分的理由避免在 JS 中没有最终表达式的 FOR 循环?的主要内容,如果未能解决你的问题,请参考以下文章
是否有充分的理由在 Program.cs/main 中编写代码而不是使用类? [关闭]
是否有充分的理由为 DialogFragments 使用子片段管理器?
是否有充分的理由在打字稿项目中将编译器选项“声明”设置为 true