JavaScript控制程序流
通常javascript的语句按写入顺序逐个执行,这称为顺序执行,这是javascript的默认流程方向。
顺序执行的一种替代方法是将程序流传输到脚本的另一个部分。即,不是按顺序执行下一条语句,而是执行另一条语句。
若要使脚本有用,必须按逻辑方式执行此控制转移。程序控制的转移是基于判定进行的,判定的结果是一个真实性语句(返回布尔值 true 或 false)。创建一个表达式,然后测试其结果是否为 true。可通过两种主要的程序结构来实现此目的。
第一种是选择结构。可以使用该结构通过在程序中创建一个交叉点(类似道路的分岔)来指定程序流的可能方向。JavaScript 中有四种选择结构。
- 单选结构(if)
- 双选结构(if/else)
- 内三元运算符 ? :
- 多选结构 switch
第二种程序控制结构是重复结构。可以使用该结构来指定要在满足某个条件时重复的操作。当满足控制语句的条件时(通常,经过特定次数的迭代后),控制转到重复结构之外的下一条语句。JavaScript 中有四种重复结构。
- 在循环顶部测试表达式(while)
- 在循环底部测试表达式(do/while)
- 操作对象的每个属性(for-in)
- 由计数器控制的重复(for)
可以通过嵌套和堆叠选择控制结构以及重复控制结构来创建相当复杂的脚本。
使用条件判断表达式
JavaScript 支持 if 和 if...else 条件语句。在 if 语句中测试条件,如果该条件满足测试,则执行相关 JavaScript 代码。在 if...else 语句中,如果该条件未通过测试,则执行其他代码。最简单的 if 语句形式可以写在一行内,但是通常使用多行 if 和 if...else 语句。
以下示例阐释了 if 和 if...else 语句可以使用的语法。第一个示例显示最简单一种的布尔测试。当(且仅当)圆括号内的项计算结果为(或可以强制为)true 时,执行 if 后面的语句或语句块。
function GetReaction(newShip, color, texture, dayOfWeek) { // The test succeeds if the newShip Boolean value is true. if (newShip) { return "Champagne Bottle"; } // The test succeeds if both conditions are true. if (color == "deep yellow" && texture == "large and small wrinkles") { return "Is it a crenshaw melon?"; } // The test succeeds if either condition is true. if ((dayOfWeek == "Saturday") || (dayOfWeek == "Sunday")) { return "I'm off to the beach!"; } else { return "I'm going to work."; } } var reaction = GetReaction(false, "deep yellow", "smooth", "Sunday"); document.write(reaction); // Output: I'm off to the beach!
条件运算符:
JavaScript 还支持隐式条件格式。它在要测试的条件后使用问号(而不是在条件前的字 if)。它还指定两个替代项,一个在满足条件时使用,一个在不满足条件时使用。这些替代项必须用冒号分隔开。
var AMorPM = (theHour >= 12) ? "PM" : "AM";
例如,如果有一个 AND 表达式为((x == 123) && (y == 6)),则 JavaScript 将先检查 x 是否为 123。如果不是,则整个表达式不能为 true,即使 y 等于 6 也是如此。因此,绝不会对 y 进行测试,而且 JavaScript 返回值 false。同样,如果仅多个条件中的一个条件必须为 true(使用 || 运算符),则在任一条件通过测试后,测试就会停止。如果要测试的条件涉及执行函数调用或其他复杂表达式,则这会很有效。出于这种考虑,在编写 Or 表达式时,应先放置最有可能为 true 的条件。在编写 And 表达式时,应先放置最有可能为 false 的条件。
采用这种方式设计脚本的优点是,如果 runfirst() 返回 0,以下示例中将不会执行 runsecond()。
使用循环
可通过多种方式来使用来重复执行语句或者语句块。一般,重复执行称之为循环或者迭代。迭代就是循环的单次执行。通常,它是由变量测试控制的,每次执行循环时,它的值都会发生变化。JavaScript 支持四种类型的循环:for 循环、for...in 循环、while 循环、do...while 循环。
用于循环
for语句指定一个计数器变量,一个测试条件,一个跟新计数器的操作。在每次循环迭代之前,先测试条件。如果测试成功,则执行循环内的代码。如果测试失败,则不执行循环内的代码,程序继续执行紧靠循环后面的第一行代码。在循环执行后和下一次迭代开始之前,先更新计数器变量。如果循环条件始终不满足,则不执行该循环。如果始终满足测试条件,则产生无限循环。在某些情况下,可能希望出现前一种情况,但几乎从不希望出现后一种情况,因此编写循环条件时一定要谨慎。
// The update expression ("icount++" in the following examples) // is executed at the end of the loop, after the block of // statements that forms the body of the loop is executed, and // before the condition is tested. // Set a limit of 10 on the loop. var howFar = 10; // Create an array called sum with 10 members, 0 through 9. var sum = new Array(howFar); sum[0] = 0; // Iterate from 0 through 9. var theSum = 0; for(var icount = 0; icount < howFar; icount++) { theSum += icount; sum[icount] = theSum; } // This code is not executed at all, because icount is not greater than howFar. var newSum = 0; for(var icount = 0; icount > howFar; icount++) { newSum += icount; } // This is an infinite loop. var sum = 0; for(var icount = 0; icount >= 0; icount++) { sum += icount; }
使用for-in循环
用于单步执行(迭代)对象可枚举的所有属性或者数组的所有元素。for-in循环中循环计数器可以是字符串,也可以是数字(一般为字符串)。
// Create an object with some properties var myObject = new Object(); myObject.name = "James"; myObject.age = "22"; myObject.phone = "555 1234"; // Enumerate (loop through)_all the properties in the object for (var prop in myObject) { // This displays "The property 'name' is James", etc. document.write("The property '" + prop + "' is " + myObject[prop]); // New line. document.write("<br />"); }
while 循环类似于 for 循环。差异在于,while 循环没有内置计数器变量或更新表达式。若要控制语句或语句块的重复执行,但需要更复杂的规则而不是仅“运行此代码 n 次”,请使用 while 循环。以下示例使用 Internet Explorer 对象模型和 while 循环来向用户询问简单的问题。
var x = 0; while ((x != 5) && (x != null)) { x = window.prompt("What is my favorite number?", x); } if (x == null) window.alert("You gave up!"); else window.alert("Correct answer!");
注意:因为 while 循环没有显式的内置计数器变量,所以此循环比其他类型的循环更容易出现无限循环。再者,因为有时很难发现循环条件是在何时或何处更新的,所以如果使用不慎,编写的 while 循环可能从不更新其条件。因此,设计 while 循环时要十分谨慎。 而do while()和while()类似,只是do while()至少执行一次代码块。
使用break和continue关键字:区别:使用break会强制跳出循环体,执行紧跟循环后面的代码,而continue则是退出本次循环,依旧会从顶部继续执行该循环体。
var x = 0; do { x = window.prompt("What is my favorite number?", x); // Did the user cancel? If so, break out of the loop if (x == null) break; // Did they enter a number? // If so, no need to ask them to enter a number. if (Number(x) == x) continue; // Ask user to only enter in numbers window.alert("Please only enter in numbers!"); } while (x != 5) if (x != 5) window.alert("You gave up!"); else window.alert("Correct answer!");