JavaScript for 循环中的 i++ 与 ++i
i++ vs. ++i in a JavaScript for loop
因为 JSLint,我几乎总是使用 i += 1
来增加一个 JavaScript for 循环,但对于快速和肮脏的脚本,我使用 i++
代替。
但是,我在其他人的代码中看到很多 for 循环,他们通过执行 ++i
来增加 i
。
据我所知,i++
和++i
在含义上没有区别,jsPref在性能上也没有区别。
因此,我想知道做 ++i
的惯例从何而来以及为什么人们倾向于这样做。
有谁知道为什么很多 JS 编码人员在 for 循环中递增计数器时倾向于选择 ++i
而不是 i++
?
谢谢。
有区别,但在 for 循环中使用时没有区别。
在表达式中,i++
求值为 i
的前一个值,然后 i
递增。 ++i
先自增,再求值。
出于这个原因,一些程序员更喜欢在他们的 for 循环中编写 ++i
— 要么是因为他们已经习惯了,要么是因为他们觉得它是 "more right" 不知何故。
编辑:更有可能的是Overv提出的解决方案:C的遗物。
区别在于i++
return是i
递增前的值,++i
是i
递增后的值。如果您忽略 return 值,则没有区别,例如在:
for (var i = 0; i < 10; i++) {
}
使用 ++i
而不是 i++
的习惯来自 C,人们担心将 i
的旧值存储在 i++
中会导致性能下降.
在 JS 和 PHP 中它没有任何区别,我认为即使在 Java 中它也没有任何区别但是在纯 c 中当编译器没有优化代码时它确实如此,而且这就是为什么很多人使用++i的原因,因为他们从c开始就习惯了。
编辑:
如果您想要 pre 和 post increment searc C/C++ pre/post increment 的历史记录,这是 JS 的答案。或查看对@Orvev 回答的评论。
回到过去(我们在这里谈论 IE6/7!),我记得对这两种形式进行基准测试,发现 ++i
比 i++
有一个小的性能改进].我的(未经证实的)理论是,一个非优化的 JS 引擎必须在 i++
情况下做更多的工作:它必须保存以前的值以防它被使用——并且是一个非优化的engine 它没有意识到该值实际上不会被使用并且不需要保存。
但是,对于现代浏览器,没有明显的区别。如果有的话,i++
在许多浏览器中似乎要快一点。
以下是各种不同循环的一些测试:
http://jsperf.com/mikes-loops/5
查找 "Traditional Loop"(这里使用 ++i
)和 "Traditional Loop with i++".
的结果
关于 JSLint 的要求,即 永远不要 使用 ++i
或 i++
而只使用 i += 1
,这简直是疯了-控制,就像 JSLint 中的许多其他东西一样。
我个人推荐 JSHint。它不那么教条,更实用,更容易定制您自己的风格。
因为 JSLint,我几乎总是使用 i += 1
来增加一个 JavaScript for 循环,但对于快速和肮脏的脚本,我使用 i++
代替。
但是,我在其他人的代码中看到很多 for 循环,他们通过执行 ++i
来增加 i
。
据我所知,i++
和++i
在含义上没有区别,jsPref在性能上也没有区别。
因此,我想知道做 ++i
的惯例从何而来以及为什么人们倾向于这样做。
有谁知道为什么很多 JS 编码人员在 for 循环中递增计数器时倾向于选择 ++i
而不是 i++
?
谢谢。
有区别,但在 for 循环中使用时没有区别。
在表达式中,i++
求值为 i
的前一个值,然后 i
递增。 ++i
先自增,再求值。
出于这个原因,一些程序员更喜欢在他们的 for 循环中编写 ++i
— 要么是因为他们已经习惯了,要么是因为他们觉得它是 "more right" 不知何故。
编辑:更有可能的是Overv提出的解决方案:C的遗物。
区别在于i++
return是i
递增前的值,++i
是i
递增后的值。如果您忽略 return 值,则没有区别,例如在:
for (var i = 0; i < 10; i++) {
}
使用 ++i
而不是 i++
的习惯来自 C,人们担心将 i
的旧值存储在 i++
中会导致性能下降.
在 JS 和 PHP 中它没有任何区别,我认为即使在 Java 中它也没有任何区别但是在纯 c 中当编译器没有优化代码时它确实如此,而且这就是为什么很多人使用++i的原因,因为他们从c开始就习惯了。
编辑: 如果您想要 pre 和 post increment searc C/C++ pre/post increment 的历史记录,这是 JS 的答案。或查看对@Orvev 回答的评论。
回到过去(我们在这里谈论 IE6/7!),我记得对这两种形式进行基准测试,发现 ++i
比 i++
有一个小的性能改进].我的(未经证实的)理论是,一个非优化的 JS 引擎必须在 i++
情况下做更多的工作:它必须保存以前的值以防它被使用——并且是一个非优化的engine 它没有意识到该值实际上不会被使用并且不需要保存。
但是,对于现代浏览器,没有明显的区别。如果有的话,i++
在许多浏览器中似乎要快一点。
以下是各种不同循环的一些测试:
http://jsperf.com/mikes-loops/5
查找 "Traditional Loop"(这里使用 ++i
)和 "Traditional Loop with i++".
关于 JSLint 的要求,即 永远不要 使用 ++i
或 i++
而只使用 i += 1
,这简直是疯了-控制,就像 JSLint 中的许多其他东西一样。
我个人推荐 JSHint。它不那么教条,更实用,更容易定制您自己的风格。