運算子 (Operator) :
運算子有以下幾種類:
.算術運算子 (Arithmetic Operators)
.字串運算子 (String Operators)
.邏輯運元 (Logical Operators)
.位元運算子 (Bitwise Operators)
.指定運算子 (Assignment Operators)
.比較運算子 (Comparison Operators)
.特別運算子 (Special Operators)
1.算術運算子 (Arithmetic Operators)
用來做一些與數目有關的工作。 例如加、減、乘和除法。
為了讓大家清楚JavaScript的物件架構,在這一部份課程會針對以下圖片來說明物件:
|
運算子 |
例子 |
說明 |
+ |
var1 = var2 + var3 |
將 var2 和 var3 的內容相加, 然後將值放到
var1 |
++ |
var1++ |
(遞增運算元)即是 var1 = var1
+ 1 |
- |
var1 = var2 - var3 |
將 var2 減去 var3 的結果放到 var1 |
-- |
var1-- |
(遞減運算元)即是 var1 = var1 - 1 |
* |
var1 = var2 * var3 |
將 var2 和 var3 的內容相乘, 然後放到 var1 |
/ |
var1 = var2 / var3 |
將 var2 除以 var3 的結果放到 var1 |
% |
var1 = var2 % var3 |
將 var2 除以 var3 的餘數放到 var1 |
|
increment operator (遞增運算元) 是將一個變數加一,多用於迴圈的計次,例如 i++ , i++ 也可寫成 ++i 或 i=i+1。
decrement operator (遞減運算元) 是將一個變數減一,例如 i-- ,也可寫成 --i 或 i = i - 1
程式範例(算術運算子): 看程式samp05.html執行結果
|
<script>
var a = 1;
var b = 2;
var c = 3;
var d = 4;
var e = a + b + d + c;
document.write("<br>a = " + a);
document.write("<br>b = " + b);
document.write("<br>c = " + c);
document.write("<br>d = " + d);
document.write("<br><br> a + b + d + c = "
+ e);
document.write("<br> 在d++之前, d的值 = " + d );
d++; //即是 d = d + 1
document.write("<br> 在d++之後, d的值 = " + d );
var r = 5 % 2; //將 5 除以 2 的餘數放到 r
document.write("<br>5除於2的餘數 = " + r );
var x = a * b * c; //將a、b、 c 的乘積放到 x
document.write("<br>a、b、 c 的乘積 = " + x );
</script> |
|
各算術運算子在處理上的優先次序 (precedence) 是依一般算術規則:先乘除、後加減,若有一些運算要優先處理,可放在 (
) 內,例如:
1 + 2 * 3 = 7
( 1 + 2 ) * 3 = 9
2.字串運算子 (String Operators)
用來做一些與字串有關的工作。例如將兩個字串連接,得出一個更長的字串。
|
運算子 |
例子 |
說明 |
+ |
a = "abc" + "1234" |
將 "abc" 和 "1234" 兩個字串連接,再放到
a |
+= |
a += "1234" |
即是 a = a + "1234" |
|
因為字串和數目型態都可以用 + 和 += 運算,所以如果不留意變數的型態就很容易出錯。
程式範例(字串運算子 ): 看程式samp06.html執行結果
|
<script>
var a = "Java";
var b = "Script";
var c = "誕生於:";
var year1 = 19;
var year2 = 95;
document.write(a + b + " " + c + " 西元 "
+ year1 + year2 + " 年");
var year3 = year1 + year2;
//想使用字串運算,但因宣告year1及year2時為數值型態
//實際上做的是是數值運算,因而發生錯誤
document.write("<br>想使用字串運算卻發生數值型態錯誤:");
document.write("<br>" + a + b + " "
+ c + " 西元 " + year3 + " 年");
</script>
|
|
例子說明:
document.write(a + b + " " + c + " 西元 " + year1 +
year2 + " 年");
因為這條運算式有字串型態的資料, 所以 JavaScript 就把它當作字串運算, 雖然 year1 和 year2 分別是 19 和 95
數值型態,但也被當作是 "19" 和 "95" ,所以相加後的結果就是 "1995"
了。
var year3 = year1 + year2;
因為這條運算式沒有字串型態的資料,所以 JavaScript 就把它當作算術運算,year3 = year1 + year2 = 19 +
95 = 114
3.邏輯運算元 (Logical Operators)
通常是做一些有關布林型態的運算。 傳回的值可以是 true 或 false , 如果有算式未被定義, 就會傳回 null 。
|
&&(AND)
|
兩邊的值假如都是 true 的話則傳回
true ,否則傳回 false。例如: 1<2 && 5>2 → 傳回 true 。 |
||(OR)
|
兩邊的值假如其一是 true 的話則傳回
true ,否則傳回 false。例如: 1<2 || 5<2 → 傳回 true 。 |
!(NOT)
|
值假如是 true 則傳回 false
。 |
|
程式範例(邏輯運算元 ): 看程式samp07.html執行結果
判斷是否有參加高考資格,假設參加高考的要求是語言科目合格,或者年滿 21 歲。
|
<script>
var chinese_pass = true;
var english_pass = false;
var over21 = true;
// Chinese 及 English 科目皆及格
var lang_pass = chinese_pass && english_pass
/* requirement to sit in alevel:
語言科目及格或年滿21
*/
var alevel = lang_pass || over21
document.write("是否有參加資格? " + alevel);
</script>
|
|
例子說明:
例子中所有變數都是布林型態,參加者年滿 21 歲 ,經運算後 alevel 就是 true 。
4.位元運算子 (Bitwise Operators)
用來做二進制的位元運算。因為位元運算可以說是低階 (Low-level)工作,所以運算得較快,而且有些位元運算子可以做算術運算,例如乘以 2
的倍數或除以 2 的倍數。
下表用了兩個整數 a 和 b 為例子,假設 a = 12 , b = 10,它們的二進制表示方式分別是 a = 00001100b , b
= 00001010b ,數字後面的 b 字代表該數字是二進制。
|
運算子 |
例子 |
二進制運算 |
說明 |
&
|
a & b
|
a = 00001100b = 12
b = 00001010b = 10
a & b = 00001000b = 8 |
AND
如果兩個位元都是 1 ,結果就是 1 ,否則是 0 |
|
|
a | b
|
a = 00001100b = 12
b = 00001010b = 10
a | b = 00001110b = 14 |
OR
如果任何一個位元是 1 ,結果就是 1 ,否則是 0 |
^
|
a ^ b
|
a = 00001100b
= 12
b = 00001010b = 10
a ^ b = 00000110b = 6 |
XOR
如果位元不相同,結果是 1 ,否則是 0 |
~
|
~a
|
a = 00001100b = 12
~a = 11110011b = -13 |
NOT
將所有位元的 0 變成 1,1 變成 0。
註: a 是用了 Two's Complement 表示方式 |
<<
|
a << 2
|
a = 00001100b
= 12
a << 2 = 00110000b = 48 |
左移 (Left Shift)
將 a 的所有位元向左移兩個位,右邊的位元補入 0。 |
>>
|
c >> 2
|
c
= 負 (2 的 30 次方)
= -1073741824
c >> 2
= 負 2 的 28 次方
= - 268435456 |
有極右移 (Sign-propagating right shift)
將 c 的所有位元向右移兩個位,最左邊的位元補入極性位元 (Sign Bit) , 即是保持它的極性 |
>>>
|
c >>> 2
|
c
= 負 (2 的 30 次方)
= -1073741824
c >>> 2
= 805306368
= 2 的 29 次方 + 2 的 28 次方 |
補零右移 (Zero-Fill Right Shift)
將 c 的所有位元向右移兩個位,左邊的位元補入 0 |
|
程式範例(位元運算子 ): 看程式samp08.html執行結果
用 << 做乘以 2 的倍數運算, 用 >> 做除以 2 的倍數運算。
|
<script>
var a = 3;
a = a << 3; //將a乘以2的3次方
document.write("3 * 8 = " + a);
// now, a = 24
a = a >> 2; //將a除以2的2次方
document.write("<br>24 / 4 = " + a);
</script> |
|
例子說明:
<< 可以做乘以 2 的倍數運算, 以下例如可將 a 乘以 2 的 n 次方:
a = a << n
>> 可以做除以 2 的倍數運算, 以下例如可將 a 除以 2 的 n 次方:
a = a >> n
5.指定運算子 (Assignment Operators)
將運算後的結果放到某個變數,最常用的就是等號 (=),還有,指定運算子可以令算式簡單一點。
|
運算子 |
例子 |
意思 |
=
|
var1 = var2 |
var1 的內容等於 var2 的內容 |
+=
|
var1 += var2 |
var1 = var1 + var2 |
-=
|
var1 -= var2 |
var1 = var1 - var2 |
*=
|
var1 *= var2 |
var1 = var1 * var2 |
/=
|
var1 /= var2 |
var1 = var1 / var2 |
%=
|
var1 %= var2 |
var1 = var1 % var2 |
&=
|
var1 &= var2 |
var1 = var1 & var2 |
^=
|
var1 ^= var2 |
var1 = var1 ^ var2 |
|=
|
var1 |= var2 |
var1 = var1 | var2 |
<<=
|
var1 <<= var2 |
var1 = var1 << var2 |
>>=
|
var1 >>= var2 |
var1 = var1 >> var2 |
>>>=
|
var1 >>>= var2 |
var1 = var1 >>> var2 |
|
程式範例(指定運算子 ): 看程式samp09.html執行結果
用 ^ (XOR) 運算子交換兩個整數型態變數的內容。
|
<script>
var a = 135;
var b = 246;
document.write("<br>交換前, ");
document.write("a = " + a + ", b = " +b);
a ^= b ; b ^= a ; a ^= b ;
document.write("<br>交換後, ");
document.write("a = " + a + ", b = " +b);
</script> |
|
6.比較運算子 (Comparison Operators)
用來比較多兩個算式的關係,例如一個算式是否等於另一個算式。比較後傳回的結果是 true 或 false 其中一個值。
|
運算子 |
例子 |
說明 |
==
|
expr1 == expr2 |
如果 expr1 等於 expr2 , 就傳回 true |
!=
|
expr1 != expr2 |
如果 expr1 不等於 expr2 , 就傳回 true |
>
|
expr1 > expr2 |
如果 expr1 大於 expr2 , 就傳回 true |
>=
|
expr1 >= expr2 |
如果 expr1 大於或等於 expr2 , 就傳回 true |
<
|
expr1 < expr2 |
如果 expr1 小於 expr2 , 就傳回 true |
<=
|
expr1 <= expr2 |
如果 expr1 小於或等於 expr2 , 就傳回 true |
|
程式範例(應用比較運算元 ): 看程式samp10.html執行結果
|
<script>
var a = 3;
var b = 4;
document.write("a = " + a + " , b = " +
b);
var result;
result = a == b;
document.write("<br>a 等於 b ? " + result);
result = a != b;
document.write("<br>a 不等於 b ? " + result);
result = a > b;
document.write("<br>a 大於 b ? " + result);
result = a >= b;
document.write("<br>a 大於或等於 b ? " + result);
result = a < b;
document.write("<br>a 小於 b ? " + result);
result = a <= b;
document.write("<br>a 大於或小於 b ? " + result);
</script> |
|
7.特別運算子 (Special Operators)
用來做特別或較複雜的運算。
|
運算子 |
例子 |
說明 |
? :
|
condition ?
expr1 : expr2 |
如果 condition 是 true, 就傳回 expr1
的結果, 否則傳回 expr2 的結果。 |
|
程式範例(特別運算元 ): 看程式samp11.html執行結果
|
<script>
var sex1 = "m";
var sex2 = "f";
var sex_full1;
sex_full1 = (sex1 == "m") ? "男性" : "女性";
var sex_full2;
sex_full2 = (sex2 == "m") ? "男性" : "女性";
document.write("m = " + sex_full1);
document.write("<br>f = " + sex_full2);
</script> |
|
|