是否有充分的理由避免在 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 中编写代码而不是使用类? [关闭]

是否有充分的理由在单平台系统上使用 .proto 文件?

是否有充分的理由为 DialogFragments 使用子片段管理器?

是否有充分的理由在打字稿项目中将编译器选项“声明”设置为 true

在 Java 9 中是不是有充分的理由使用带有新接口的抽象类? [复制]

是否有任何陷阱或充分的理由不使用 autosproc 进行存储过程调用?