用Node.js学 JavaScript (二)基本控制
在本期当中,逍遥子科技将继续介绍 JavaScript 的语法,包含控制逻辑与循环等等。
if 判断
JavaScript 的 if 语句,和 C 语言几乎一样。举例而言,下列程序可以根据 score 所设的定分数,来印出「及格」或「不及格」的讯息,只要大于 60 分,就算是及格了。
档案:score.js
var score = 61;
if (score >= 60)
console.log("及格");
else
console.log("不及格");
写完上述程序之后,请务必将档案储存成 UTF8 的格式 (Unicode 8 位模式) ,我的习惯是采用 Notepad++ 这个编辑器,然后储存成「UTF8 档首无 BOM」的格式,
如果您没有储存成 UTF8 的格式,而是用预设的 ANSI 格式,那么印出来的中文就会看不到 (或者变成乱码),如下图所示,这是因为 node.js 默认采用 UTF8 编码的缘故。
因此请务必要将档案储存成 UTF8 格式,这样会比较不容易出错。
练习:请执行完上述程序之后,将 score 改为 56,再重新执行一次,看看会印出甚么?
两种相等判断
在 javascript 当中,比较特别的一件事情是,是否相等的判断通常有两种,一种是两个等号的 `==` ,另一种是参个等号的 `===`。
这两种判断到底差别在哪里呢?答案是:三个等号者会判断型态是否相等,因此是严格的相等,而两个等号者不会判断型态,因此是不严格的相等,以下范例说明了两者的差异。
档案:equals.js
console.log('"30"==30 is ', "30" == 30);
console.log('"30"!=30 is ', "30" != 30);
console.log('"30"===30 is ', "30" === 30);
console.log('"30"!==30 is ', "30" !== 30);
执行结果:
D:\js\code>node equals.js
"30"==30 is true
"30"!=30 is false
"30"===30 is false
"30"!==30 is true
while 循环
JavaScript 的循环与 C 是非常像的,包含 while 与 for 语句都几乎是一样的。以下是一个 JavaScript 的 while 循环范例。
档案: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
for 循环
档案:for.js
for (i=1;i<=10;i++) {
console.log("i=", i);
}
执行结果:
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
当然、同样的事情也可以用 for 循环来做,这种写法会更短更简洁,以下是采用 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);
}
执行结果:
D:\jsbook>node forbreak.js
i=1
i=2
i=4
i=5
i=6
i=7
数组
JavaScript 的数组宣告非常简单,就是用 `[...]` 所框起来的一连串数据,或者您也可以用 `new Array()` 语句来建立一个空的数组,而且可以用 length 属性来取得数组大小。
档案:array.js
var a=[1,6,2,5,3,6,1];
for (i=0;i
console.log("a[%d]=%d", i, a[i]);
}
执行结果
D:\jsbook>node array.js
a[0]=1
a[1]=6
a[2]=2
a[3]=5
a[4]=3
a[5]=6
a[6]=1
当然、javascript 有些语法是 C 语言所没有的,像是 JavaScript 的 foreach 语句采用 `for (i in c)` 这样的语法,其中的 c 必须是个数组或容器,而 i 则是索引值 (注意、不是内容,是索引值),以下是这种语句的一个范例。
档案:foreach.js
var a=[1,6,2,5,3,6,1];
for (i in a) {
console.log("a[%d]=%d", i, a[i]);
}
执行结果
D:\jsbook>node foreach
a[0]=1
a[1]=6
a[2]=2
a[3]=5
a[4]=3
a[5]=6
a[6]=1
接着、请读者可以思考并尝试一下,如何撰写下列的两个程序。
习题 1:请写一个程序可以将两个数组 a=[1,2,3] b=[3,2,1] 相加。
习题 2:请写一个程序可以计算两个向量 a=[1,2,3] b=[3,2,1] 的内积。
二维数组
当然、我们也可以宣告二维、三维、甚至更高维的数组,以下是一个将二为数组格式化为字符串后印出来的范例。
档案:array2D.js
var a=[[1,6,2],
[5,3,6]];
for (var i=0; i
var line = "";
line = line + a[i][j] + " ";
}
console.log(line);
}
执行结果
D:\jsbook>node array2D
1 6 2
5 3 6
看了上述范例之后,也建议读者可以尝试一下撰写下列程序。
- 习题 1:请写一个程序可以将两个矩阵 a=[[1,2,3], [2,3,4]] b=[[1,1],[2,2],[3,3]] 相加。
- 习题 2:请写一个程序可以将两个矩阵 a=[[1,2,3], [2,3,4]] b=[[1,1],[2,2],[3,3]] 相乘 (内积)。
字典 (对象)
虽然上述这些 JavaScript 的语法很像 C 语言,但是 JavaScript 本质上仍然是个动态语言,其特性比较像 Python、 Ruby 等语言,因此默认就有提供更高阶的数据结构,其中最重要的一个就是字典 (dictonary),字典中的基本元素是 (key, value) 的配对,我们只要将 key 传入就可以取得 value 的値,以下是一个 JavaScript 的字典范例。
档案:dict.js
var dict={ name:"john", age:30 };
dict["email"] = "john@gmail.com";
dict.tel = "02-12345678";
for (var key in dict) {
console.log("key=", key, " value=", dict[key]);
}
console.log("age=", dict.age);
console.log("birthday=", dict["birthday"]);
执行结果
D:\js\code>node dict.js
key= name value= john
key= age value= 30
key= email value= john@gmail.com
key= tel value= 02-12345678
age= 30
birthday= undefined
结语
在本章中,我们介绍了「变量、表达式、if 判断式, for 与 while 循环」,还有「数组与字典对象」等基础语法,学会这些语法之后,就可以写一些基础的小程序了。
但是若要写出更好、更模块化的程序,那就还需要学会「函数与面向对象」的写法,这将是下一期的主题。