JavaScript1.5 運算子(Operators)(上)
運算子(Operators)
在 JS 中,所有指定的敘述語句都是由運算子(operators)與運算元(operands)所組合而成的。也就是說,在我們撰寫 JS 程式碼時,通常都是要寫一些表達式(運算式),而這些表達式與表達式之間,則需靠相互之間的運算子運作,才能完成應有的行為。
所以,在寫 JS 程式之前,我們應當對這些運算子有一個基本的認識。
運算元的數目(Number of operands)
- 單元運算子(unary operator)
- 二元運算子(binary operator)
- 三元運算子(ternary operator)
單元運算子需要一個單一運算元,運算元可以在運算子之前或之後。operator operand//運算元在運算子之後,例如 ++x。operand operator//運算元在運算子之前,例如 x++。-20//運算元在運算子之後。
二元運算子需要兩個運算元,一個在運算子之前,一個在運算子之後。
operand1 operator operand2 //例如: 3 + 4 或 x * y。
運算子的優先順序(Operator Precedence)
運算子具有下列優先順序,越上面代表優先性越高。
| 優先權 | 運算子 |
| 15 | .、[]、()、new |
| 14 | ++、--、-、+、~、!、delete、typeof、void |
| 13 | *、/、% |
| 12 | +、- |
| 11 | <<、>>、>>> |
| 10 | <、<=、>、>=、instanceof、in |
| 09 | ==、!=、===、!== |
| 08 | & |
| 07 | ^ |
| 06 | | |
| 05 | && |
| 04 | || |
| 03 | ?: |
| 02 | =、*=、/=、%=、+=、-=、<<=、>>=、>>>=、&=、^=、|= |
| 01 | , |
運算子的類型(The types of operators)
JS 有以下的運算子類型。
- 指派運算子(Assignment Operators)
- 算術運算子(Arithmetic Operators)
- 比較運算子(Comparison Operators)
- 邏輯運算子(Logical Operators)
- 位元運算子(Bitwise Operators)
- 字串運算子(String Operators)
- 條件運算子(Conditional Operators)
- 物件運算子(Object Operators)
- 其它運算子(Miscellaneous Operators)
指派運算子(Assignment Operators)
指派運算子是將位於該運算子(=)右邊運算元的值指派給運算子(=)左邊的運算元。基本的「指派」運算子是等號 (=),它將指派右邊運算元的值到左邊的運算元。例如:
x = y //這個表達式代表將 y 的值指派給 x。
※「=」號在 JS 中,並不是所謂「等於」的意思。
| 運算子 = += -= *= /= %= <<= >= >>= >>>= &= |= ^= |
例如 x = y x += y x -= y x *= y x /= y x %= y x <<= y x >= y x >>= y x >>>= y x &= y x |= y x ^= y |
等同 x = y x = x + y x = x – y x = x * y x = x / y x = x % y x = x << y x = x > y x = x >> y x = x >>> y x = x & y x = x | y x = x ^ y |
= 號右方運算式的值會存入左方的變數裡, = 號左方亦可加上運算子。下面運算式,左方與右方的意義是相同的。= 號並不是等於的意思,而是指派、指定的意思。 |
算術運算子(Arithmetic Operators)
算術運算子接受數值(不論是文字或變數)來做為其運算元並且傳回單一數值。標準的算術運算子是加法 (+)、 減法 (-)、 乘法 (*) 及除法 (/) 。與浮點數使用時,這些運算子的運作就像它們在大部分其它的程式語言一樣(請注意,當除數為零的時候會產生 NaN)。例如:
1 / 2//在 JS 傳回 0.5。1 / 2//在 Java 傳回 0。1.0 / 2.0//在 JS 與 Java 兩者均傳回 0.5。
| 加法 + 減法 - 乘法 * 除法 / 取餘數 % 指派前遞增 ++ 指派後遞增 ++ 指派前遞減 -- 指派後遞減 -- 變號 - |
z = x + y → z = 3 z = x – y → z = 1 z = x * y → z = 2 z = x / y → z = 2 z = x % y → z = 0 y = ++x → x = 3、y = 3 y = x++ → x = 3、y = 2 y = --x → x = 1、y = 1 y = x -- → x = 1、y = 2 y = -x → y = -2 |
左邊的部份是算術運算子。例如當 x = 2 與 y = 1 的話。 |
加法(+)
加法運算子它可以把數值運算元加總起來,或者將字串運算元連接起來。假設其中一個運算元為字串時,則會將另外的數值運算元轉換為字串,然後字串相互連接。
- 如果某個運算元為 NaN 時,其結果為 NaN(Not a Number)。
- 如果 Infinity 加上 -Infinity 時,其結果為 NaN(Not a Number)。
- 如果 Infinity 加上 Infinity 時,其結果為 Infinity(無限大)。
- 如果 -Infinity 加上 -Infinity 時,其結果為 -Infinity(負無限大)。
- 如果 +0 加上 +0 時,其結果為 +0。
- 如果 -0 加上 -0 時,其結果為 -0。
- 如果 -0 加上 +0 時,其結果為 +0。
減法(-)
如果當 – 號作為二元運算子時,第一個運算元的數值會減去第二個運算元的數值;如果運算元不是數值時,則會嘗試把運算元轉換成數值(無法轉換時,其結果為 NaN)。
- 如果某個運算元為 NaN 時,其結果為 NaN(Not a Number)。
- 如果 Infinity 減 Infinity 時,其結果為 NaN(Not a Number)。
- 如果 -Infinity 減 -Infinity 時,其結果為 NaN(Not a Number)。
- 如果 -Infinity 減 Infinity 時,其結果為 -Infinity(負無限大)。
- 如果 Infinity 減 -Infinity 時,其結果為 Infinity(無限大)。
- 如果 +0 減 +0 時,其結果為 +0。
- 如果 -0 減 -0 時,其結果為 +0。
- 如果 -0 減 +0 時,其結果為 -0。
乘法(*)
乘法運算子會把兩個運算元相乘求其積,如果運算元不是數值時,則會嘗試把運算元轉換成數值(無法轉換時,其結果為 NaN)。兩個正數相乘或者是兩個負數相乘,其結果均為正數。如果一個為正數一個為負數或者一個為負數一個為正數,其結果均為負數。
- 如果某個運算元為 NaN 時,其結果為 NaN(Not a Number)。
- 如果 Infinity 乘以 0 時,其結果為 NaN(Not a Number)。
- 如果 Infinity 乘以 Infinity 時,其結果為 Infinity(無限大)。
- 如果 Infinity 乘以 0 以外的數值時,其結果為 Infinity 或者 -Infinity(看第二個運算元的正負號)。
除法(/)
除法運算子會把第一個運算元(被除數)除以第二個運算元(除數),如果運算元不是數值時,則會嘗試把運算元轉換成數值(無法轉換時,其結果為 NaN)。兩個正數相除或者是兩個負數相除,其結果均為正數。如果一個為正數一個為負數或者一個為負數一個為正數,其結果均為負數。
- 如果某個運算元為 NaN 時,其結果為 NaN(Not a Number)。
- 如果非 Infinity 被 0 除,其結果為 NaN(Not a Number)。
- 如果 Infinity 被 Infinity 除,其結果為 NaN(Not a Number)。
- 如果 Infinity 被任何數值除,其結果為 Infinity(無限大)。
- 如果 Infinity 被 0 以外的數值除,其結果為 Infinity 或者 -Infinity(看第二個運算元的正負號)。
取餘數(%)
取餘數運算子會把第一個運算元(被除數)除以第二個運算元(除數),然後求其餘數,如果運算元不是數值時,則會嘗試把運算元轉換成數值(無法轉換時,其結果為 NaN)。運算結果的正負符號會跟第一個運算元相同(被除數)。
- 如果除數為 0 或被除數為 Infinity 時,其結果為 NaN(Not a Number)。
- 如果 Infinity 被 Infinity 除,其結果為 NaN(Not a Number)。
- 如果被除數為 0 時,其結果為 0。
- 如果除數為 Infinity 時,其結果為被除數。
遞增與遞減(++ --)
遞增與遞減運算子會因在運算元(須為變數)的前後可分為指派前與指派後的遞增與遞減。我想就以底下四個例子來說明應該會比較清楚:
//指派前遞增的說明 //一開始 x 儲存著 2,然後在 x 的值指派給 y 前,x 自己本身會先加 1 後再指派給 y var x = 2; y = ++x; //這時左方表達式中 x = 3 而 y = 3
//指派後遞增的說明 //一開始 x 儲存著 2,然後 x 的值會先指派給 y,然後 x 自己本身才會加 1 var x = 2; y = x++; //這時左方表達式中 x = 3 而 y = 2
//指派前遞減的說明
//一開始 x 儲存著 2,然後在 x 的值指派給 y 前,x 自己本身會先減 1 後再指派給 y
var x = 2;
y = --x; //這時左方表達式中 x = 1 而 y = 1
//指派後遞減的說明
//一開始 x 儲存著 2,然後 x 的值會先指派給 y,然後 x 自己本身才會減 1
var x = 2;
y = x--; //這時左方表達式中 x = 1 而 y = 2
比較運算子(Comparison Operators)
比較運算子是會比較其運算元然後傳回一個邏輯值,其依據是比較是否為 true。其運算元可以是數值、字串、邏輯值或物件的值。
字串的相互比較是根據標準的詞彙編篡順序,使用 Unicode 值。在大部分的情況下,假如兩邊的運算元都是不相同之類型的話,JS 會嘗試將運算元轉換成適當的類型後,再來進行比較。(唯一的例外狀況的規則是 === 與 !== ,用來執行標準等號比較和不等比較,檢查相等之前,不會嘗試著將運算元轉換成相容的類型。)
| == === != !== > >= < <= |
兩邊值相等 兩邊值相等且同型別 兩邊值不相等 兩邊值不相等也不同型別 左邊值較大 左邊值較大或是相等 右邊值較大 右邊值較大或是相等 |
數值的比較
例如:5 == 5//true5 == 5.0//true5 != 1//true5 < 1//false
字串的比較
例如:"SKYFATE" < "skyfate" //true
在比較字串時,JS 會將字串轉換成相對應的 ASCII 值,然後從兩側的第一字母開始比較起;因為大寫的 ASCII 值小於小寫的 ASCII 值,所以上述例子中得到 true。
S 的 ASCII 值為 083。
s 的 ASCII 值為 115。




