资讯专栏INFORMATION COLUMN

彻底理解 i++ 与 ++i 的区别

edgardeng / 919人阅读

摘要:以上的输出的结果是先看来看看他们的语法定义前置递增递减执行前置递增和递减操作时,变量的值都是在语句被求值以前递减递增的。在计算机科学领域,这种情况通常被称作副效应。

var j=0;
for (i=0;i<100;i++){
    j=j++;
}
console.log(j);

以上的输出的结果是 0;先看来看看他们的语法定义:

前置递增递减 ++i / --i

执行前置递增和递减操作时,变量的值都是在语句被求值以前递减递增的。(在计算机科学领域,这种情况通常被称作副效应。)请看下面这个例子。

let age=29;
let newAge= --age + 2
console.log(age);
console.log(newAge);

前置递增递减遇到有赋值操作时: 先递减(29-1),再计算表达式的值(28加上2)

后置递增递减 i++ / i--

后置递增和递减与前置递增和递减有一个非常重要的区别,即递增和递减操作是在包含它们的语句被求值之后才执行的

let age=29;
let newAge= age-- + 2
console.log(age);
console.log(newAge);

后置递增递减遇到有赋值操作时: 先计算表达式的值(29+2=31),再递减(29-1)

他们有什么区别

先看下面的例子:

var j=0;
for (i=0;i<100;i++){
    j++;
}
console.log(j);

var j=0;
for (i=0;i<100;i++){
    ++j;
}
console.log(j);

可以看出 没有赋值等其他操作时, 其实++i与i++是没有区别的
但是,当递增递减语句中包含其他操作时:
前置递增递减:

let num1=1;
let num2=2;
let num3=++num1+num2;
let num4=num1+num2;
console.log(num3);
console.log(num4);


后置递增递减:

let num1=1;
let num2=2;
let num3=num1++ + num2;
let num4=num1+num2;
console.log(num3);
console.log(num4);


包括上方的age例子 我们看出同样的求值,出现了不同的结果;
我们可以看出 前置递增使用了递增后的值(num1 递增后为2)同num2相加得到4;后置递增使用了递增前的值(num1为1)同num2 相加得到3
至此,我们就可以可以明白文章开始例子中j=j++; 之后循环的值为什么一直是0

j=j++;可以理解为 j = j 递增前的值; 而递增前的值为0;因此j 每次循环都恒等于0;改为前置递增则可以解决这个问题:

var j=0;
for (i=0;i<100;i++){
    j=++j;
}
console.log(j);


墙裂推荐,为了方便理解在非在必要条件下建议避免书写i=i++;这样的赋值语句

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/104033.html

相关文章

  • 低门槛彻底理解JavaScript中深拷贝和浅拷贝

    摘要:案例中的赋值就是典型的浅拷贝,并且深拷贝与浅拷贝的概念只存在于引用类型。修改修改经测试,也只能实现一维对象的深拷贝。经过验证,我们发现提供的自有方法并不能彻底解决的深拷贝问题。 在说深拷贝与浅拷贝前,我们先看两个简单的案例: //案例1 var num1 = 1, num2 = num1; console.log(num1) //1 console.log(num2) //1 num...

    wind3110991 评论0 收藏0
  • 一文让你彻底理解 Java NIO 核心组件

    摘要:的出现解决了这尴尬的问题,非阻塞模式下,通过,我们的线程只为已就绪的通道工作,不用盲目的重试了。注意要将注册到,首先需要将设置为非阻塞模式,否则会抛异常。 同步、异步、阻塞、非阻塞首先,这几个概念非常容易搞混淆,但NIO中又有涉及,所以总结一下[1]。 同步:API调用返回时调用者就知道操作的结果如何了(实际读取/写入了多少字节)。 异步:相对于同步,API调用返回时调用者不知道操作...

    guyan0319 评论0 收藏0
  • 深入前端-彻底搞懂浏览器运行机制

    摘要:当这些异步任务发生的时候,它们将会被放入浏览器的事件任务队列中去,等到运行时执行线程空闲时候才会按照队列先进先出的原则被一一执行,但终究还是单线程。 浏览器是多进程的 showImg(https://segmentfault.com/img/remote/1460000019706956?w=815&h=517); Browser进程: 浏览器的主进程(负责协调、主控),只有一个。 负...

    YPHP 评论0 收藏0
  • 深入前端-彻底搞懂浏览器运行机制

    摘要:当这些异步任务发生的时候,它们将会被放入浏览器的事件任务队列中去,等到运行时执行线程空闲时候才会按照队列先进先出的原则被一一执行,但终究还是单线程。 浏览器是多进程的 showImg(https://segmentfault.com/img/remote/1460000019706956?w=815&h=517); Browser进程: 浏览器的主进程(负责协调、主控),只有一个。 负...

    Youngs 评论0 收藏0

发表评论

0条评论

edgardeng

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<