只能操做一個值的操做符叫一元操做符express
++
and --
好比:編程
var age = 18; var now = ++age - 10; // now = 9, age = 19 var now = age++ - 10; // now = 9, age = 20
前置遞增、遞減和後置遞增、遞減可用於操做整數、浮點數、布爾值、字符串、對象,ECMAScript會根據前面提到過的各類數據類型轉化成數值類型的規則,先將值轉化爲數值,而後加減1安全
+
and -
+
放在數值前面,不會有任何影響,-
使負數變爲正數,正數變爲負數,當一元+
用在非數值前面,會試圖將它們轉化爲數值,規則同以前講過的,而一元-
用在非數值前面,會首先將它們轉化爲數值,再變成相應的負數。編碼
ECMAScript中的數值以IEEE-754 64 位格式存儲,使用位操做符操做數值時,現將該數值轉化爲32位,而後進行計算,最後再轉化成64位。
對於有符號的整數,第一位是符號位(0正數,1負數),後31位表示數值。spa
二進制表示,沒有用到的位補0,如18用二進制表示爲00000000000000000000000000010010,第一位是符號位,後27位均用0補位,10010是有效位。code
二進制補碼錶示,計算一個數值如-18的補碼須要三步:對象
注意(-18).toString(2)
的結果是-10010而不是11111111111111111111111111101110,默認狀況下ECMAScript中的整數都是有符號的,存在無符號整數,無符號整數能表示的數值更大。
對非數值應用一下講述的位操做,會首先進行Number()
轉化,位操做視NaN
Infinity
爲0
全部的按位操做符的操做數都會被轉成補碼形式的有符號32位整數。ip
~
求反碼,本質是求操做數的負值減一。
爲了方便驗證,咱們用五位表示rem
abcde——1-a 1-b 1-c 1-d 1-e字符串
abcde——1-a 1-b 1-c 1-d 1-e——1-a 1-b 1-c 1-d 2-e
1-a 1-b 1-c 1-d 2-e - 1 = 1-a 1-b 1-c 1-d 1-e
可見是相等的。
&
將兩個數值按位對齊,若是同一位上均爲1,則返回結果的這一位爲1,不然爲0。
好比:45 & 67; //1
00000000000000000000000000101101
00000000000000000000000001000011
結果爲:
00000000000000000000000000000001
|
將兩個數值按位對齊,若是同一位均爲0,則返回結果的這一位爲0,不然爲1。
45 | 67; //111
0000000000000000000000000101101
0000000000000000000000001000011
結果爲:
00000000000000000000000001101111
^
將兩個數值按位對齊,若是同一位數值不一樣,則返回結果的這一位爲1,若相同,則爲0。45 ^ 67; //110
0000000000000000000000000101101
0000000000000000000000001000011
結果爲:
00000000000000000000000001101110
<<
向左移動必定位數,不改變符號位,空出來的位置補0(補0的個數與移動位數相同)45 ^ 5; //1440
0000000000000000000000000101101
結果爲:
00000000000000000000010110100000
>>
45 >> 5; //1
0000000000000000000000000101101
結果爲:
00000000000000000000000000000001
向右移動必定位數,不改變符號位,空出來的位置補0(補0的個數與移動位數相同)
>>>
向右移動必定位數,改變符號位,空出來的位置補0(補0的個數與移動位數相同)
同>>
(用於填充空位的0與符號位相同,等於填充了符號位)
無符號右移操做符會把負數的二進制碼當成正數的二進制碼-64>>>25; // 127
11111111111111111111111111000000
結果爲:
00000000000000000000000001111111
!
能夠操做任何數據類型,首先對其取布爾值,而後取反
值 | 布爾值 |
---|---|
空字符串、0、undefined 、null 、NaN |
true |
對象、非0、非空字符串 | false |
!!
至關於Boolean
能夠返回這個值真正對應的布爾值。
&&
邏輯與有兩個操做數,只有true && true
纔會返回true
,能夠操做任何數據類型。
若是有一個或兩個操做數不是布爾值,邏輯與不必定返回布爾值,規則以下:
true
時返回第二個null
,返回null
undefined
,返回undefined
NaN
,返回NaN
邏輯與是短路操做,若是第一個操做數能夠決定求值結果,就不會對第二個操做數求值,當第一個操做數求值爲false
,則表達式結果爲false
。
||
邏輯或有兩個操做數,只有false || false
纔會返回false
,能夠操做任何數據類型。
若是有一個或兩個操做數不是布爾值,邏輯或不必定返回布爾值,規則以下:
false
,則返回第二個操做數null
,則返回null
NaN
,則返回NaN
undefined
,則返回undefined
邏輯或也是短路操做符,若是第一個求值結果爲true
,則返回true
。
咱們能夠利用邏輯或的這一行爲來避免爲變量賦null 或undefined 值。
var myObject = preferredObject || backupObject;
若是preferredObject
爲null
or undefined
, 會將backupObject
的值賦給myObject
若是參加乘性操做的操做符不是數值,會調用Number()
將其轉爲數值,這一過程在這一節中再也不贅述。
*
乘法遵循如下規則:
NaN
,則結果是NaN
Infinity * 0; // NaN
Infinity
與非0(包括無窮)相乘,結果爲無窮/
除法遵循如下規則:
NaN
,則結果是NaN
Infinity/Infinity; // NaN
0/0; // NaN
%
求模遵循如下規則:
NaN
Infinity
除以Infinity
,餘數運算結果爲NaN
NaN
或0,結果爲05 / 0 % 5; // NaN 5 % 0; // NaN 5 / 0 % (5 / 0); // NaN 5 % (5 / 0); // 5 0 % 0; // NaN 0 % (5 / 0); //0 0 % 5; //0 0 % (5 % 0); //NaN
+
Infinity + Infinity; // Infinity
-Infinity + (-Infinity); // -Infinity
-Infinity + Infinity; // NaN
+0 + (+0); // +0
-0 + (-0); //-0
-0 + (+0); // +0
忽視加法操做中的數據類型是ECMAScript 編程中最多見的一個錯誤。再來看一個例子:
var num1 = 5;
var num2 = 10;
var message = "The sum of 5 and 10 is " + num1 + num2;
alert(message); // "The sum of 5 and 10 is 510"
-
減法運算遵循如下規則:
NaN
,則結果是NaN
Infinity - Infinity; // NaN
-Infinity - (-Infinity); // NaN
Infinity - (-Infinity); //Infinity
-Infinity - Infinity; //-Infinity
+0 - (+0); // +0
+0-(-0); // -0
-0 - (-0); // +0
包括<
>
<=
>=
,遵循以下規則:
valueof()
,若是沒有,調用其toString()
,而後按上述規則比較舉一些例子:
"23" < "3"; //true "23" < 3; //false "B" < "a"; //true,大寫字母的字符編碼所有小於小寫字母的字符編碼 "a" < 3; // false,"a"轉化爲NaN,NaN參與任何操做都返回NaN "a" >= 3; //false
==
和不相等 !=
先轉換操做數,再比較相等性,轉換的規則以下:
valueof()
獲得基本類型,再按以上規則比較比較規則以下:
null == undefined; //true
undefined
與null
NaN
與任何操做數相等性比較,返回false
,不相等性比較,返回true
,包括NaN
舉一些例子:
undefined == 0; //false null == 0; //false NaN == NaN; //false NaN != NaN; //false true == 1; //true false == 0; //true "NaN" == NaN; // false
===
和不全等 !==
不轉換操做數,直接比較,比較規則除了第一條均相同
undefined === null ; // false
能夠看出全等比相等要安全,不會強制轉換。
variable = boolean_expression ? true_value : false_value;
boolean_expression 若爲true,返回true_value,若爲false,返回false_value
=
將右邊的值賦給左邊
*=
+=
-=
/=
%=
<<=
>>=
>>>=
num = num + 10;
至關於num += 10;
var a, b, c;
`a = (0, 1, 2, 3); //3, 只最後一項有效