递增和递减操作符属于一元操作符(只能操作一个值的操作符),各有两个版本:前置型和后置型。

前置和后置在一般情况下没什么问题(此处说法十分不严谨,到底何为一般情况?一般情况有多少?由于不严谨导致后期遇到问题根本难以解决,详见以下2018年2月5日更新),例如当语句中只有递增或递减这一个操作:

var age = 24;
age++;    //25

var num = 24;
++num;    //25

前置型递增和递减操作,变量的值都是在语句被求值以前改变的。(有所调整,见2018.2.5更新)

var num1 = 2;
var num2 = 20;
var num3 = --num1 + num2;    //21
num1;    //1

后置型递增和递减操作,变量的值都是在语句被求值之后改变的。(有所调整,见2018.2.5更新)

var num1 = 2;
var num2 = 20;
var num3 = num1-- + num2;    //22
num1;    //1

2018年2月5日更新:

遇到一道题目,卡了很久没有理解。

var fn = function (i) {
  return function() {
    return i++;
  }
}(10);
var a = fn();
var b = fn();
console.log(a);    // 10
console.log(b);    // 11

答案解析:

  1. 此处fn被赋值的是 return 后的匿名函数
  2. 匿名函数当中, i 值调用了其父级作用域中的 i ,因此父级作用域中的局部变量 i 值(最初值为10)不会被释放。
  3. 在第一次调用 fn 时,先将 i 值 (10) 返回给 a 值,再执行 i++ 运算,此时 i 值变为11
  4. 在第二次抵用 fn 时,先将当前的 i 值(11)返回给 b 值,再执行 i++ 运算,此时 i 值变为12

所以说,这里的后置型递加操作,是在 return 完成后才开始递加的。

之前的文章总结的是这两句:

前置型递增和递减操作,变量的值都是在语句被求值以前改变的。

后置型递增和递减操作,变量的值都是在语句被求值之后改变的。

或许现在我们可以说的通俗一点,让它们变得不是那么有歧义:

前置型递增和递减操作,先递增递减,后执行语句。

后置型递增和递减操作,先执行语句,后递增递减。