算术运算符
基本的算术运算符是 +
、-
、*
、/
,所有那些无法转化为数字的操作数都会被转换为 NaN
,如果操作数是 NaN
,算术运算的结果也是 NaN
。
「+」运算符
「+」运算符的行为表现:
- 如果其中一个操作数是对象,则对象会遵循对象到原始值的转换规则转换为原始类值,日期对象通过
toString()
方法执行转换,其他对象通过valueOf()
方法执行转换。由于多数对象都不具备可用的valueOf()
方法(不返回原始值),因此它们会通过toString()
方法执行转换。 - 在进行了对象到原始值的转换后,如果其中一个操作数是字符串的话,另一个操作数也会转换为字符串,然后进行字符串连接。
- 否则,两个操作数都将转换为数字(或者
NaN
),然后进行加法操作。
此外还要注意加法的结合性对结果的影响:
一元算术运算符
+
:把操作数转化为数字(或NaN),如果操作数本身就是数字则直接返回-
:根据需要把操作数转化为数字并改变运算结果的符号++
:对操作数进行增量(加一)操作,返回值取决于它相对于操作数的位置,具体细节和PHP一样,不再赘述,另外需要注意的是x++
和x=x+1
是不一样的,++
不会进行字符串连接操作,'x'++
会直接报错--
:对操作数进行减一操作,具体细节和++
一样,只不过操作相反,一个是加,一个是减
位运算符
位运算符可以对由数字表示的二进制数据进行更底层的按位运算,一般很少用到,位运算符要求它的操作数是整数,这些整数表示为 32 位整数而不是 64 位浮点数,需要注意的是位运算符会将 NaN
、Infinity
和 -Infinity
都转换为 0:
- 按位与(&):对整型操作数逐位执行布尔与(AND)操作
- 按位或(|):对整型操作数逐位执行布尔或(OR)操作
- 按位抑或(^):对整型操作数逐位执行布尔抑或(XOR)操作
- 按位非(~):将操作数的所有位取反,相当于改变操作数的符号并减一
- 左移(<<):将操作数的所有二进制位进行左移,移动的位数是 0-31 之间的整数,左移 1 位相当于操作数乘以 2,如
7<<1=14
,右边留空的位用 0 补充,舍弃 32 位 - 右移(>>):将操作数的所有二进制位进行右移,移动的位数是 0-31 之间的整数,右移 1 位相当于操作数除以 2,如
7>>1=3
,右边溢出的位将忽略,左边留空的位由原来的操作数符号决定,原来是正数则用 0 填充,否则用 1 填充
注:还有个运算符
>>>
,表示左边的高位总是填充 0,与原来操作数的符号无关
No Comments