用於描述一組能夠操做數據值的概念叫作操做符。包括 算術操做符(加號和減號)、位操做符、關係操做符和相等操做符。ES的操做符和其餘不一樣的在於它可以適用於不少值,如:字符串、數字值、布爾值、甚至對象。在應用於對象的時候,須要調用對象的 valueOf() 和 toString()方法。前端
只能操做一個值的操做符叫作一元操做符。segmentfault
分爲兩種類型:前置和後置型,前置位於要操做的變量以前。後置則在要操做的變量以後。以下:數組
var age = 29
++age // 30
等於
age = age + 1
--age // 28
等於
age = age - 1
複製代碼
注意:執行前置遞增或遞減的時候,變量的值都是在語句被求值之前改變的。函數
var age = 29
var a = --age + 2
age // 28
a // 30
// 因爲前置遞增和遞減與執行語句的優先級相等,
因此整個語句會被從左到右求值。
var num1 = 2
var num2 = 20
var num3 = --num1 + num2 // 21
var num4 = num1 + ++num3 // 23
複製代碼
後置型遞增和遞減操做語法不變,只不過由前面放到了後面,並且最重要的是:後置型遞增和遞減的操做都是在變量執行以後在操做的。以下:post
var num = 3
var age = 4
num-- + age-- // 7
num // 2
age // 4
複製代碼
總結:學習
以上4個操做符對任何值都適用,不限於數字還能夠用於字符串、布爾值、浮點數值和對象,規則以下: 一、應用於數字字符的字符串時候,先將其轉換爲數字值, 在執行加減 1 的操做,字符串變量變成數值變量。spa
二、應用於不包含有效數字的字符串時,將其變量的值設置
位NaN,字符串變量變成數值變量
三、用於布爾值false的時候,將其轉換爲0,在執行加減1的
操做,布爾值變成數值
四、用於布爾值true的時候,將其轉換爲1,在執行加減1的操
做,布爾值變成數值
五、用於浮點數,執行加減1的操做
六、用於對象,先調用對象的valueOf()方法,若是返回的結果
是NaN在調用toString()方法,對象的變量變成數值變量。
複製代碼
上面的說明以下:設計
var s1 = '2'
var s2 = 'z'
var s3 = false
var s4 = 1.1
var s5 = {
valueOf: function(){
return -1
}
}
s1++ // 3
s2++ // NaN
s3++ // 1
s4-- // 0.10000000000009
s5-- // -2
複製代碼
一元加操做符放在變量以前是沒有任何變化的,而一元減操做符放在變量以前則變量是個負數3d
var num = 25
num = +num // 25
num = -num // -25
複製代碼
注意:仍是遵循以前的規則,對於字符串的變量使用加減操做符 則變成 NaN 其餘的則相應變成指定規則的數值。code
一元加減操做符主要用於基本的算術運算,也能夠用於轉換數據類型。
位操做符是用於內存中表示數值的位來操做數值。ES中全部的值都是按照64位格式存儲,但位操做符並直接操做64位值,而是先將64位的值轉換成32位整數,而後執行操做,最後在將結果轉換位64位。
對於有符號的整數,32位中的前31位用於表示整數的值,第32位表示數值的符號,0表示整數,1表示負數。這個表示符號的位叫作符號位。符號位的值決定了其餘位數值的格式。其中,正數以純二進制格式存儲,31位中的每一位都表示2的冪,第一位表示 2的0次方以此類推。沒有用到的用0填充忽略不計。也就是2進製表示法。
負數一樣能夠以二進制存儲,可是使用的格式是二進制補碼,計算一個數值的二進制補碼步驟以下:
一、求這個數值絕對值的二進制碼
二、求二進制反碼
三、獲得的二進制反碼 +1
以下:求 -18的二進制碼
0000 0000 0000 0000 0000 0001 0010
求反碼 0 1 互換
1111 1111 1111 1111 1111 1110 1101
而後 加 1
1111 1111 1111 1111 1111 1110 1110
複製代碼
在ES中,ES會盡力向咱們隱藏全部這些信息,也就是說,在二進制字符串形式輸出一個負數時,咱們看到的只是這個負數絕對值的二進制碼以前加了一個負號,以下:
var num = -18
num.toString(2) // '-10010'
複製代碼
注意:默認狀況下,ES中全部的整數都是有符號整數,固然也存在無符號整數,對於無符號整數來講,第32位再也不表示符號,由於無符號整數只能是正數,並且無符號整數的值能夠更大,由於多出來的一位再也不表示符號,能夠用來表示數值。
在ES中當對應數值應用位操做符時,後臺會發生以下轉換過程:64位的數值被轉換成32位數值,而後執行位操做,最後再將32位數值轉換回64位數值。這樣表面上看起來好像是在操做 32 位數值,另外有個問題,這樣的操做致使在特殊值 如 NaN 和 Infinity值應用位操做的時候,這兩個值會被當成0來處理。
注意:若是對非數值進行位操做符,那麼會先使用 Number() 函數將該值轉換爲一個數值,在應用位操做,獲得的結果是一個數值。
按位非操做符由一個波浪線(~)表示,執行按位非的結果就是返回數值的反碼並減一,以下:
var num = 25 // 二進制 0001 1001
var num1 = ~num // 二進制 1110 0110
// -26
複製代碼
按位與操做符由一個和字符號(&)表示,它有兩個操做符數。從本質上來說,按位與操做就是將兩個數值的每一位對齊,根據如下規則,對相同位置上的兩個數執行AND操做:
結果:全1才爲1,有0返回0
第一個數值的位 | 第二個數值的位 | 結果 |
---|---|---|
1 | 1 | 1 |
1 | 0 | 0 |
0 | 1 | 0 |
0 | 0 | 0 |
按位或由一個豎線符號(|)表示,一樣也有兩個操做數,操做結果遵循下表。
第一個數值的位 | 第二個數值的位 | 結果 |
---|---|---|
1 | 1 | 1 |
1 | 0 | 1 |
0 | 1 | 1 |
0 | 0 | 0 |
結果:有1返回1,全0返回0
按位異或操做符由一個插入符號 (^)表示,也是兩個操做數,結果遵循下表:
第一個數值的位 | 第二個數值的位 | 結果 |
---|---|---|
1 | 1 | 0 |
1 | 0 | 1 |
0 | 1 | 1 |
0 | 0 | 0 |
結果:兩個數只有1個爲1的時候才返回1,同時爲1或同時爲0 則返回0
左移操做符由兩個小於號(<<)表示,這個操做符會將數值的全部位向左移動指定的位數。以下:
// 將數值2向左移動5位,結果就是64位
var oldnum = 2 // 二進制 10
var newnum = oldnum << 5 // 二進制 1000000 , 十進制 64
注意: 在向左移位後,原數值的右側多出了 5 個空位,左移操做
會以0來填充這些空位,以便獲得的結果是一個完整的32位的二進制數。
複製代碼
有符號的右移操做符由兩個大於號(>>)表示,這個操做符會將數值向右移動,但保留符號位(即正負號標記),有符號的右移操做與左移操做剛好相反,即若是將64向右移動5位,結果將變回2.以下:
var oldnum = 64 // 二進制 1000000
var newnum = oldnum >> 5 // 二進制 10 2
注意:在移位的過程當中,原數值也會出現空位,只不過此次
空位出如今原數值的左側、符號位的右側,這時候ES就會用
符號位的值來填充全部的空位,以便獲得一個完整的值。
複製代碼
無符號右移操做符右三個大於號(>>>)組成,這個操做符會將數值的全部32位都向右移動,對於正數來講,無符號右移的結果與有符號右移相同,以下
var oldnum = 64 // 二進制 1000000
var newnum = oldnum >>> 5 // 二進制 10 十進制 2
複製代碼
注意:在負數下狀況就不同了,首先,無符號右移是以0來填充空位,而不是像有符號右移那樣以符號位來填充空位。因此,對正數的無符號右移與有符號右移結果相同,但對負數的結果就不同了。其次無符號右移操做符會把負數的二進制碼當成正數的二進制碼。並且,因爲負數以其絕對值補碼形式表示,所以就會致使無符號右移後的結果很是之大。以下:
var oldnum = -64 // 二進制 11111111111111111111111111000000
var newnum = oldnum >>> 5 // 十進制 134217726
複製代碼
歡迎關注 公衆號【小夭同窗】
重學js系列
ES6入門系列
Git教程