JavaScript 入門指南 - 運算式與陳述

運算式 (expression) 由運算元 (operand) 與運算子 (operator) 所組成




單一運算元就構成一個運算式,運算元可以是變數 (variable) 、字面常數 (literal) 或呼叫函數 (function) ,例如
a                // 以變數當運算元
3                // 以字面常數當運算元
parseInt("3322") // 呼叫函數


運算式,顧名思義,其為運算出一個結果的式子,因此單一運算元的運算式所得到的結果就是運算元的值,如果是函數呼叫,就是函數的回傳值 (return value) 囉!


單一運算元也可以結合單元運算子,單元運算子有
運算子功能範例
++a
--a
++遞增++a, a++
--遞減--a, a--
!邏輯補數!a


正負如果一般數學表示正負值一樣,同樣的,負負會得正
var a = -3;
var b = +a; // b 會等於 -3
var c = -a; // c 會等於 3


遞增、遞減則是會將整數變數遞增 1 或遞減 1 ,有前後之別
var a = 3;
var b = ++a; // b 會等於 4
var c = a++; // c 會等於 3
var d = --a; // b 會等於 2
var e = a--; // e 會等於 3


邏輯補數運算子會把 true 變成 falsefalse 變成 true
var a = true;
var b = !a; // b 會等於 false
var c = !b; // c 會等於 true


一般運算子都須結合兩個運算元,例如算術運算子 (arithmetic operator) ,可用在整數 (integer) 及浮點數 (floating-point number) ,計算結果也為整數或浮點數
運算子功能範例
+a + b
-a - b
*a * b
/a / b
%取餘數a % b


例如
var a = 11;
var b = a + 33; // b 會等於 44
var c = b - 22; // c 會等於 22
var d = c * 11; // d 會等於 242
var e = d / 44; // e 會等於 5.5
var f = e % 55; // f 會等於 5.5


相等性及關係運算子 (equality and relational operator) ,可用於整數及浮點數或布林值 (Boolean value) ,計算結果不是 true 就是 false
運算子功能範例
==相等a == b
!=不相等a != b
>大於a >= b
>=大於等於a >= b
<小於a < b
<=小於等於a <= b


例如
var a = 11;
var b = 22;

var c = a >= b; // c 會等於 false
var d = a <= b; // d 會等於 true
var e = c == d; // e 會等於 false
var f = a != b; // f 會等於 true


我們運用的等號,其實屬於指派運算子 (assignment operator) ,所謂的指派就是把等號右邊的東東給左邊的變數
運算子功能範例
=指派a = b
+=相加同時指派a += b
-=相減同時指派a -= b
*=相乘同時指派a *= b
/=相除同時指派a /= b
%=取餘數同時指派a %= b


例如
var a = 11;
a += 33; // a 會等於 44
a -= 22; // a 會等於 22
a *= 11; // a 會等於 242
a /= 44; // a 會等於 5.5
a %= 55; // a 會等於 5.5


有沒有看的眼花撩亂?居然可以有 f = a != b 之類的式子,這是因為運算子有計算的優先次序 (precedence) ,由於 != 的優先順序在 = 之前,所以 a != b 會先被計算,結果才會指派到 f 之中。如果不是很清楚各個運算子的優先次序,保險一點的做法可以用小括弧,先把要先被計算的運算式圍起來,例如
f = (a != b); // 等於 f = a != b


這是因為小括弧有最高的優先計算次序。


加上分號,運算式就是程式 (program) 中獨立的陳述 (statement) ,陳述為 JavaScript 程式最基本的執行單位,由前而後,一個陳述接著一個陳述來執行。


通常 JavaScript 一行就是一個陳述,有明確的斷行不加分號也沒關係
document.write("Hello, world!")
document.write("<br / >") 


可是如果要把數個陳述放在同一行,分號就是必要的
document.write("Hello, world!"); document.write("<br / >") 


這是因為分號或斷行都可以表示陳述的結束。


其他很多都是連帶運算式單獨一行的陳述,然而許多控制結構 (control structure) 是屬於多行的複合陳述 (compound statement) ,我們先來看看控制結構中的選擇吧!


中英文術語對照
運算式expression
運算元operand
運算子operator
變數variable
字面常數literal
函數function
成員member
回傳值return value
算術運算子arithmetic operator
整數integer
浮點數floating-point number
相等性及關係運算子equality and relational operator
布林值Boolean value
指派運算子assignment operator
優先次序precedence
程式program
陳述statement
控制結構control structure
複合陳述compound statement


您可以繼續參考
基礎篇


相關目錄
回 JavaScript 入門指南
回 JavaScript 教材
回首頁


參考資料
https://developer.mozilla.org/en-US/docs/JavaScript/Guide/Expressions_and_Operators
http://www.w3schools.com/JS/js_operators.asp
http://www.tutorialspoint.com/javascript/javascript_operators.htm

3 則留言:

提到...

您好,"指派運算子"這邊的範例看起來有點怪怪的

因為對照上表,看起來
a -= 22 , a 是 11;
a *= 11 , a 是 121;
a /= 44 , a 是 0.25;
...( 取餘數還在學習中...orz )

請問是我的理解有誤嗎?

Kaiching Chang 提到...

程式沒有「看起來」這回事,如果懷疑執行結果,何不自己跑看看。

例如

<html>
<head>
<script>
var a = 11;
document.write(a)
document.write("<br>")
a += 33; // a 會等於 44
document.write(a)
document.write("<br>")
a -= 22; // a 會等於 22
document.write(a)
document.write("<br>")
a *= 11; // a 會等於 242
document.write(a)
document.write("<br>")
a /= 44; // a 會等於 5.5
document.write(a)
document.write("<br>")
a %= 55; // a 會等於 5.5
document.write(a)
document.write("<br>")
</script>
</head>
<body>
</body>

複製到任一 html 檔案中,再用瀏覽器打開看看。

提到...

非常感謝提醒,然後我終於了解為什麼我算的會跟跑出來的結果不一樣了,因為我一直卡在 a 是 11,後來才注意到 a 已經改變。
例如計算 a -= 22 ,因為前面的 a += 33,所以 a 已經指派成 44 ,而 44 - 22 的確是 22。
( 這個是我的理解有問題,真的很不好意思 )