重學js之JavaScript基本概念(中)=> 操做符

注意: 本文章爲 《重學js之JavaScript高級程序設計》系列第三章第二部分【操做符】。
關於《重學js之JavaScript高級程序設計》是從新回顧js基礎的學習。

1. 操做符

用於描述一組能夠操做數據值的概念叫作操做符。包括 算術操做符(加號和減號)、位操做符、關係操做符和相等操做符。ES的操做符和其餘不一樣的在於它可以適用於不少值,如:字符串、數字值、布爾值、甚至對象。在應用於對象的時候,須要調用對象的 valueOf() 和 toString()方法。前端

1.1 一元操做符

只能操做一個值的操做符叫作一元操做符。segmentfault

1.1.1 遞增和遞減操做符

分爲兩種類型:前置和後置型,前置位於要操做的變量以前。後置則在要操做的變量以後。以下:數組

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
複製代碼

1.1.2 一元加和減操做符

一元加操做符放在變量以前是沒有任何變化的,而一元減操做符放在變量以前則變量是個負數3d

var num = 25
num = +num // 25

num = -num // -25
複製代碼

注意:仍是遵循以前的規則,對於字符串的變量使用加減操做符 則變成 NaN 其餘的則相應變成指定規則的數值。code

一元加減操做符主要用於基本的算術運算,也能夠用於轉換數據類型。

1.2 位操做符

位操做符是用於內存中表示數值的位來操做數值。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() 函數將該值轉換爲一個數值,在應用位操做,獲得的結果是一個數值。

  1. 按位非(NOT)

按位非操做符由一個波浪線(~)表示,執行按位非的結果就是返回數值的反碼並減一,以下:

var num = 25    // 二進制 0001 1001
var num1 = ~num // 二進制 1110 0110

// -26
複製代碼
  1. 按位與

按位與操做符由一個和字符號(&)表示,它有兩個操做符數。從本質上來說,按位與操做就是將兩個數值的每一位對齊,根據如下規則,對相同位置上的兩個數執行AND操做:

結果:全1才爲1,有0返回0

第一個數值的位 第二個數值的位 結果
1 1 1
1 0 0
0 1 0
0 0 0
  1. 按位或(OR)

按位或由一個豎線符號(|)表示,一樣也有兩個操做數,操做結果遵循下表。

第一個數值的位 第二個數值的位 結果
1 1 1
1 0 1
0 1 1
0 0 0

結果:有1返回1,全0返回0

  1. 按位異或(XOR)

按位異或操做符由一個插入符號 (^)表示,也是兩個操做數,結果遵循下表:

第一個數值的位 第二個數值的位 結果
1 1 0
1 0 1
0 1 1
0 0 0

結果:兩個數只有1個爲1的時候才返回1,同時爲1或同時爲0 則返回0

  1. 左移

左移操做符由兩個小於號(<<)表示,這個操做符會將數值的全部位向左移動指定的位數。以下:

// 將數值2向左移動5位,結果就是64位

var oldnum = 2  // 二進制 10 
var newnum = oldnum << 5  // 二進制 1000000 , 十進制 64

注意: 在向左移位後,原數值的右側多出了 5 個空位,左移操做
會以0來填充這些空位,以便獲得的結果是一個完整的32位的二進制數。
複製代碼
  1. 有符號的右移

有符號的右移操做符由兩個大於號(>>)表示,這個操做符會將數值向右移動,但保留符號位(即正負號標記),有符號的右移操做與左移操做剛好相反,即若是將64向右移動5位,結果將變回2.以下:

var oldnum = 64 // 二進制 1000000
var newnum = oldnum >> 5    // 二進制 10 2

注意:在移位的過程當中,原數值也會出現空位,只不過此次
空位出如今原數值的左側、符號位的右側,這時候ES就會用
符號位的值來填充全部的空位,以便獲得一個完整的值。
複製代碼
  1. 無符號右移

無符號右移操做符右三個大於號(>>>)組成,這個操做符會將數值的全部32位都向右移動,對於正數來講,無符號右移的結果與有符號右移相同,以下

var oldnum = 64     // 二進制 1000000
var newnum = oldnum >>> 5   // 二進制 10  十進制 2
複製代碼

注意:在負數下狀況就不同了,首先,無符號右移是以0來填充空位,而不是像有符號右移那樣以符號位來填充空位。因此,對正數的無符號右移與有符號右移結果相同,但對負數的結果就不同了。其次無符號右移操做符會把負數的二進制碼當成正數的二進制碼。並且,因爲負數以其絕對值補碼形式表示,所以就會致使無符號右移後的結果很是之大。以下:

var oldnum = -64    // 二進制 11111111111111111111111111000000
var newnum = oldnum >>> 5   // 十進制 134217726
複製代碼

歡迎關注 公衆號【小夭同窗】

重學js系列

重學js之JavaScript簡介

重學 JS 之在 HTML 中使用 JavaScript

重學js之JavaScript基本概念(上)=> 數據類型

ES6入門系列

ES6入門之let、cont

ES6入門之變量的解構賦值

ES6入門之字符串的擴展

ES6入門之正則的擴展

ES6入門之數值的擴展

ES6入門之函數的擴展

ES6入門之數組的擴展

ES6入門之對象的擴展

Git教程

前端Git基礎教程

相關文章
相關標籤/搜索