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 相关文章推荐
看了就知道什么是JSON
Dec 09 Javascript
javascript vvorld 在线加密破解方法
Nov 13 Javascript
javascript 表格排序和表头浮动效果(扩展SortTable)
Apr 07 Javascript
js document.write()使用介绍
Feb 21 Javascript
JavaScript中对象property的读取和写入方法介绍
Dec 30 Javascript
js获取对象、数组的实际长度,元素实际个数的实现代码
Jun 08 Javascript
jQuery简单实现列表隐藏和显示效果示例
Sep 12 Javascript
微信小程序 教程之模板
Oct 18 Javascript
jQuery事件对象的属性和方法详解
Sep 09 jQuery
微信小程序如何再次获取用户授权的方法
May 10 Javascript
vue iview多张图片大图预览、缩放翻转
Jul 13 Javascript
jQuery实现可以扩展的日历
Dec 01 jQuery
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
ezSQL PHP数据库操作类库
2010/05/16 PHP
php的memcached客户端memcached
2011/06/14 PHP
php取得字符串首字母的方法
2015/03/25 PHP
composer.lock文件的作用
2016/02/03 PHP
PHP合并数组的2种方法小结
2016/11/24 PHP
PHP实现打包zip并下载功能
2018/06/12 PHP
实现PHP中session存储及删除变量
2018/10/15 PHP
jQuery EasyUI 中文API Layout(Tabs)
2010/04/27 Javascript
javascript作用域和闭包使用详解
2014/04/25 Javascript
jquery实现的树形目录实例
2015/06/26 Javascript
浅谈js的html元素的父节点,子节点
2016/08/06 Javascript
Angular的模块化(代码分享)
2016/12/26 Javascript
原生js获取浏览器窗口及元素宽高常用方法集合
2017/01/18 Javascript
Angularjs渲染的 using 指令的星级评分系统示例
2017/11/09 Javascript
在knockoutjs 上自己实现的flux(实例讲解)
2017/12/18 Javascript
常用的 JS 排序算法 整理版
2018/04/05 Javascript
React中使用UEditor百度富文本的方法
2018/08/22 Javascript
如何实现一个webpack模块解析器
2018/10/24 Javascript
详解Angular中实现自定义组件的双向绑定的两种方法
2018/11/23 Javascript
Vue 监听元素前后变化值实例
2020/07/29 Javascript
python打开文件并获取文件相关属性的方法
2015/04/23 Python
python3使用scrapy生成csv文件代码示例
2017/12/28 Python
Python工厂函数用法实例分析
2018/05/14 Python
Python对象与引用的介绍
2019/01/24 Python
基于TensorFlow中自定义梯度的2种方式
2020/02/04 Python
python十进制转二进制的详解
2020/02/07 Python
python实现用户名密码校验
2020/03/18 Python
python利用 keyboard 库记录键盘事件
2020/10/16 Python
复古风格的女装和装饰品:ModCloth
2017/12/29 全球购物
财务人员个人自荐信范文
2013/09/26 职场文书
交通安全演讲稿
2014/01/07 职场文书
孝老爱亲模范事迹
2014/01/24 职场文书
副厂长岗位职责
2014/02/02 职场文书
撤诉申请怎么写
2015/05/19 职场文书
浅谈Mysql多表连接查询的执行细节
2021/04/24 MySQL
python执行js代码的方法
2021/05/13 Python