4.8 算术表达式
4.8.1 “+”运算符
二元运算符“+”可以对两个数字做加法,也可以做字符串连接。
加号的转换规则优先考虑字符串连接,如果其中一个操作数是字符串或者转换为字符串的对象,另外一个操作数将会转换为字符串,加法将进行字符串的连接操作,如果两个数都不是类字符串,那么将进行算术加法运算。
1 + 2 // 3:加法
'1' + '2' // '12':字符串连接
'1' + 2 // '12':字符串连接
1 + {} //"1[object Object]":对象转换为字符串进行字符串连接,valueOf返回简单对象,转而使用toString
true + true //2:true首先valueOf,转换为boolean是原始值,然后原始值转换成数字
2 + null //2:null就是原始值,另外一个对象是数字,原始值转换为数字
'2' + null // '2null':null是原始值,另外一个操作数是字符串,null转换成字符串‘null’
2 + undefined //NaN 与上面类似
'2' + undefined //'2undefined'
要考虑加法的结合性对运算顺序的影响,即运算结果是依赖于运算符的运算顺序的:
1 + 2 +‘a ’ // 3a
1 + (2 + 'a') //12a
|
4.8.2 一元算术运算符
一元运算符作用于一个单独的数,并产生一个新值。在JavaScript中,一元运算符具有很高的优先级,而且都是右结合,+ - ++ --
+ - 即是一元运算符,也是二元运算符。
一元加法(+)
一元加法运算把操作数转换为数字(或者NaN),并返回这个转换后的数字,如果操作数本身就是数字,则直接返回这个数字。
一元减法(-)
当‘-’用做一元运算符,它会根据需要把操作数转换为数字,然后改变运算结果的符号。
递增(++)
递增“++”运算符对其操作数进行增量+1操作,操作数是一个左值,运算符把操作数转换为数字,然后加1,并将加1后的数值重新赋值给对象。
前增量 -- 先增加再返回 后增量 -- 先返回 后增加
++x 和 x = x+1 不完全相同,区别点在于字符串连接
注意分号:
‘++’ ‘--’ 运算符,这两个表达式可以当做表达式的前缀和后缀,如果用做后缀表达式,他和表达式应当在同一行,否则,行尾将填补分号,同时 ‘++’ ‘--’将会作为下一行代码的前缀操作符并与之一起解析;
x
++
y
会解析为
x;
++y;
后增量,运算符和操作数之间不能有换行符。
|
4.8.3 位运算符
位运算符可以对由数字表示的二进制数据进行更低层级的按位运算,他们作用于数值类型的操作数并返回数字,所以也归类为算术运算符。这里四个运算符都是对操作数的每个位进行布尔运算,这里将操作数的每个位当做布尔值(1=true,0=false),其他三个运算符用来进行左移位和右移位。
位运算符要求它的操作数是整数,这些整数表示为32位的整型而不是64位的浮点型。必要时,位运算符首先将操作数转换为数字,并将数字强制表示为32位整型,这会忽略原格式中的小数部分和任何超过32位的二进制位。移位运算符要求右操作数在0·31之间。在将其操作数转换为无符号32位整数后,他们将舍弃第五位之后的二进制数,以便生成一个位数正确的数字,注意:位运算符将会把NaN、Infinity和-Infinity都转换为0.
|