javascript - 关于js“++”位置先后的疑问
高洛峰
高洛峰 2017-04-10 16:53:26
[JavaScript讨论组]
请输入代码
    var iNow=0;
    var iTimer=setInterval(auto, 1000);
    function auto () {
        iNow=(iNow++)%3;
        console.log(iNow);
    }

请问大家,为什么输出的都是0,而不是1 2 0 1 2..这样循环呢?求解答。
把++放在iNow反而就可以顺利输出 1 2 0 1 2..

高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

全部回复(5)
ringa_lee

因为(iNow++)的结果是0,然后(iNow++)%3当然还是0。然后通过赋值语句把0给了iNow这个名字指向的内存地址

所以,不论你循环多少次都是0。
++实际上也起作用了,但是马上被赋值运算覆盖了。

关键点就是:

永远要把赋值表达式左边的操作数看成一个对实际内存空间的引用,而不是哪个具体的名字。

另外,关于++a和a++表达式的区别是:前者返回自增后的值,后者返回自增前的值。

由于容易出错,所以尽量不要在某个变量出现了多次的表达式里面对这个变量进行自增或自减操作。

高洛峰

manxisuo 的回答很精简,也非常全面。

这里就借用犀牛书里的一段话吧。
递增“++”
运算符的返回值依赖于它相对于操作数的位置。
当运算符在操作数之前,称为“前增量”(pre-increment)运算符,它对操作数进行增量计算*并返回计算后的值*。
当运算符在操作数之后,称为“增量”(post-increment)运算符,它对操作数进行增量计算但返回未做增量计算的值

黄舟

代码大致相当于如下:

var iNow=0;
var x;
var iTimer=setInterval(auto, 1000);
function auto () {
    x = iNow % 3;
    iNow++;
    iNow = x;
    console.log(iNow);
}
PHP中文网

iNow++, 会让iNow的值先参与运算,然后在加1
++iNow, 会让iNow的值先加1,然后参与运算

iNow = 0;
iNow = (iNow++)%3;
// 根据上面的规则,(iNow++)%3,会先使用iNow=0的值参与运算,输出结果,然后在让iNow的值加1。因此(iNow++)%3的运行结果任然是0,而你这里让iNow接收了这个结果,因此,iNow始终都是0.

改正如下,使用另外一个变量接收计算结果

function auto() {
    var res = (iNow++)%3;
    console.log(res);
    // 这样iNow的值就可以持续递增了
}
黄舟

因为iNow++的结果是0

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号