运算元 —— 运算符应用的对象。比如说乘法运算 5 * 2
,有两个运算元:左运算元 5
和右运算元 2
。有时候人们也称其为“参数”而不是“运算元”。
如果一个运算符对应的只有一个运算元,那么它是 一元运算符。比如说一元负号运算(unary negation)-
,它的作用是对数字进行正负转换
如果一个运算符拥有两个运算元,那么它是 二元运算符。
加法 +
,
减法 -
,
乘法 *
,
除法 /
,
取余 %
,
求幂 **
.
取余 %
a % b
的结果是 a
整除 b
的 余数
alert( 5 % 2 ); // 1,5 除以 2 的余数
alert( 8 % 3 ); // 2,8 除以 3 的余数
求幂 **
.
alert( 2 ** 2 ); // 2² = 4
alert( 4 ** (1/2) ); // 2(1/2 次方)
1 任意一个运算元是字符串,那么另一个运算元也将被转化为字符串(二元 +
)。
alert( '1' + 2 ); // "12"
alert(2 + 2 + '1' ); // "41",不是 "221"
alert('1' + 2 + 2); // "122",不是 "14"
二元 +
是唯一一个以这种方式支持字符串的运算符。
其他算术运算符只对数字起作用,并且总是将其运算元转换为数字。
如:
alert( 6 - '2' ); // 4,将 '2' 转换为数字
alert( '6' / '2' ); // 3,将两个运算元都转换为数字
2 一元运算符(+)
一元运算符加号,或者说,加号 +
应用于单个值,对数字没有任何作用。但是如果运算元不是数字,加号 +
则会将其转化为数字。
// 对数字无效 let x = 1; alert( +x ); // 1
let y = -2; alert( +y ); // -2
// 转化非数字 alert( +true ); // 1 alert( +"" ); // 0
我们经常会有将字符串转化为数字的需求。比如,如果我们正在从 HTML 表单中取值,通常得到的都是字符串。如果我们想对它们求和,该怎么办?
二元运算符加号会把它们合并成字符串:
let apples = "2";
let oranges = "3";
alert( apples + oranges ); // "23",二元运算符加号合并字符串
如果我们想把它们当做数字对待,我们需要转化它们,然后再求和
let apples = "2";
let oranges = "3"; // 在二元运算符加号起作用之前,所有的值都被转化为了数字
alert( +apples + +oranges ); // 5
// 更长的写法 //
alert( Number(apples) + Number(oranges) ); // 5
但要记住一元运算符优先级高于二元运算符
let n = 2; n *= 3 + 5; alert( n ); // 16 (右边部分先被计算,等同于 n *= 8)
3逗号运算符(非重点)
逗号运算符能让我们处理多个语句,使用 ,
将它们分开。每个语句都运行了,但是只有最后的语句的结果会被返回。
举个例子:
let a = (1 + 2, 3 + 4);
alert( a ); // 7(3 + 4 的结果)
这里,第一个语句 1 + 2
运行了,但是它的结果被丢弃了。随后计算 3 + 4
,并且该计算结果被返回。
逗号运算符的优先级非常低
请注意逗号运算符的优先级非常低,比 =
还要低,因此上面你的例子中圆括号非常重要。
如果没有圆括号:a = 1 + 2, 3 + 4
会先执行 +
,将数值相加得到 a = 3, 7
,然后赋值运算符 =
执行 a = 3
,然后逗号之后的数值 7
不会再执行,它被忽略掉了。相当于 (a = 1 + 2), 3 + 4
。
null + 1 = 1 //
undefined + 1 = NaN //
" \t \n" - 2 = -2 // (7)
null
经过数字转换之后会变为 0
。
undefined
经过数字转换之后会变为 NaN
。
字符串转换为数字时,会忽略字符串的首尾处的空格字符。在这里,整个字符串由空格字符组成,包括 \t
、\n
以及它们之间的“常规”空格。因此,类似于空字符串,所以会变为 0
。