JS for循环中i++ 和 ++i的区别介绍


Posted in Javascript onJuly 20, 2016

平时都是这样写的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的区别介绍,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
javascrip关于继承的小例子
May 10 Javascript
jquery获取元素值的方法(常见的表单元素)
Nov 15 Javascript
JS创建类和对象的两种不同方式
Aug 08 Javascript
JavaScript学习心得之概述
Jan 20 Javascript
javascript类型系统 Array对象学习笔记
Jan 09 Javascript
Bootstrap每天必学之响应式导航、轮播图
Apr 25 Javascript
JavaScript中浅讲ajax图文详解
Nov 11 Javascript
JavaScript中splice与slice的区别
May 09 Javascript
vuejs2.0子组件改变父组件的数据实例
May 10 Javascript
Vue编写多地区选择组件
Aug 21 Javascript
angularjs路由传值$routeParams详解
Sep 05 Javascript
基于Vue SEO的四种方案(小结)
Jul 01 Javascript
javascript和jQuery实现网页实时聊天的ajax长轮询
Jul 20 #Javascript
Node.js如何自动审核团队的代码
Jul 20 #Javascript
js只执行1次的函数示例
Jul 20 #Javascript
JQuery为元素添加样式的实现方法
Jul 20 #Javascript
JCrop+ajaxUpload 图像切割上传的实例代码
Jul 20 #Javascript
javaScript给元素添加多个class的简单实现
Jul 20 #Javascript
JavaScript中数组的22种方法必学(推荐)
Jul 20 #Javascript
You might like
PHP 年龄计算函数(精确到天)
2012/06/07 PHP
使用php完成常见的文件上传功能(推荐)
2017/01/13 PHP
Thinkphp事务操作实例(推荐)
2017/04/01 PHP
PHP PDOStatement::errorInfo讲解
2019/01/31 PHP
php变量与字符串的增删改查操作示例
2020/05/07 PHP
JS操作数据库的实例代码
2013/10/17 Javascript
JSONP跨域GET请求解决Ajax跨域访问问题
2014/12/31 Javascript
Js制作点击输入框时默认文字消失的效果
2015/09/05 Javascript
JS弹出对话框实现方法(三种方式)
2015/12/18 Javascript
怎么限制input的text里输入的值只能是数字(正则、js)
2016/05/16 Javascript
Vue.js教程之axios与网络传输的学习实践
2017/04/29 Javascript
Vue-Router进阶之滚动行为详解
2017/09/13 Javascript
详解关于微信setData回调函数中的坑
2019/02/18 Javascript
layui 解决富文本框form表单提交为空的问题
2019/10/26 Javascript
[03:01]完美盛典趣味短片 DOTA2年度最佳&拉胯英雄
2019/12/07 DOTA
Python中除法使用的注意事项
2014/08/21 Python
Python使用Flask框架获取当前查询参数的方法
2015/03/21 Python
Python中的高级数据结构详解
2015/03/27 Python
Python设计模式之外观模式实例详解
2019/01/17 Python
Python提取频域特征知识点浅析
2019/03/04 Python
树莓派动作捕捉抓拍存储图像脚本
2019/06/22 Python
Python 实现判断图片格式并转换,将转换的图像存到生成的文件夹中
2020/01/13 Python
在Ubuntu 20.04中安装Pycharm 2020.1的图文教程
2020/04/30 Python
Python基于数列实现购物车程序过程详解
2020/06/09 Python
PyCharm2020.1.2社区版安装,配置及使用教程详解(Windows)
2020/08/07 Python
HTML5 新事件 小结
2009/07/16 HTML / CSS
如何用H5实现一个触屏版的轮播器的实例
2017/01/09 HTML / CSS
Otticanet澳大利亚:最顶尖的世界名牌眼镜, 能得到打折季的价格
2018/08/23 全球购物
Expedia法国:全球最大在线旅游公司
2018/09/30 全球购物
一套.net面试题及答案
2016/11/02 面试题
环保倡议书范文
2014/05/12 职场文书
2014年人事科工作总结
2014/11/19 职场文书
英语读书笔记
2015/07/02 职场文书
中秋联欢会主持词
2015/07/04 职场文书
redis数据结构之压缩列表
2022/03/21 Redis
MySQL中的全表扫描和索引树扫描
2022/05/15 MySQL