概念

小学时学习的简单的运算,如 1 + 3 = 2 。这里的 13 叫做 运算元 。而 + ,因为它左右两边都有运算元,所以叫做 二元运算符 。如果只有一个运算元,如 -1 这里的 - 因为只有一个运算元,因此叫做 一元运算符

所以代码里常见的 true ? 1 : 2 它有3个运算元,叫做 三元运算符

特殊的加号

作为二元运算符

二元时,其中有一个元为 字符串 ,则作为字符串拼接。 1 + '1' = '11'

作为一元运算符

一元时,可以转换元为数字类型,效果同 Number() 更加简短。如 +'1' 转换为 1 。当执行2个字符串数字相加时,可以这么做, +'1' + +'2' = 3 。这里,一元加优先于二元加,先将字符串转为数字,再进行相加。

运算优先级

为什么一元加会优先于二元加,主要是因为运算符的优先级。
从表中可以看到一元运算符,优先级是16,明显高于二元运算符,另外可以看到赋值运算符,优先级最低,是3。

优先级 名称 符号
16 一元加号 +
16 一元负号 -
14 乘号 *
14 除号 /
13 加号 +
13 减号 -
3 赋值符 =

现在,理解下 let x = 2 + 2 * 2 不难了吧,乘号优先,接着是二元加,最后是赋值运算。

运算符的返回值

每个运算符都有返回值。在开发者控制台输入 1 + 1 可以看到返回值是2。
赋值运算符 也有返回值,返回的就是被赋之值。如 x = 2 ,将2赋值给x,并返回x。
所以现在我们可应该可以理解如下代码:

  1. let a = 1
  2. let b = 2
  3. let c = 3 - (a = b + 1) // c 为 0。这里 a = 2 + 1 返回了3,然后3 - 3 = 0赋值给c。

自增

之前理解 1++++1 ,简单理解为前者是先运算,后加,后者是先加后运算,虽能分清区别,但有点模糊。
真正的原因是:这里前置和后置 ++ 都是将1自增,只不过返回值不同,前置返回旧值 **1** ,后置返回新值也就是计算后的 **2**

如果我们要立刻使用自增的返回值,前置和后置的差异就出来了,如下。

  1. let a = 1
  2. let b = a++ // b = 1,这里a++返回旧值1
  3. let c = ++a // c = 2,这里++a返回新值2

如果不是立即使用自增的返回值,则没有差异,如下

  1. let a = 1
  2. a++
  3. console.log(a) // 2
  4. let b = 1
  5. ++b
  6. console.log(b) // 2

另外,自增的优先级会高于其他普通的运算符,如加减乘除。

  1. let a = 1
  2. alert(2 * a++) // 2
  3. let b = 1
  4. alert(2 * ++a) // 4

同理,自减等。

逗号运算符

优先级比 = 还低,可以同时处理多个语句,但只有最后一个语句的结果会返回,之前的都会丢弃。

  1. let a = (1 + 2, 3 + 4); // 7,丢弃1+2=3的值