概念
小学时学习的简单的运算,如 1 + 3 = 2 。这里的 1 和 3 叫做 运算元 。而 + ,因为它左右两边都有运算元,所以叫做 二元运算符 。如果只有一个运算元,如 -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。
所以现在我们可应该可以理解如下代码:
let a = 1let b = 2let c = 3 - (a = b + 1) // c 为 0。这里 a = 2 + 1 返回了3,然后3 - 3 = 0赋值给c。
自增
之前理解 1++ 和 ++1 ,简单理解为前者是先运算,后加,后者是先加后运算,虽能分清区别,但有点模糊。
真正的原因是:这里前置和后置 ++ 都是将1自增,只不过返回值不同,前置返回旧值 **1** ,后置返回新值也就是计算后的 **2** 。
如果我们要立刻使用自增的返回值,前置和后置的差异就出来了,如下。
let a = 1let b = a++ // b = 1,这里a++返回旧值1let c = ++a // c = 2,这里++a返回新值2
如果不是立即使用自增的返回值,则没有差异,如下
let a = 1a++console.log(a) // 2let b = 1++bconsole.log(b) // 2
另外,自增的优先级会高于其他普通的运算符,如加减乘除。
let a = 1alert(2 * a++) // 2let b = 1alert(2 * ++a) // 4
同理,自减等。
逗号运算符
优先级比 = 还低,可以同时处理多个语句,但只有最后一个语句的结果会返回,之前的都会丢弃。
let a = (1 + 2, 3 + 4); // 7,丢弃1+2=3的值
