操縱符
一元操縱符
只能操縱一個值的操縱符叫一元操縱符
++
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位示意數值。
- 正數
二進制示意,沒有用到的位補0,如18用二進制示意為00000000000000000000000000010010,第一位是標記位,后27位均用0補位,10010是有用位。
- 負數
二進制補碼示意,盤算一個數值如-18的補碼須要三步:
- 求這個數值絕對值的二進制,即00000000000000000000000000010010
- 求二進制的反碼(0為1,1為0),即11111111111111111111111111101101
- 加一,即11111111111111111111111111101110
注重(-18).toString(2)
的效果是-10010而不是11111111111111111111111111101110,默許情況下ECMAScript中的整數都是有標記的,存在無標記整數,無標記整數能示意的數值更大。
對非數值運用一下報告的位操縱,會起首舉行Number()
轉化,位操縱視NaN
Infinity
為0
一切的按位操縱符的操縱數都會被轉成補碼情勢的有標記32位整數。
按位非 ~
求反碼,實質是求操縱數的負值減一。
為了輕易考證,我們用五位示意
- 取反碼
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
- 非零的數除以0,效果為無限
- 無限被非零的數相除,效果為無限
求模 %
求模遵照以下劃定規矩:
- 假如操縱數都是數值,實行通例的求模運算
- 無限大除以有限大的數值,餘數運算效果為`NaN
- 有限大的數值除以0,餘數運算效果為
NaN
-
Infinity
除以Infinity
,餘數運算效果為NaN
- 有限大的數值除以無限大,餘數運算效果為被除數
- 被除數是0,除數不為
NaN
或0,效果為0
5 / 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
關聯操縱符
包含<
>
<=
>=
,遵照以下劃定規矩:
- 假如都是數值,舉行數值大小比較
- 假如都是字符串,則比較字符編碼值,有以下劃定規矩:
- 假如字符串相稱返回值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, 只末了一項有用