扫码关注官方订阅号
平时都是这样写的for循环,
for(var i = 0; i < 20 ; i++){ .... }
但我看有的人这样写
for (var i = 0; i < 20 ; ++i) { .... }
这样会对for循环有什么影响?
学习是最好的投资!
大概是 C/C++ 时代带来的习惯,传说 ++i 比 i++ 要快,但事实上这两者的性能在js中是差不多的
可以拿个 profile 试一下(Chrome required):
https://jsfiddle.net/hsfzxjy/4bqa3fay/1/
在for里好像没啥区别...
但是用在赋值的时候, 就有区别了...
var a = 1; var b = a++; var c = 1; var d = ++c; console.log(b,d); // 1, 2
a++ 是先应用a, 然后再自加++a 是先自加, 然后在应用a
你这个例子我还真没看出来有什么区别(我可能眼拙了),等高人指点。
不过下面这个例子确实有区别:
var i = 0, j = 0; console.log(i++);//0 console.log(++j);//1
感受下吧:
自增自减符号貌似是C/C++带过来的习惯吧至于具体细节,规范里面关于自增/自减运算符是这么写的:
对于放在前面的情况——
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.
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.
大致翻译一下:
令expr等于当前表达式(就是++后面的部分)的结果 令oldValue等于expr转换为数字的结果 使用和“+”运算符一样的规则,令newValue = oldValue + 1 将newValue赋值给expr 整个运算式返回newValue
令expr等于当前表达式(就是++后面的部分)的结果
令oldValue等于expr转换为数字的结果
使用和“+”运算符一样的规则,令newValue = oldValue + 1
将newValue赋值给expr
整个运算式返回newValue
对于放在后面的情况——
PostfixExpression : LeftHandSideExpression ++ Let lhs be the result of evaluating LeftHandSideExpression. Let oldValue be ToNumber(GetValue(lhs)). 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(lhs, newValue). ReturnIfAbrupt(status). Return oldValue.
PostfixExpression : LeftHandSideExpression ++
Let lhs be the result of evaluating LeftHandSideExpression.
Let oldValue be ToNumber(GetValue(lhs)).
Let status be PutValue(lhs, newValue).
Return oldValue.
大致翻译——
令lhs等于当前表达式(++前面的部分)的结果 令oldValue等于lhs转换为数字的结果 使用和“+”运算符一样的规则,令newValue = oldValue + 1 将newValue赋值给lhs 整个运算式返回oldValue
令lhs等于当前表达式(++前面的部分)的结果
令oldValue等于lhs转换为数字的结果
将newValue赋值给lhs
整个运算式返回oldValue
可以看到,这两者的的区别只是最后一步,整个运算式是返回加一后的还是加一前的。对于for语句而言:
for(let i = 0; i < n; i++)
最后一栏仅仅是自加,并没有把这个值赋值给谁,所以从这一点来看,++符号放在前面或者是后面都是一样的。
两者的运算过程除开返回值不一样,其余完全相同,所以我觉得并不存在传说中的效率问题。即便是构建语法树的阶段,UnaryExpression和LeftHandSideExpression同样都是归约到Expression节点,也并没有什么不一样的地方。
UnaryExpression
LeftHandSideExpression
Expression
印象中后者效率比较高
传说C/C++中 ++i 比 i++ 在for中少了一条汇编语句,所以更快; js中不知道…
什么传说在C里谁比谁更快都是扯淡的,编译语言是有优化的,如果单独使用,不论是++i还是i++最终都是会被优化成一样的语句。而在JavaScript中,因为是解析语言,其具体实现方式是要看所使用的Js解析引擎的。
++i
i++
JavaScript
Js
i++:先使用i的值,然后执行+1操作,返回原来的值
+1
++i:执行+1操作,然后使用i的值,返回+1后的值
i
简单来说++i之所以会比i++效率高是因为i++会产生一个中间变量来保存进行+操作之前的值,而++i不会。
+
++i 等价于 i = i+1i++ 等价于 m = i ; i = i+1
i = i+1
m = i ; i = i+1
确实是从c++的std标准库而来,当i是一个std容器的iterator时,i不是一个数字,i++会多产生一个赋值操作,因此++i性能更高。所以c++习惯的人,在i不是数值时,喜欢用++i来节省开销。
微信扫码关注PHP中文网服务号
QQ扫码加入技术交流群
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
PHP学习
技术支持
返回顶部
大概是 C/C++ 时代带来的习惯,传说 ++i 比 i++ 要快,但事实上这两者的性能在js中是差不多的
可以拿个 profile 试一下(Chrome required):
https://jsfiddle.net/hsfzxjy/4bqa3fay/1/
在for里好像没啥区别...
但是用在赋值的时候, 就有区别了...
a++ 是先应用a, 然后再自加
++a 是先自加, 然后在应用a
你这个例子我还真没看出来有什么区别(我可能眼拙了),等高人指点。
不过下面这个例子确实有区别:
感受下吧:
自增自减符号貌似是C/C++带过来的习惯吧
至于具体细节,规范里面关于自增/自减运算符是这么写的:
对于放在前面的情况——
大致翻译一下:
对于放在后面的情况——
大致翻译——
可以看到,这两者的的区别只是最后一步,整个运算式是返回加一后的还是加一前的。
对于for语句而言:
最后一栏仅仅是自加,并没有把这个值赋值给谁,所以从这一点来看,++符号放在前面或者是后面都是一样的。
两者的运算过程除开返回值不一样,其余完全相同,所以我觉得并不存在传说中的效率问题。
即便是构建语法树的阶段,
UnaryExpression和LeftHandSideExpression同样都是归约到Expression节点,也并没有什么不一样的地方。印象中后者效率比较高
传说C/C++中 ++i 比 i++ 在for中少了一条汇编语句,所以更快; js中不知道…
什么传说在C里谁比谁更快都是扯淡的,编译语言是有优化的,如果单独使用,不论是
++i还是i++最终都是会被优化成一样的语句。而在
JavaScript中,因为是解析语言,其具体实现方式是要看所使用的Js解析引擎的。i++:先使用i的值,然后执行+1操作,返回原来的值++i:执行+1操作,然后使用i的值,返回+1后的值简单来说
++i之所以会比i++效率高是因为i++会产生一个中间变量来保存进行+操作之前的值,而++i不会。++i等价于i = i+1i++等价于m = i ; i = i+1确实是从c++的std标准库而来,当i是一个std容器的iterator时,i不是一个数字,i++会多产生一个赋值操作,因此++i性能更高。所以c++习惯的人,在i不是数值时,喜欢用++i来节省开销。