-
Notifications
You must be signed in to change notification settings - Fork 14
nodejs
您可以 node.js 的官方網站中下載並安裝此一開發環境,網址如下:
您可以下載後一直按下一步就可以安裝完成了。
然後,您就可以開始使用 node.js 交談環境來學習了。
要學習一個程式語言,通常必須從變數宣告開始,變數可以想像成用來存放一些值的容器。舉例而言,當我們寫下 x=5 的時候,就是在 x 這個變數裏,放入 5 這個數值,同樣的我們也可以設定變數 y 為 3。
為了學習這些慨念,請您打開《node.js》 交談環境這個綠色圖示的程式,然後輸入下列指令看看:
> x=5
5
> y=3
3
> x+y
8
> s="hello"
'hello'
> w=" world!"
' world!'
> s+w
'hello world!'
> x+w
'5 world!'
> x+y+w
'8 world!'
> 3+5*x-8
20
> y/x
0.6
>
您可以看到在上述操作中,我們宣告了 x,y,s,w 等變數,其中 x=3, y=5, s="hello", w=" world!" ,由於 x,y 都被指定為整數,因此可以進行加減乘除的運算,而 s,w 則被指定為字串,因此只能執行連接運算,在 JavaScript 中的字串連接也是採用加法符號 + 表示的。
JavaScript 的變數,可以是「數值 (Number)、字串 (String) 、布林 (Boolean) 、陣列 (Array) 或物件 (Object)」等型態,其中的陣列與物件是複合型態,其他三種為基本型態,以下是一些關於這些基本型態的操作指令。
> pi=3.14159
3.14159
> e=2.71828
2.71828
> 4*pi
12.56636
> score=70
70
> isPass=true
true
> typeof(score)
'number'
> typeof(pi)
'number'
> typeof(isPass)
'boolean'
> s="hello"
'hello'
> typeof(s)
'string'
>
在典型的程式中,指令是一個接著一個按順序執行的,先執行第一個、接下來執行第二個,.....
以下是示範指令循序執行的一個操作範例,您可以在命令列中啟動 node 後開始輸入這些指令。
$ node
> a=1
1
> a=a+1
2
> a=a+1
3
> a=a+1
4
> a=a+1
5
> a
5
在這裡,有些人會感到疑惑,因為 a=a+1 這個句子有點詭異。這個問題純粹是對 = 符號的誤解所產生的,請讀者注意,在 javascript 語言中,一個等號代表《指定》,兩個等號 == 才代表《判斷是否相等》。以下是我上課時學生發生的一個問題以及解答,在此列出給您參考!
疑問:學程式一開始對 x=x+1 這個句子的迷惑?
今天上大一第一門程式設計課,有位同學問了一個我遺忘了好久的問題。
程式裏的 x=x+1 是什麼意思呢?這樣不是應該不成立嗎?
後來我想起了自己剛學程式時也困惑了一陣子。
在數學裡,如果 x=x+1 的話,那麼整個數學系統就全面崩潰了。
這個方程式根本就沒有解。
但是在程式裏,假如 x 原本是 2 ,那麼 x=x+1 就是:
『把 x 中的 2 取出來之後,和 1 相加完得到結果為 3,再把 3 塞回去給 x』
於是 x 就變成了 3 。
這個問題往往發生在那些數學太好的同學身上,但是如果因此而讓他學不會程式,老師也沒有解釋的話,那就太冤枉了。
當然、這種指定運算可以進行各種指定,不是只能用來 +1 的,以下是更多的循序指定運算。
> a=1
1
> b=2
2
> c=a+b
3
> c=c+b
5
> c=c+a
6
如果我們想要讓兩個變數互換過來,必須用幾個中介變數才能完成,以下我們就利用 t1, t2 兩個變數作為中介,將 x 和 y 互相交換!
> x=3; y=5
5
> x
3
> y
5
> t1=x; t2=y
5
> t1
3
> t2
5
> x=t2; y=t1
3
> x
5
> y
3
上述交換我們用了兩個變數,但其實用一個變數也就夠了,只是邏輯上會變得比較難懂,讀者可能得逐步追蹤每個變數值的狀況,才能清楚的理解為何可以用一個變數就讓 x, y 交換過來!
> x=3; y=5
5
> x
3
> y
5
> t=x; x=y; y=t
3
> x
5
> y
3
現代電腦其實不過就是一部記憶體很大,速度又很快的《計算機》而已,既然是《計算機》,所做的事情也差不多就是《加減乘除》而已,您可以在 node 裡面進行這些《加減乘除》運算。
> i=1
1
> i=i+1
2
> i
2
> i++
2
> i
3
> i++
3
> i
4
> i++
4
> i
5
> a = 5
5
> a--
5
> a
4
> a--
4
> a
3
> a--
3
> a
2
> a=a-3
-1
> a
-1
> a=3*5+8/2
19
> b=4
4
> c=b*a
76
> d=a+b+c
99
> 33%8
1
> 33%10
3
> 33%9
6
> a=33%8
1
> a
1
> r=33%8
1
> d=33/8
4.125
> d*8
33
>
在上面的操作中,我們看到一個等號 = 代表指定,因此請讀者千萬不要和代表《相等判斷》的 == 符號給混淆了!
《相等判斷》可以用兩個等號 == ,也可以用三個等號 === 來代表,但這兩種相等有一點點不同,三個等號代表完全相等,也就是《變數值和型態》兩者都相等,但是兩個等號 == 代表《變數值經型態轉換後會相等》,因此 "3" == 3 會傳回 true,但是 "3"===3 則會傳回 false 。
C:\Users\user>node
> 3=5 // 請注意,一個等號代表《指定》,你不能指定常數 3 變成其他東西,只能指定變數,像是 x=5 ..
3=5
ReferenceError: Invalid left-hand side in assignment
at Object.exports.createScript (vm.js:24:10)
at REPLServer.defaultEval (repl.js:137:25)
at bound (domain.js:250:14)
at REPLServer.runBound [as eval] (domain.js:263:12)
at REPLServer. (repl.js:392:12)
at emitOne (events.js:82:20)
at REPLServer.emit (events.js:169:7)
at REPLServer.Interface._onLine (readline.js:210:10)
at REPLServer.Interface._line (readline.js:546:8)
at REPLServer.Interface._ttyWrite (readline.js:823:14)
> 3==5 // 兩個等號才代表《判斷》,由於 3 與 5 不相等,因此會輸出 false (假的,不是真的)
false
> 3===5
false
> 3=="3"
true
> 3==="3"
false
> x=3
3
> 3===x
true
> 3==x
true
> 3>3
false
> 3>=3
true
> true && true
true
> true && false
false
> false && false
false
> true || true
true
> false || true
true
> false || false
false
> (3>2) && (3>1)
true
> (3>2) && (3>4)
false
> (3>2) || (3>4)
true
> !(3>2)
false
> !(3>4)
true
> 3 != "3"
false
> 3 !== "3"
true
> !true
false
> !false
true
> "hello"=="hello"
true
> "hello"=="hi"
false
> true==true
true
> true==false
false
> true==(1>3)
false
有些時候,我們希望程式有點《隨機性》,這時候就可以引入《亂數》,在 javascript 語言 Math 函式庫裏的 random() 函數會傳回一個 0 到 1 之間的亂數,以下是該函數所產生的一系列亂數。
$ node
> Math.random()
0.6770120605360717
> Math.random()
0.42311601690016687
> Math.random()
0.8769011830445379
> Math.random()
0.48077693535014987
> Math.random()
0.5951373421121389
> Math.random()
0.2052019238471985
接著、讓我們將開始真正用《寫程式》的方法來認識 JavaScript 這個語言!
檔案: hello.js
console.log("Hello!");上述的 console.log( .... ) 是一個函數,會印出參數內的字串到畫面上!
因此 console.log("Hello!") 就會把 Hello! 這個字串印到畫面上,其執行結果如下:
D:\cccwd2\file\jsh\code>node hello.js
Hello!
我們會使用 node <程式名稱> 這樣的指令來執行某程式,例如上述的 node hello.js 就會執行 hello.js 這個程式。
其實 .js 這個附檔名可以省略不用打,因此您也可以用 node hello 直接執行 hello.js 檔案,如下所示:
D:\cccwd2\file\jsh\code>node hello
Hello!
JavaScript 的 if 語句,和 C, Java, C# 等語言幾乎一模一樣。舉例而言,下列程式可以根據 score 所設的定分數,來印出「及格」或「不及格」的訊息,只要大於 60 分,就算是及格了。
檔案:score.js
var score = 61;
if (score >= 60)
console.log("及格");
else
console.log("不及格");寫完上述程式之後,請務必將檔案儲存成 UTF8 的格式 (Unicode 8 位元模式) ,我的習慣是採用 Notepad++ 這個編輯器,然後選擇《編碼/編譯成UTF-8碼(檔首無BOM)》這個選項後,儲存檔案即可。這樣,程式就可以正常印出「繁體中文」!
如果您沒有儲存成 UTF8 的格式,而是用預設的 ANSI 格式,那麼印出來的中文就會看不到 (或者變成亂碼),如下圖所示,這是因為 node.js 預設採用 UTF8 編碼的緣故。
因此請務必要將檔案儲存成 UTF8 格式,這樣會比較不容易出錯。
練習:請執行完上述程式之後,將 score 改為 56,再重新執行一次,看看會印出甚麼?
JavaScript 的迴圈 (包含 for 和 while) 與 C 語言是非常像的,以下是一個 JavaScript 的 while 迴圈範例。
當條件符合的時候,while 迴圈會一直執行,以下程式會在 i<=10 的時候不斷執行,直到 i 比 10 大為止。
檔案:while.js
i=1;
while (i<=10) {
console.log("i=", i);
i = i + 1;
}執行結果:
D:\jsbook>node while
i= 1
i= 2
i= 3
i= 4
i= 5
i= 6
i= 7
i= 8
i= 9
i= 10
如果我們在從 1 數到 10 的過程當中,把變數 i 進行累加,那麼就可以得到累加總和, 1+..+10 = 55 的結果如下。
檔案:whilesum.js
sum=0;
i=1;
while (i<=10) {
sum = sum + i;
console.log("i=", i, " sum=", sum);
i = i + 1;
}執行結果
D:\jsbook>node whilesum
i= 1 sum= 1
i= 2 sum= 3
i= 3 sum= 6
i= 4 sum= 10
i= 5 sum= 15
i= 6 sum= 21
i= 7 sum= 28
i= 8 sum= 36
i= 9 sum= 45
i= 10 sum= 55
雖然 while 迴圈也會做很多次,但是在《重複做 n 次》或《從 a 數到 b》這樣的問題上,我們有更方便的 for 迴圈可以使用!
以下是一個 for 迴圈的範例,該範例會從 1 數到 10。
檔案:for.js
for (i=1;i<=10;i++) {
console.log("i=", i);
}其中的 for (i=1;i<=10;i++) 這句話可以分解為 3 部分,其中 i=1 只會在一開始執行一次,然後每次都會檢查 i<=10 的條件,每次檢查完若通過,則會進行 i++ 的動作,所謂的 i++ 就是 i=i+1 的縮寫。
上述程式的執行結果如下:
D:\jsbook>node for.js
i= 1
i= 2
i= 3
i= 4
i= 5
i= 6
i= 7
i= 8
i= 9
i= 10
當然、像是 1+2+...+10 這樣的事情也可以用 for 迴圈來做,for 的寫法會比 while 更短更簡潔,以下是採用 for 進行 1+...+10 的範例。
檔案:sum.js
sum=0;
for (i=1;i<=10;i++) {
sum = sum + i;
console.log("i=", i, " sum=", sum);
}執行結果:
D:\jsbook>node sum.js
i= 1 sum= 1
i= 2 sum= 3
i= 3 sum= 6
i= 4 sum= 10
i= 5 sum= 15
i= 6 sum= 21
i= 7 sum= 28
i= 8 sum= 36
i= 9 sum= 45
i= 10 sum= 55
另外、 javascript 也從 C 語言那裏繼承了 continue 與 break 等語句,遇到 continue 時會回到迴圈開頭,忽略後面語句。而遇到 break 時則會跳出迴圈。
檔案:forbreak.js
for (i=1;i<=10;i++) {
if (i == 3) continue;
if (i == 8) break;
console.log("i="+i);
}在上述程式中,當 i==3 時,會執行 continue,繼續執行下一輪迴圈,因此不會印出 i=3。
當 i==8 時,會執行 break 而跳出迴圈,因此後面的 i=8, i=9, i=10 都將不會印出。
執行結果:
D:\jsbook>node forbreak.js
i=1
i=2
i=4
i=5
i=6
i=7
在本章中我們開始學習了一些簡單的程式語法,包含 if, while, for 等等,雖然這些程式很小,但應該可以讓讀者對《程式到底是如何運作的》有所體會。
接下來,我們將繼續學習更多的 JavaScript 語法和結構,像是《函數、陣列、物件》等等!
- 請寫一個程式計算 10! ,也就是
10*9*8*....*1。 - 請寫一個程式印出九九乘法表。
- 請寫一個程式求某個大於 1 的數 n 之平方根 。
- 請寫一個函數 m357(a,b) 列出 a 到 b 之間為 3,5,7 任一數之倍數的所有數值?
- 範例: m357(10,15) => 10, 12, 14, 15
- 請將分數轉換為等第 90+=A, 80+=B, 70+=C, 69-=D
- 範例: degree(85) => 'B'
- 給定兩個數字,請算出它們的最大公因數?
- 範例: commonFactor(12,15) => 3
- 將一個10進位的數字換成二進位數字?
- 範例 binary(6) => "110"
- 請檢查某數是否為質數? 範例: isPrime(17) => true
- 給你兩個數字,請算出這兩個數字之間有幾個質數(包含輸入的兩個數字)?
- 範例: countPrime(3, 7) => 3