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 相关文章推荐
Jquery异步请求数据实例代码
Dec 28 Javascript
js 操作select和option常用代码整理
Dec 13 Javascript
js实现使用鼠标拖拽切换图片的方法
May 04 Javascript
JavaScript统计字符串中每个字符出现次数完整实例
Jan 28 Javascript
学习Angular中作用域需要注意的坑
Aug 17 Javascript
JS排序之快速排序详解
Apr 08 Javascript
基于Vue实现支持按周切换的日历
Sep 24 Javascript
elemetUi 组件--el-upload实现上传Excel文件的实例
Oct 27 Javascript
Node.js使用cookie保持登录的方法
May 11 Javascript
微信小程序仿微信运动步数排行(交互)
Jul 13 Javascript
关于JSON解析的实现过程解析
Oct 08 Javascript
javascript实现评分功能
Jun 24 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
Zerg剧情介绍
2020/03/14 星际争霸
封装一个PDO数据库操作类代码
2009/09/09 PHP
PHP在引号前面添加反斜杠(PHP去除反斜杠)
2013/09/28 PHP
支持中文、字母、数字的PHP验证码
2015/05/04 PHP
PHP常用函数之获取汉字首字母功能示例
2019/10/21 PHP
javascript setTimeout和setInterval 的区别
2009/12/08 Javascript
自动最大化窗口的Javascript代码
2013/05/22 Javascript
把文本中的URL地址转换为可点击链接的JavaScript、PHP自定义函数
2014/07/29 Javascript
Nodejs学习笔记之NET模块
2015/01/13 NodeJs
JS实现获取键盘按下的按键并显示在页面上的方法
2015/11/04 Javascript
Vue.js第一天学习笔记(数据的双向绑定、常用指令)
2016/12/01 Javascript
基于ExtJs在页面上window再调用Window的事件处理方法
2017/07/26 Javascript
VUEJS 2.0 子组件访问/调用父组件的实例
2018/02/10 Javascript
vue自定义键盘信息、监听数据变化的方法示例【基于vm.$watch】
2019/03/16 Javascript
Python列表生成器的循环技巧分享
2015/03/06 Python
Python httplib模块使用实例
2015/04/11 Python
python比较2个xml内容的方法
2015/05/11 Python
python自动登录12306并自动点击验证码完成登录的实现源代码
2018/04/25 Python
python实现随机梯度下降法
2020/03/24 Python
pip安装py_zipkin时提示的SSL问题对应
2018/12/29 Python
Django项目创建到启动详解(最全最详细)
2019/09/07 Python
win10系统Anaconda和Pycharm的Tensorflow2.0之CPU和GPU版本安装教程
2019/12/03 Python
python 和c++实现旋转矩阵到欧拉角的变换方式
2019/12/04 Python
解决Keras使用GPU资源耗尽的问题
2020/06/22 Python
AHAVA美国官方网站:死海海泥护肤品牌
2016/10/18 全球购物
Molly Bracken法国电子商店:法国女性时尚品牌
2019/07/24 全球购物
设计师大码女装:11 Honoré
2020/05/03 全球购物
国际贸易专业推荐信
2013/11/15 职场文书
设计顾问服务计划书
2014/05/04 职场文书
安全技术说明书
2014/05/09 职场文书
学习雷锋演讲稿
2014/05/10 职场文书
个人委托书如何写
2014/09/25 职场文书
违反单位工作制度检讨书
2014/10/25 职场文书
Python爬虫基础讲解之请求
2021/05/13 Python
MySQL中EXPLAIN语句及用法
2022/05/20 MySQL
vue实现简易音乐播放器
2022/08/14 Vue.js