JavaScript1.5 運算子(Operators)(上)

運算子(Operators)

在 JS 中,所有指定的敘述語句都是由運算子(operators)與運算元(operands)所組合而成的。也就是說,在我們撰寫 JS 程式碼時,通常都是要寫一些表達式(運算式),而這些表達式與表達式之間,則需靠相互之間的運算子運作,才能完成應有的行為。

所以,在寫 JS 程式之前,我們應當對這些運算子有一個基本的認識。

運算元的數目(Number of operands)

  1. 單元運算子(unary operator)
  2. 二元運算子(binary operator)
  3. 三元運算子(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)

兼容性:IE3+、NN2+、Moz1+、Safari1+

指派運算子是將位於該運算子(=)右邊運算元的值指派給運算子(=)左邊的運算元。基本的「指派」運算子是等號 (=),它將指派右邊運算元的值到左邊的運算元。例如:

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)

兼容性:IE3+、NN2+、Moz1+、Safari1+

算術運算子接受數值(不論是文字或變數)來做為其運算元並且傳回單一數值。標準的算術運算子是加法 (+)、 減法 (-)、 乘法 (*) 及除法 (/) 。與浮點數使用時,這些運算子的運作就像它們在大部分其它的程式語言一樣(請注意,當除數為零的時候會產生 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)

兼容性:IE3+、NN2+、Moz1+、Safari1+

比較運算子是會比較其運算元然後傳回一個邏輯值,其依據是比較是否為 true。其運算元可以是數值、字串、邏輯值或物件的值。

字串的相互比較是根據標準的詞彙編篡順序,使用 Unicode 值。在大部分的情況下,假如兩邊的運算元都是不相同之類型的話,JS 會嘗試將運算元轉換成適當的類型後,再來進行比較。(唯一的例外狀況的規則是 === 與 !== ,用來執行標準等號比較和不等比較,檢查相等之前,不會嘗試著將運算元轉換成相容的類型。)

==
===
!=
!==
>
>=
<
<=
兩邊值相等
兩邊值相等且同型別
兩邊值不相等
兩邊值不相等也不同型別
左邊值較大
左邊值較大或是相等
右邊值較大
右邊值較大或是相等

數值的比較

例如:
5 == 5				//true
5 == 5.0			//true
5 != 1				//true
5 < 1				//false

字串的比較

例如:"SKYFATE" < "skyfate" //true

在比較字串時,JS 會將字串轉換成相對應的 ASCII 值,然後從兩側的第一字母開始比較起;因為大寫的 ASCII 值小於小寫的 ASCII 值,所以上述例子中得到 true。

S 的 ASCII 值為 083。

s 的 ASCII 值為 115。

文章分類

文章標籤