JavaScript学习(4.5):算术表达式

4.8 算术表达式

4.8.1 “+”运算符
     二元运算符“+”可以对两个数字做加法,也可以做字符串连接。
     加号的转换规则优先考虑字符串连接,如果其中一个操作数是字符串或者转换为字符串的对象,另外一个操作数将会转换为字符串,加法将进行字符串的连接操作,如果两个数都不是类字符串,那么将进行算术加法运算。

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

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.

  • 按位与(&)---- 对它的整型操作逐位执行布尔与(AND)操作,只有两个操作数中相对应的位都是1,结果中的这一位才是1,例如:0x1234 & 0x00FF = 0x0034
  • 按位或(|) ---  对它的整型操作数逐位执行布尔或(OR)操作。如果其中一个操作数相应的位为1,或者两个操作数相应位都是1,那么结果中的那一位就是1.例如:0x1234 | 0x00FF = 0x12FF
  • 按位异或(^) --- 对它的整型操作数逐位执行布尔异或(XOR)操作。异或是指第一个操作数或者第二个操作数为true,但两者不能同时为true。例如:0xFF00 ^ 0xF0F0 = 0x0FF0
  • 按位非(~) -- 是一元运算符,位于一个整型参数之前,他将操作数的所有位取反。相当于改变它的符号-1,例如:~0x0F = 0xFFFFFFF0 或-16
  • 左移 (<<) --- 将第一个操作数的所有二进制位进行左移操作,移动的位数由第二位操作数指定,移动的位数是0·31之间的一个整数。新的第一位用0来补充,舍弃第32位,左移1位相当于*2,2位相当于*4 例如:7<<2 = 28
  • 带符号右移(>>) --- 右移操作,正数高位补1,负数高位补0,例如: 7 >> 1 = 3, -7 >> = -4
  • 无符号右移(>>>) --- 与右移操作一样,只是左边的最高位总是补0,与原来的操作数符号无关。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值