JavaScript中的递增和递减运算符都是一元操作符,言外之意就是只能操作一个值的操作符。递增和递减操作符直接借鉴自C语言,各有两种版本:前置型(递增++i,递减–i)和后置型(递增i++,递减i–)。在JavaScript中,递增(递减)的前置和后置运算符对于初学者都非常容易混淆。
前置型递增(递减)
前置型递增也称之为前增量(pre-increment)运算符,它对操作数进行增量计算,并返回其计算后的值。这样或许不太好理解,换过一种方式来理解:前增量指的先计算,后赋值。
例如:
var i = 1;
console.log(i); // => 1++i;
console.log(i); // => 2
这个示例,前置递增++i操作符把i的值变成了2(也就是1+1)。实际上,执行前置递增++i和执行下面的表达式效果相同:
var i = 1;
i = i + 1;
console.log(i); // => 2
简单点讲:前置型递增就是先自身计算,再赋值给变量
var i = 1;var a = ++i;
// var i = 1; i = i + 1; a = i;console.log(a); // => 2console.log(i); // => 2
其中var a = ++i,实际上做了下面这几个操作:
i = 1;a = i + 1;i = i + 1;a = i;
前置递减–i和前置递增++i类似,不同的是先做减法(减1),再赋值。比如:
var i = 6;
a = --i;
console.log(a); // => 5console.log(i); // => 5
代码中的–i相当于:
var i = 6;
i = i - 1;
a = i - 1;
a = i;
执行前置递增和递减时,变量的值都是在语句被求值以前改变的(返回它递增(减)之后的值)。在计算机科学领域中,这种情况通常被称之为副效应
var age = 29;var anotherAge = --age + 2;
console.log(age) // => 28 (age = age - 1)console.log(anotherAge); // 30 (anotherAge = age - 1 + 2)
这个示列中变量anotherAge的初始值等于变量age的值前置递减(age = age - 1)再加上2。也就是前置–age先做减法操作,age的值变成了28,所以再加上2,其值就是30。
另外在JavaScript运算符中,前置递增(++i)和递减(–i)与执行语句的优先级相同,因此整个语句会从左至右被求值。
例如:
var foo = 1;var baz = 20;var bar = ++foo + baz;var baf = foo + baz;
console.log(foo); // => 2console.log(bar); // => 22console.log(baf); // => 22
在这里,bar等于22是因为foo选加了1之后与baz相加。而baf也等于22是因为相应的加法操作使用了foo加上1之后的值。
后置型递增(递减)
前面也说过了,递增(递减)分前置型和后置型。前置型是++i(–i),后置型不同的是,将++(或–)放置在变量的后面,即i++(或i–)。后置型递增(递减)又称之为后增量(post-increment)运算符。
后置型递增是和前置型递增不同之处是其先赋值,后递增。简单点说:后置型递增是先将自身的值赋值给变量,然后再自增1。
例如:
var num1=2;
var num2=20;
var num3=num1++ + num2;
var num4=num1+num2;
alert(num1); => 3
alert(num3); => 22 // var i; i=num1=2; num1=num+1=3 ; num3=i + num2;
alert(num4); => 23 // num1+num2;
总结
-
前置递增(++): 在变量的前面,先自身执行加法操作后在赋值(++i);
-
后置递增(++): 在变量的后面,先赋值后在执行加法操作(i++);
-
前置递减(–): 在变量的前面,先自身执行减法操作后在赋值(–i);
-
后置递减(–): 在变量的前面,先赋值后在执行减法操作(i–);
归纳起来:前置递增(前置递减)运算符,先计算(自增1(或自减1)),再赋值,返回操作对象递增(递减)之后的值;后置递增(后置递减)运算符,先赋值,再计算(自增1(或自减1)),返回操作对象递增之前的值。