请输入代码
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..
代码大致相当于如下:
var iNow=0;
var x;
var iTimer=setInterval(auto, 1000);
function auto () {
x = iNow % 3;
iNow++;
iNow = x;
console.log(iNow);
}
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的值就可以持续递增了
}
manxisuo 的回答很精简,也非常全面。
这里就借用犀牛书里的一段话吧。
递增“++”
运算符的返回值依赖于它相对于操作数的位置。
当运算符在操作数之前,称为“前增量”(pre-increment)运算符,它对操作数进行增量计算,*并返回计算后的值*。
当运算符在操作数之后,称为“增量”(post-increment)运算符,它对操作数进行增量计算,但返回未做增量计算的值。
因为iNow++的结果是0
因为(iNow++)
的结果是0,然后(iNow++)%3
当然还是0。然后通过赋值语句把0给了iNow
这个名字指向的内存地址。
所以,不论你循环多少次都是0。
++实际上也起作用了,但是马上被赋值运算覆盖了。
关键点就是:
永远要把赋值表达式左边的操作数看成一个对实际内存空间的引用,而不是哪个具体的名字。
另外,关于++a和a++表达式的区别是:前者返回自增后的值,后者返回自增前的值。
由于容易出错,所以尽量不要在某个变量出现了多次的表达式里面对这个变量进行自增或自减操作。