js for循环中i++ 和 ++i有什么区别?
平时都是这样写的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.
大致翻译一下:
令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.
大致翻译——
令lhs等于当前表达式(++前面的部分)的结果
令oldValue等于lhs转换为数字的结果
使用和“+”运算符一样的规则,令newValue = oldValue + 1
将newValue赋值给lhs
整个运算式返回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有什么区别?的更多相关文章
- js for循环中i++与++i有什么区别
平时都是这样写的for循环, 1 2 3 for(var i = 0; i < 20 ; i++){ .... } 但我看有的人这样写 for (var i = 0; ...
- for循环中 i++和++i 是否有区别?
正常情况下 i++和++i是有区别的: 前者是:先引用,后增加, 后者是:先增加,后引用, 但是在for循环中: for(var i=0;i<10;i++){ System.out.print ...
- js for循环中的var与let
var a = []; for (var i = 0; i < 10; i++) { a[i] = function () { console.log(i); }; } a[6](); 上面代码 ...
- 关于while循环中的break和continue的区别
while循环如果不加条件限制的话,它会一直循环下去,那么问题就来了,如果我不用条件去终止while循环的话,那么我该用什么方法去终止呢? 你可以选择两种终止while循环的方法 1.break 强 ...
- JS如何获取PHP循环中的ID
JS如何获取PHP循环中的ID kaalrz 二路公交车 结帖率:83.33% 首先抱歉,因为昨天那帖图片几次都不能用,修改到不能再次修改,今天早上回帖又提示没有这个帖,只好重发一次. 如 ...
- JavaScript形而上的For循环中的Break
break相当于循环中的GOTO,需避免使用. 下面是一个break使用例子. 找出第一个months小于7的项目. const cats = [ { name: 'Mojo', months: 84 ...
- vue 如何在循环中 "监听" 的绑定v-model数据
vue 如何在循环中 "监听" 的绑定v-model数据 阅读目录 vue 如何在循环中 "监听" 的绑定v-model数据 1. 普通属性的值进行监听 2. ...
- for循环中setTimeout,var与let的不同
先看下面两段代码 for (let i = 0; i < 5; i++) { setTimeout(function () { console.log(i) }, 2000) } for (va ...
- for循环中i--的妙用 及 两变量互换数值的问题
int[] array = new int[4]; for(int i = 0; i < array.length; i++){ array[i] = (int)(Math.random() * ...
随机推荐
- easyuidatagrid中load,reload,loadData的区别
摘要:datagrid中有load,reload,loadData那三个方式,皆是加载数据的,但又有差别.下面让我们一起来看看: 首先,load方法,比如我已经定义一个datagrid的id为grid ...
- Sql Server系列:字符串函数
字符串函数用于对字符和二进制字符串进行各种操作,大多数字符串函数只能作用于char.nchar.varchar和nvarchar数据类型.字符串函数可以用在SELECT或者WHERE语句中. 1. A ...
- Javascript算法系列之快速排序(Quicksort)
原文出自: http://www.nczonline.net/blog/2012/11/27/computer-science-in-javascript-quicksort/ https://gis ...
- 控制对话框风格的activity的显示大小与位置
项目开发的需要,因为到现在项目接近完工,用户提出对条件筛选方式进行修改,为做到最小的改动实现用户的需求,各种百度,对于对话框风格大家普遍使用PopupWindow,但由于之前开发设计时使用的是acti ...
- 利用angular结合translate为项目实现国际化
前言 利用H5项目第一版本已经上线,话说有了第一期就有了第二期,这不要为第二期做准备了,老大发话第一件事就要利用Angular JS实现项目的国际化以及后续要借助这个框架来实现其他功能,好吧我表示没怎 ...
- 谈谈JIT编译器和本机影像生成器(NGen.exe)
前言 在看<CLR>的时候,作者在开篇的时候提到了NGen.exe,前面一节执行程序集的代码中提到:程序或方法执行前会执行MSCorEE.dll中的JIT函数把要执行方法的IL转换成本地的 ...
- 回忆:#define的用法
ANSI C规定:#前可以有空格或者tab,#和指令其余部分之间也可以有空格,可以出现在任何地方,作用域从定义处到文件结尾. 因为预处理开始前,系统会删除反斜线和换行符的组合,故可以把指令扩展到几个物 ...
- ubuntu super daemon设置
super daemon是一个在Linux下面全面管理自己服务设置的东东,他可以接管很多服务的设定,只需要在/etc/xinetd.d/下面放置好自己的配置文件就可以了,那么,具体应该怎么配置呢? ...
- java多线程--几个多线程面试题小结
自学了一段时间的多线程知识,尝试了做了几个编程题,发现想象中很简单的功能,自己真写起来要花费远超自己想象的功夫,知识点易学,不易用啊. 面试题1:编写程序实现,子线程循环10次,接着主线程循环20次, ...
- hibernate笔记--实体类映射文件"*.hbm.xml"详解
实体类就是指普通的POJO,Hibernate并不知道那个实体类对应数据库的哪一张表,所以还需要配置一下,常用的方式就是*.hbm.xml文件[配置与@注解配置,这里介绍前者的详细属性: <?x ...