i++ 与 i=i+1 区别?

i++ 与 i = i+1;得到的结果为什么不同?

i++如下:

var i = 'r'; i++;
console.log(i);      //NaN

i = i + 1如下:

var i = 'r' ; i=i+1;
console.log(i);     // r1
阅读 8.8k
8 个回答

“++”运算符从不进行字符串连接操作,它总是会将操作数转换为数字并增1。————摘自《JavaScript权威指南》

看几组例子就应该明白了

//第一组
var num1 = 20;
var num2 = num1 + 1;
alert(num1);//20
alert(num2);//21

//第二组
var num3 = 20;
var num4 = ++num3 + 1;//执行前置递增和递减操作时,变量的值都是在语句被求值以前改变的。
alert(num3);//21
alert(num4);//22

//第三组
var num5 = 20;
var num6 = num5++ + 1;//后置递增和递减与前置递增和递减有一个非常重要的区别,即递增和递减操作是在包含它们的语句被求
值之后才执行的。
alert(num5);//21
alert(num6);//21

var i = 'r'; i++;
console.log(i); //++是自增1操作,把i转化为数字类型,很显然'r'是不能转化为数字类型的,所以为NaN。

var i = 'r' ; i=i+1;
console.log(i); // i=i+1 就是字符串的拼接。

参考:
alert(1 + 1);//2
alert('1' + 1 + 1);//111
alert('1' + (1 + 1));/12

‘++’运算符在js承担一个职责:数值的自增。
而‘+’运算符在js中承担了两个职责:两数之和、字符串的拼接。
当‘+’的两个对象都是数值时,就是求和,当‘+’的对象的其中一个是字符串时,就是拼接。

所以,i = i + 1时, 其实是 ‘r’ + 1 ,拼接后为 ‘r1’
而‘++’是纯粹的数值运算,'r'本身就是 非数(NaN),最后运算也就是 NaN。

如果放到底层来说,调用的CPU指令(进入的门)不一样

可以简单理解为:CPU中有一个小学生,专门做++这个操作的;老师布置给他的作业全是++,当他拿到这个作业时,他就做一件事,就时把原来的值变大那么一点点,然后交给老师;

但另外一个小学生,专门做+ 这个操作,老师布置给他的作业就全是 + ,当他拿到这个作业的时候,他就需要 两个作业内容,加起来,然后交给老师。

尽管有时候他们做的事情本质是一样,答案也是一样的。但工作就是工作,不同类型的工作给不同类型的CPU指令去完成。

当然,你用的js,这中间又复杂了很多,有很多编译,优化过程,我们可以暂且不管。

新手上路,请多包涵

我来说说我的理解啊,i+1相当于++i。而i++与++i的区别就是前者是先运算后加,而后者是先加后运算。

因为JS时弱类型语言,所以它在识别你的运算符时,会判断你的运算参数,如果都是数字类型参数则 “+” 就是正常的运算加号,如果你使用的 “+” 的前后参数非数字时,则它的就时字符串的连接符号。
而你这里的

var i = 'r'; i++;

i++;是每次自增+1,是js已经将他认为是正常的运算符号,但是你前面又把'r'赋值给了i,而r无法自增,所以结果为空(NaN)

var i = 'r' ; i=i+1;

这里你把'r'赋值给i,因为i已经时字符串了,所以js把+认为时字符串连接符,所以结果为r1

++运算符期望操作数是number类型,所以在运算过程中字符串'r'会转换为number类型NaN,因此结果是NaN。

而+运算符既可以做数字加法操作也可以进行字符串拼接操作。但是该运算符更偏向于字符串操作,所以只要其中一个操作数是字符串就会进行字符串拼接操作,因此结果是'r1'。

参考链接:

https://stackoverflow.com/que...

i++是先对i操作,再对i执行+1;
++i是先运行+1,将值赋给i后,再对i操作;
比如:
int i=1;
int a=1+ i++; //运行过程是1+1,然后再将结果2赋给a,最后是i=i+1;
int a=1+ ++i; //运行过程是先运行i=i+1,得到2,然后运行1+i,并将结果1+i赋给a;

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题