这篇文章主要介绍了 JS for 循环中 i++ 和 ++i 的区别介绍的相关资料, 需要的朋友可以参考下
Javascript 是一种由 Netscape 的 LiveScript 发展而来的原型化继承的基于对象的动态类型的区分大小写的客户端脚本语言,主要目的是为了解决服务器端语言,比如 Perl,遗留的速度问题,为客户提供更流畅的浏览效果。
平时都是这样写的 for 循环,
- for(var i = 0; i < 20 ; i++){
- ....
- }
但我看有的人这样写
- for (var i = 0; i < 20 ; ++i) {
- ....
- }
这样会对 for 循环有什么影响?
1. 在 for 里好像没啥区别...
但是用在赋值的时候, 就有区别了...
- var a = 1;
- var b = a++;
- var c = 1;
- var d = ++c;
- console.log(b, d); // 1, 2
a++ 是先应用 a, 然后再自加
++a 是先自加, 然后在应用 a
2. 大概是 C/C++ 时代带来的习惯,传说 ++i 比 i++ 要快,但事实上这两者的性能在 js 中是差不多的。
至于具体细节,规范里面关于自增 / 自减运算符是这么写的:
对于放在前面的情况——
- UnaryExpression : ++ UnaryExpression
- Let expr be the result of evaluating UnaryExpression.
- Let oldValue be ToNumber(GetValue(expr)).
- ReturnIfAbrupt(oldValue).
- Let newValue be the result of adding the value 1 to oldValue, using the same rules as for the + operator (see 12.7.5).
- Let status be PutValue(expr, newValue).
- ReturnIfAbrupt(status).
- Return newValue.
大致翻译一下:
1. 令 expr 等于当前表达式(就是 ++ 后面的部分)的结果
2. 令 oldValue 等于 expr 转换为数字的结果
3. 使用和 "+" 运算符一样的规则,令 newValue = oldValue + 1
4. 将 newValue 赋值给 expr
5. 整个运算式返回 newValue
对于放在后面的情况——
PostfixExpression : LeftHandSideExpression ++
1.Let lhs be the result of evaluating LeftHandSideExpression.
2.Let oldValue be ToNumber(GetValue(lhs)).
3.ReturnIfAbrupt(oldValue).
4.Let newValue be the result of adding the value 1 to oldValue, using the same rules as for the + operator (see 12.7.5).
5.Let status be PutValue(lhs, newValue).
6.ReturnIfAbrupt(status).
7.Return oldValue.
大致翻译——
1. 令 lhs 等于当前表达式(++ 前面的部分)的结果
2. 令 oldValue 等于 lhs 转换为数字的结果
3. 使用和 "+" 运算符一样的规则,令 newValue = oldValue + 1
4. 将 newValue 赋值给 lhs
5. 整个运算式返回 oldValue
可以看到,这两者的的区别只是最后一步,整个运算式是返回加一后的还是加一前的。
对于 for 语句而言:
- for(var i = 0; i < n; i++)
最后一栏仅仅是自加,并没有把这个值赋值给谁,所以从这一点来看,++ 符号放在前面或者是后面都是一样的。
3. 事实上没有太大区别。但是如果要追求那一点点效率问题的话,++i 确实会效率高一些.
确实是从 c++ 的 std 标准库而来,当 i 是一个 std 容器的 iterator 时,i 不是一个数字,i++ 会多产生一个赋值操作,因此 ++i 性能更高。所以 c++ 习惯的人,在 i 不是数值时,喜欢用 ++i 来节省开销。
以上所述是小编给大家介绍的 JS for 循环中 i++ 和 ++i 的区别介绍,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 phperz 网站的支持!
来源: http://www.phperz.com/article/17/0306/264178.html