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 相关文章推荐
JAVASCRIPT HashTable
Jan 22 Javascript
JavaScript怎么判断图片是否加载完成以便获取其尺寸
May 08 Javascript
JavaScript中reduce()方法的使用详解
Jun 09 Javascript
jquery使用Cookie和JSON记录用户最近浏览历史
Apr 19 Javascript
Vue项目中如何引入icon图标
Mar 28 Javascript
webpack v4 从dev到prd的方法
Apr 02 Javascript
详解Ant Design of React的安装和使用方法
Dec 27 Javascript
jQuery pager.js 插件动态分页功能实例分析
Aug 02 jQuery
JS实现水平遍历和嵌套递归操作示例
Aug 15 Javascript
教你如何用Node实现API的转发(某音乐)
Sep 20 Javascript
javascript的delete运算符知识点总结
Nov 19 Javascript
详解vue中v-on事件监听指令的基本用法
Jul 22 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
关于Intype一些小问题的解决办法
2008/03/28 PHP
php strlen mb_strlen计算中英文混排字符串长度
2009/07/10 PHP
PHP 文件缓存的性能测试
2010/04/25 PHP
php 访问oracle 存储过程实例详解
2017/01/08 PHP
PHP实现二维数组去重功能示例
2017/01/12 PHP
一个简单的JS鼠标悬停特效具体方法
2013/06/17 Javascript
jQuery基于ajax实现星星评论代码
2015/08/07 Javascript
js中class的点击事件没有效果的解决方法
2016/10/13 Javascript
JS获取字符对应的ASCII码实例
2017/09/10 Javascript
cocos creator Touch事件应用(触控选择多个子节点的实例)
2017/09/10 Javascript
vue如何引入sass全局变量
2018/06/28 Javascript
微信小程序实现tab左右切换效果
2020/11/15 Javascript
nodejs异步编程基础之回调函数用法分析
2018/12/26 NodeJs
微信小程序实现简易table表格
2020/06/19 Javascript
解决vue bus.$emit触发第一次$on监听不到问题
2020/07/28 Javascript
原生JavaScript实现幻灯片效果
2021/02/19 Javascript
Python实现曲线拟合操作示例【基于numpy,scipy,matplotlib库】
2018/07/12 Python
Python中创建二维数组
2018/10/17 Python
树莓派动作捕捉抓拍存储图像脚本
2019/06/22 Python
python实现输入任意一个大写字母生成金字塔的示例
2019/10/27 Python
Python打印特殊符号及对应编码解析
2020/05/07 Python
python批量修改交换机密码的示例
2020/09/22 Python
意大利综合购物网站:Giordano Shop
2016/10/21 全球购物
工商管理专业实习大学生自我鉴定
2013/09/19 职场文书
设计总监岗位职责
2013/12/07 职场文书
禁烟标语大全
2014/06/11 职场文书
护士长2014年终工作总结
2014/11/11 职场文书
少先队辅导员事迹材料
2014/12/24 职场文书
2015年体育教学工作总结
2015/05/20 职场文书
大学生学生会工作总结2015
2015/05/26 职场文书
婚庆公司开业主持词
2015/06/30 职场文书
2019个人工作总结
2019/06/21 职场文书
Python基础之元编程知识总结
2021/05/23 Python
详解Flask开发技巧之异常处理
2021/06/15 Python
豆瓣2021评分最高动画剧集-豆瓣评分最高的动画剧集2021
2022/03/18 日漫
table不让td文字溢出操作方法
2022/12/24 HTML / CSS