算术运算符


基本的算术运算符是 +-*/,所有那些无法转化为数字的操作数都会被转换为 NaN,如果操作数是 NaN,算术运算的结果也是 NaN

「+」运算符

「+」运算符的行为表现:

  • 如果其中一个操作数是对象,则对象会遵循对象到原始值的转换规则转换为原始类值,日期对象通过 toString() 方法执行转换,其他对象通过 valueOf() 方法执行转换。由于多数对象都不具备可用的 valueOf() 方法(不返回原始值),因此它们会通过 toString() 方法执行转换。
  • 在进行了对象到原始值的转换后,如果其中一个操作数是字符串的话,另一个操作数也会转换为字符串,然后进行字符串连接。
  • 否则,两个操作数都将转换为数字(或者NaN),然后进行加法操作。

此外还要注意加法的结合性对结果的影响:

一元算术运算符

  • +:把操作数转化为数字(或NaN),如果操作数本身就是数字则直接返回
  • -:根据需要把操作数转化为数字并改变运算结果的符号
  • ++:对操作数进行增量(加一)操作,返回值取决于它相对于操作数的位置,具体细节和PHP一样,不再赘述,另外需要注意的是 x++x=x+1 是不一样的,++ 不会进行字符串连接操作,'x'++会直接报错
  • --:对操作数进行减一操作,具体细节和++一样,只不过操作相反,一个是加,一个是减

位运算符

位运算符可以对由数字表示的二进制数据进行更底层的按位运算,一般很少用到,位运算符要求它的操作数是整数,这些整数表示为 32 位整数而不是 64 位浮点数,需要注意的是位运算符会将 NaNInfinity-Infinity 都转换为 0:

  • 按位与(&):对整型操作数逐位执行布尔与(AND)操作
  • 按位或(|):对整型操作数逐位执行布尔或(OR)操作
  • 按位抑或(^):对整型操作数逐位执行布尔抑或(XOR)操作
  • 按位非(~):将操作数的所有位取反,相当于改变操作数的符号并减一
  • 左移(<<):将操作数的所有二进制位进行左移,移动的位数是 0-31 之间的整数,左移 1 位相当于操作数乘以 2,如 7<<1=14,右边留空的位用 0 补充,舍弃 32 位
  • 右移(>>):将操作数的所有二进制位进行右移,移动的位数是 0-31 之间的整数,右移 1 位相当于操作数除以 2,如 7>>1=3,右边溢出的位将忽略,左边留空的位由原来的操作数符号决定,原来是正数则用 0 填充,否则用 1 填充

注:还有个运算符 >>>,表示左边的高位总是填充 0,与原来操作数的符号无关


点赞 取消点赞 收藏 取消收藏

<< 上一篇: 运算符概述

>> 下一篇: 关系运算符