【5】操作符
(1)一元操作符:只能操作一個值的操作符
- 遞增、遞減操作符
++a ? ?--a ? ?前置
a++ ? ?a-- ? ?后置
(這四個操作符對任何值都適用,不能轉換成數字的轉換為NaN)
- 一元加、一元減操作符(表示正、負)
(2)位操作符:按內存中表示數值的位來操作數值
- ECMAScript中所有數值都以IEEE-754 64位格式存儲,但位操作符并不直接操作64位的值,而是先將64位轉化為32位的整數,然后執行操作,最后再將結果轉化為64位。
- 對于有符號的整數,32位中的前31位用于表示整數的值。第32位用于表示數值的符號(符號位):0表示正數,1表示負數。
- 符號位的值決定了其他位數值的格式:
正數:以純二進制存儲
負數:二進制補碼
步驟:1》求這個數值絕對值的二進制碼;
2》求二進制的反碼,即將0替換為1,將1替換為0;
3》得到的二進制反碼加1。
//-18求補碼 //18的二進制碼 0000 0000 0000 0000 0000 0000 0001 0010 //求反碼 1111 1111 1111 1111 1111 1111 1110 1101 //反碼加1 1 //———————————————————————————————————————————————————————————————————————————— //得 1111 1111 1111 1111 1111 1111 1110 1110
- 在對特殊的NaN和Infinity值應用位操作時,這兩個值都會被當成0來處理。
- 對非數值應用位操作符,會先使用Number()函數進行轉換。
1》按位非(~):執行按位非的結果就是返回數值的反碼
2》按位與(&):按位與操作只在兩數值的對應位都是1才返回1,任何一位是0,結果都是0
3》按位或(|):按位或操作只在兩數值的對應位都是0才返回0,任何一位是1,結果都是1
4》按位異或(^):按位異或操作在兩數值的對應位都是1或0返回0,只有一位是1,才返回1
5》左移(<<)::左移操作符會將數值的所有位向左移動指定的位數,向左移位后,原數值的右側多出來的空位會以0來填充;左移不會影響操作數的符號位
6》有符號的右移(>>):會將數值向右移動,但保留符號位,向右移位后,原數值的左側多出來的空位會以符號位的值來填充 7》無符號的右移(>>>):對正數,有符號右移和無符號右移結果相同,對于負數,無符號右移以0來填充空位,并且會把負數的二進制碼當成正數的二進制碼
(3)布爾操作符
1》邏輯非(!)
- !對象 //false
- !空字符串 //true
- !非空字符串 //false
- !數值0 //true
- !任意非0數值(包括Infinity) //false
- !null //true
- !NaN //true
- !undefined //true
使用兩個邏輯非操作符模擬Boolean()轉型函數的行為。
2》邏輯與(&&)
邏輯與操作可以應用于任何類型的操作數,而不僅僅是布爾值。在有一個操作數不是布爾值的情況下,邏輯與操作就不一定返回布爾值:
- 如果第一個操作數是對象,則返回第二個操作數;
- 如果第二個操作數是對象,則只有在第一個操作數的求值結果為true的情況下才會返回該對象;
- 如果兩個操作數都是對象,則返回第二個操作數;
- 如果有一個操作數是null,則返回null;
- 如果有一個操作數是NaN,則返回NaN;
- 如果有一個操作數是undefined,則返回undefined;
邏輯與操作是短路操作,即如果第一個操作數能夠決定結果,那么就不會再對第二個操作數求值(第一個操作數是false)。
3》邏輯或(||)
邏輯或操作可以應用于任何類型的操作數,而不僅僅是布爾值。在有一個操作數不是布爾值的情況下,邏輯或操作就不一定返回布爾值:
- 如果第一個操作數是對象,則返回第一個操作數;
- 如果第一個操作數的求值結果為false,則返回第二個對象;
- 如果兩個操作數都是對象,則返回第一個操作數;
- 如果兩個操作數都是null,則返回null;
- 如果兩個操作數都是NaN,則返回NaN;
- 如果兩個操作數都是undefined,則返回undefined;
邏輯或操作也是短路操作,即如果第一個操作數能夠決定結果,那么就不會再對第二個操作數求值(第一個操作數是true)。
(4)乘性操作符
1》乘法(*)
- 如果操作數都是數值,執行常規的乘法計算,即兩個正數或兩個負數相乘的結果還是正數,而如果只有一個操作數有符號,那么結果就是負數。如果乘積超出了ECMAScript數值的表示范圍,則返回Infinity或-Infinity;
- 如果有一個操作數是NaN,則結果是NaN;
- 如果是Infinity與0相乘,則結果是NaN;
- 如果是Infinity與非0數值相乘,則結果是Infinity或-Infinity,取決于有符號操作數的符號;
- 如果是Infinity與Infinity相乘,則結果是Infinity;
- 如果有一個數不是數值,則在后臺調用Number()將其轉換為數值,然后再應用上面的規則。
2》除法(/)
- 如果操作數都是數值,執行常規的除法計算,即兩個正數或兩個負數相除的結果還是正數,而如果只有一個操作數有符號,那么結果就是負數。如果商超出了ECMAScript數值的表示范圍,則返回Infinity或-Infinity;
- 如果有一個操作數是NaN,則結果是NaN;
- 如果是0被0除,則結果是NaN;
- 如果是非0的有限數被0除,則結果是Infinity或-Infinity,取決于有符號操作數的符號;
- 如果是Infinity被Infinity除,則結果是NaN;
- 如果是Infinity被任何非0數值除,則結果是Infinity或-Infinity,取決于有符號操作數的符號;
- 如果有一個數不是數值,則在后臺調用Number()將其轉換為數值,然后再應用上面的規則。
3》求模、余數(%)
- 如果操作數都是數值,執行常規的除法計算,返回除得的余數;
- 如果被除數是無窮大值而除數是有限大的數值,則結果是NaN;
- 如果被除數是有限大的數值而除數是0,則結果是NaN;
- 如果是Infinity被Infinity除,則結果是NaN;
- 如果被除數是有限大的數值而除數是無窮大的數值,則結果是被除數;
- 如果被除數是0,則結果是0;
- 如果有一個數不是數值,則在后臺調用Number()將其轉換為數值,然后再應用上面的規則。
(5)加性操作符
1》加法(+)
- 如果兩個操作符都是數值,執行常規的加法計算,然后根據下列規則返回結果:
- 如果有一個操作數是NaN,則結果是NaN;
- 如果是Infinity加Infinity,則結果是Infinity;
- 如果是-Infinity加-Infinity,則結果是-Infinity;
- 如果是Infinity加-Infinity,則結果是NaN;
- 如果是+0加+0,則結果是+0;
- 如果是-0加-0,則結果是-0;
- 如果是+0加-0,則結果是+0。
- 如果有一個操作符是字符串,那么應用如下規則:
- 如果兩個操作數都是字符串,則將第二個操作數與第一個操作數拼接起來;
- 如果只有一個操作數是字符串,則將另一個操作數轉換為字符串,然后再將兩個字符串拼接起來。
- 如果有一個操作數是對象、數值或布爾值,則調用它們的toString()方法取得相應的字符串值,然后再應用字符串的規則。對于null和undefined,則分別調用String()函數并取得字符串"null"和"undefined"。
2》減法(-)
- 如果兩個操作符都是數值,執行常規的算數減法操作并返回結果:
- 如果有一個操作數是NaN,則結果是NaN;
- 如果是Infinity減Infinity,則結果是NaN;
- 如果是-Infinity減-Infinity,則結果是NaN;
- 如果是Infinity減-Infinity,則結果是Infinity;
- 如果是-Infinity減Infinity,則結果是-Infinity;
- 如果是+0減+0,則結果是+0;
- 如果是-0減-0,則結果是+0;
- 如果是+0減-0,則結果是-0;
- 如果有一個操作符是字符、布爾值、null或undefined。則在后臺調用Number()函數將其轉換為數值,然后再根據前面的規則執行減法計算。如果轉換的結果是NaN,則減法的結果就是NaN;
- 如果有一個操作數是對象,則調用對象的valueOf()方法取得表示該對象的數值。如果得到的值是NaN,則減法的結果就是NaN。如果對象沒有valueOf()方法,則調用toString()方法并將得到的字符串轉化為數值。
(6)關系操作符
小于(<)、大于(>)、小于等于(<=)、大于等于(>=) 這幾個操作符都返回一個布爾值
- 如果兩個操作數都是數值,則執行數值比較。
- 如果兩個操作數都是字符串,則比較兩個字符串對應的字符編碼值。
- 如果一個操作數是數值,則將另一個操作數轉化為一個數值,然后執行數值比較。
- 如果一個操作數是對象,則調用這個對象的valueOf()方法,并用得到的結果根據前面的規則執行比較。如果對象沒有valueOf()方法,則調用toString()方法,并用得到的結果根據前面的規則執行比較。
- 如果一個操作數是布爾值,則先將其轉換為數值,然后再執行比較。
- 任何操作數與NaN進行關系比較,結果都是false。
(7)相等操作符
1》相等和不相等(==和!=)——先轉換再比較
先轉換操作數再比較相等性,在轉換不同的數據類型時,相等和不相等遵循以下規則:
- 如果有一個操作數是布爾值,則在比較相等性前先將其轉換為數值---false轉換為0,true轉換為1;
- 如果一個操作數是字符串,另一個操作數是數值,則在比較相等性前將字符串轉換為數值;
- 如果一個操作數是對象,另一個不是,則調用對象的valueOf()方法,用得到的基本類型值按照前面的規則比較;
- null和undefined是相等的;
- 在比較相等性之前,不能將null和undefined轉換為其他任何值;
- 如果有一個操作符是NaN,則相等操作符返回false,不相等操作符返回true;即使兩個操作數都是NaN,也一樣,因為按照規則,NaN不等于NaN;
- 如果兩個操作數都是對象,則比較它們是不是同一個對象。如果兩個操作數都指向同一個對象,則相等操作符返回true;否則,返回false;
表達式 | 值 |
null == undefined | true |
"NaN" == NaN | false |
5 == NaN | false |
NaN == NaN | false |
NaN != NaN | true |
5 =="5" | true |
false == 0 | true |
true == 1 | true |
true == 2 | flase |
undefined == 0 | false |
null == 0 | false |
?
?
?
?
?
?
?
?
?
?
?
2》全等和不全等()——僅比較而不轉換
兩個操作數在未經轉換的情況下相等返回true,不相等返回false;
undefined == null;//true undefined === null;// false
(8)條件操作符
variable = boolean_expression ? true_value : false_value ;
(9)賦值操作符
簡單賦值(=)將右側的值賦給左側的變量
乘/賦值(*=)
除/賦值(/=)
模/賦值(%=)
加/賦值(+=)
減/賦值(-=)
左移/賦值(<<=)
有符號右移/賦值(>>=)
無符號右移/賦值(>>>=)
(10)逗號操作符
逗號操作符多用于聲明多個變量;
var num1 = 0 , num2 = 1 , num3 = 2 ;
除此之外,逗號操作符還可用于賦值,逗號操作符總會返回表達式中最后一項。
var num = {1,2,3,4,5}; //num值為5
?