JavaScript高級程序設計(3)基本概念 中
操作符
ECMA-262描述了一組用於操作數據值的操作符,包括算數操作符、位操作符、關系操作符和相等操作符。他們能夠適應很多值,例如字符串、數字值、布爾值甚至對象。在應用對象時,相應的操作符都會調用對象的valueof()和toString()方法。取得可以操作的值。
一元操作符:只能操作一個值。
1.遞增和遞減操作符。
前置性(++i):++位於要操作的變量之前 變量先加1,然後賦值給左邊的變量。
後值性(i++):++位於要操作的變量之後 ,先賦給左邊的變量,然後再+1。
遞減同理;
var num1 = 2; var num2 = 20; var num3 = --num1 + num2; //等於21 var num4 = num1 + num2; //等於21 var num5 = num1-- +num2; //等於22 var num6 = num1 + num2; //等於21
他們不僅適用於整數,還可以用於字符串、布爾值、浮點數值和對象。應用不同的值有不同的規則。
- 一個包含有效數字字符的字符串時,先將其轉換為數字值,再執行加減 1 的操作。字符串變量變成數值變量。
- 一個不包含有效數字字符的字符串時,將變量的值設置為NaN。字符串變量變成數值變量。
- 布爾值為false,先將其轉換為 0 再執行加減 1 的操作。布爾值變量變成數值變量。
- 布爾值true,先將其轉換為 1 再執行加減 1 的操作。布爾值變成數值變量。
- 浮點數值時,執行加減 1 的操作。
- 對象時,先調用對象的valueof()方法以取得一個可供操作的值,然後對該值應用前述規則。如果結果是NaN,則在調用toString()方法後再應用前述規則。對象變量變成數值變量。
var s1 = "2"; var s2 = "z"; var b = false; var f = 1.1; var o = { valueOf: function() { return - 1; } }; s1++; //值變成數值3 s2++; //值變成NaN b++; //值變成數值1 f--; //值變成0.10000000000000009(浮點舍入錯誤) o--; //值變成數值-2
2.一元加和減操作符
以一個加號(+)表示,放在數值前面,對數值不會產生任何影響。非數值前面,會對這個值進行轉換。
以一個減號(-)表示,放在數值前面,變成負數。非數值前面,對這個值進行轉換,變成負數。
位操作符
按位非(NOT) 波浪線(~)表示,結果是返回數值的反碼。
按位於(AND) 和號字符(&)表示,只在兩個數值的對應位都是 1 時才返回 1 ,任何一位是 0 ,結果都是 0 。
按位或(OR) 豎線符號(|)表示,有一個位是 1 的情況下就返回 1 ,而只有在兩個位都是 0 的情況下才返回 0 。
按位異或(XOR) 插入符號(^)表示,兩個數值對應位上只有一個 1 時才返回 1 ,如果對應的兩位都是 1 或都是 0 ,則返回 0 。
左移 兩個小於號(>>)表示,會將數值的所有位向左移動指定的位數。不會影響操作數的符號位
有符號右移 兩個大於號(<<)表示,會將數值向右移動,會用符號位填充所有空位。
無符號右移 三個大於號(<<<)表示,二進制數向右移位,直接右移,對於正數,結果和>>相同,對於負數,會把負數的二進制補碼當成正數的二進制碼處理
布爾操作符
邏輯非(NOT):嘆號(!)表示,將它的操作數轉換為一個布爾值,然後再對其求反。
同時使用兩個邏輯非操作符,可以將值轉換為真正的布爾值。
邏輯與(AND):兩個和號(&&)表示。
當兩個操作數相應的Boolean值均為true時,返回true;有一個false,都會返回false。
短路操作:如果第一個操作數能夠決定結果,那麽就不會再對第二個操作數求值。
邏輯或(AND):兩個豎線符號(||)表示。
當兩個操作數相應的Boolean值均為false時,返回false;有一個true,都會返回true。
短路操作:第一個操作結果為true,就不會對第二個操作數求值了。
計算操作符
乘法操作符由一個星號(*)表示,計算兩個數值的乘積。
除法操作符由一個斜線符號(/)表示,執行第二個操作數除第一個操作數的計算。
求模(余數)操作符由一個百分號(%)表示。執行常規的除法計算,返回除得的余數
加性操作符(+)
如果是數值,執行常規的加法計算。
如果有字符串,則會拼接起來。添加圓括號(),就可以對數值執行算術計算,然後再將結果與字符串拼接起來。
減法操作符(-)
如果是數值,執行常規的減法計算,
如果是其他,則會轉換,在進行計算
1、除了加(+)之外,如果操作數不是Number類型,會自動調用Number()轉換為Number類型再進行計算。
2、對於加減(+-),除了作為算術運算符。還可以作為一元操作符(見上)。當然,由於字符串操作中對加號(+)的重載,還可以用於將任意數值(的字符串)相連,這也是第1點中為什麽要除了加(+),它在含有非Number類型值時,會將所有操作數轉換為字符串相連接。
3、與一般類C語言不同,在ES中,除(/)和取模(%)並不會區分整數和浮點數,比如 5 / 2 = 2.5 而不是2,5.3 % 3 = 2.3 而不是2。
4、任意運算,只要操作數含NaN,結果就是NaN。但並不是結果為NaN就一定有一個操作數為NaN,比如0/0也返回NaN。
5、對於含無窮Infinity的運算,規定比較多,這裏就不列舉了,可以參考原書,或者自行測試。
關系操作符
小於(<)、大於(>)、小於等於(<=)和大於等於(>=)對兩個值進行比較,都會返回一個布爾值。
1.如果兩個操作數都是數值,則執行數值比較。
2.如果兩個操作數都是字符串,則比較相對應的字符編碼值。
3、操作符是對象時,調用valueOf()(如果沒有,就調用toString()),再將結果按上面規則比較。
4、任意數和NaN比較返回false。
相等操作符
等於號(==) 不等於(!=) 先轉換操作數,然後再比較它們的相等性。
全等(===) 不全等(!==)不會轉換操作數,直接比較。
a===b則一定有a==b,而a!=b則一定有a!==b。
條件操作符
variable = boolean_expression ? true_value : false_value;
該表達式主要是根據 boolean_expression 的計算結果有條件地為變量賦值。如果 Boolean_expression 為 true,就把 true_value 賦給變量;如果它是 false,就把 false_value 賦給變量。
賦值操作符(=) 右則的值賦給左側的變量。
每種主要的算術運算以及其他幾個運算都有復合賦值運算符:
- 乘法/賦值(*=)
- 除法/賦值(/=)
- 取模/賦值(%=)
- 加法/賦值(+=)
- 減法/賦值(-=)
- 左移/賦值(<<=)
- 有符號右移/賦值(>>=)
- 無符號右移/賦值(>>>=)
逗號操作符
使用逗號操作符可以在一條語句中執行多個操作。
var iNum1 = 1, iNum = 2, iNum3 = 3;
多用於聲明多個變量。
JavaScript高級程序設計(3)基本概念 中