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