🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
| JScript  | [语言参考](#) | |-----|-----| # 控制程序的流程 Jscript 脚本中的语句一般是按照写的顺序来运行的。这种运行称为顺序运行,是程序流的默认方向。 与顺序运行不同,另一种运行将程序流转换到脚本的另外的部分。也就是,不按顺序运行下一条语句,而是运行另外的语句。 要使脚本可用,该控制的转换必须以逻辑方式执行。程序控制的转换是基于一个“决定”,这个“决定”结果是真或假(返回  Boolean 型 **true **或 **false**)。 创建一个表达式,然后测试其是否为真。主要有两种程序结构实现本功能。 第一种是选择结构。用来指明两种程序流方向,在程序中创建一个交叉点(像岔路)。在 Jscript 中有四种选择结构可用。 - 单一选择结构(**if**), - 二路选择结构(**if/else**), - 内联三元运算符 **?:** - 多路选择结构(**switch**)。 第二种类型的程序控制结构是循环结构。使用循环结构来指明当某些条件保持为真时要重复的动作。当控制语句的条件得到满足时(通常在某些迭代的特定数字后),控制跳过循环结构传递到下条语句。在 Jscript 中有四种循环结构可用。 - 在循环的开头测试表达式(**while**), - 在循环的末尾测试表达式(**do/while**), - 对对象的每个属性都进行操作(**for/in**), - 由计数器控制的循环(**for**)。 通过嵌套和堆栈选择、循环控制结构,可以创建相当复杂的脚本。 第三种形式的结构程序流由意外处理给出,本文档不作讨论。 ### 使用条件语句 JScript 支持 **if** 和 [if...else](#) 条件语句。在 **if** 语句中将测试一个条件,如果该条件满足测试,执行相关的 JScript 编码。在 **if...else** 语句中,如果条件不满足测试,则将执行不同的代码。最简单的 **if** 语句格式可以在一行中写完,不过更常见的是多行的 **if** 和 **if...else** 语句。 下述示例演示了使用 **if** 和 **if...else** 语句的各种可能的语法。第一个示例演示了最简单的布尔测试。当(且仅当)括号之间的项的值为(或者可被强制转换为) **true** 时,**if** 后续的语句或语句块才会被执行。 ~~~ // smash() ~~~ 函数是在该代码的其他地方定义的。 ~~~ // ~~~ 布尔测试,看 ~~~ newShip ~~~ 是否为 ~~~ true ~~~ 。 ~~~ if (newShip) ~~~     ~~~ smash(champagneBottle,bow); ~~~ ~~~ // ~~~ 在本示例中,除非两个条件都为真,否则该测试将不会被满足。 ~~~ if (rind.color == "deep yellow " && rind.texture == "large and small wrinkles") ~~~ ~~~ { ~~~     ~~~ theResponse = ("Is it a Crenshaw melon?"); ~~~ ~~~ } ~~~ ~~~ // ~~~ 在本示例中,只要任何一个条件为真,则测试即会满足。 ~~~ var theReaction = ""; ~~~ ~~~ if ((dayOfWeek == "Saturday") || (dayOfWeek == "Sunday")) ~~~ ~~~ { ~~~ ~~~    theReaction = ("I'm off to the beach!"); ~~~ ~~~ } ~~~ ~~~ else ~~~ ~~~ { ~~~ ~~~    theReaction = ("Hi ho, hi ho, it's off to work I go!"); ~~~ ~~~ } ~~~ ### 条件运算符 JScript 也支持隐式的条件格式。该格式在要测试的条件后使用一个问号(而不是在条件前的 **if** )。它也指定两个可选项,一个在满足条件时使用,另一个在条件不满足时使用。这两个选择项之间必须用一个冒号隔开。 ~~~ var hours = ""; // ~~~ 下面的代码指定 ~~~ hours ~~~ 是包含 ~~~ theHour ~~~ 的内容, ~~~ // ~~~ 还是包含 ~~~ theHour - 12 ~~~ 的内容。 ~~~ hours += (theHour >= 12) ? " PM" : " AM"; ~~~ 如果要一起测试多个条件,并且知道某个条件比其他条件更可能满足或不满足测试,可以使用称为“短路计算”的特性来加速脚本的运行速度。当 JScript 计算逻辑表达式时,只计算要得到结果所需的子表达式。 例如,如果有一个“与”表达式,如 ((x == 123) && (y == 42)),Jscript 首先检查 x 是否为 123。如果不是,即使 y 等于 42,整个表达式的值也不可能为 true。因此,并不对 y 作测试,Jscript 返回 **false** 值。 类似地,如果多个条件中只要有一个为真(使用 || 运算符),则当任何一个条件满足该测试时测试则停止。如果要测试的条件包括函数调用或其他复合表达式,这种处理方式就有效。出于此种想法,写 OR 表达式时,先写最有可能为 **true** 的条件。写 AND 表达式时,先写最有可能为 **false** 的条件。 以这种方式设计脚本的好处的一个示例是:在下例中如果 **runfirst()** 返回 0 或 **false**, 则不会运行 **runsecond()**。 ~~~ if ((runfirst() == 0) || (runsecond() == 0)) { // ~~~ 若干代码。 } ### 使用循环 有多种方式来重复执行一条语句或语句块。通常重复执行被称为*循环*或*重复*。重复只是循环的一个运行。典型情况是用一个变量测试来进行控制,每执行一次循环变量的取值都会更改。JScript 支持四种循环: [for](#) 循环、 [for...in](#) 循环、 [while](#) 循环、 [do...while](#) 循环。 ### 使用 for 循环 **for** 语句指定了一个计数器变量,一个测试条件,以及更新该计数器的操作。在每次循环的重复之前,都将测试该条件。如果测试成功,将运行循环中的代码。如果测试不成功,不运循环中的代码,程序继续运行紧跟在循环后的第一行代码。在执行该循环后,计算机变量将在下一次循环之前被更新。 如果循环条件永不会满足,则不执行该循环。如果测试条件始终满足,则将导致无限循环。在有些情况下,前者可能是合乎需要的,而后者几乎没有用处,因此在编写循环条件时一定要注意。 ~~~ /* ~~~ 更新表达式 ~~~ ~~~ (下例中的 ~~~ "icount++" ~~~ )将在循环结束时被执行,即在构成循环主体的语句块被执行后,在测试条件之前。 ~~~ */ ~~~ ~~~ var howFar = 10; // ~~~ 将循环次数限制为 ~~~ 10 ~~~ 。 ~~~ var sum = new Array(howFar); // ~~~ 创建一个称为 ~~~ sum ~~~ 并具有 ~~~ 10 ~~~ 个成员的数组,这 ~~~ 10 ~~~ 个成员从 ~~~ 0 ~~~ 到 ~~~ 9 ~~~ 。 ~~~ var theSum = 0; ~~~ ~~~ sum[0] = 0; ~~~ ~~~ for(var icount = 0; icount < howFar; icount++) { // ~~~ 在本例中将从 ~~~ 0 ~~~ 到 ~~~ 9 ~~~ 进行计数。 ~~~ theSum += icount; ~~~ ~~~ sum[icount] = theSum; ~~~ ~~~ } ~~~ ~~~ var newSum = 0; ~~~ ~~~ for(var icount = 0; icount > howFar; icount++) { // ~~~ 该循环根本不会被执行,因为 ~~~ icount ~~~ 不大于 ~~~ howFar ~~~ 。 ~~~ newSum += icount; ~~~ ~~~ } ~~~ ~~~ var sum = 0; ~~~ ~~~ for(var icount = 0; icount >= 0; icount++) { // ~~~ 这是一个无限循环。 ~~~ sum += icount; ~~~ ~~~ } ~~~ ### 使用 for...in 循环 JScript 提供了一种特别的循环方式来遍历一个[对象](#)的所有用户定义的属性或者一个数组的所有元素。**for...in** 循环中的循环计数器是一个字符串,而不是数字。它包含当前属性的名称或者当前数组元素的下标。 下面的代码范例应在 Internet 浏览器中运行,因为它使用 **alert** 方法,该方法不属于 Jscript。 ~~~ // ~~~ 创建具有某些属性的对象 ~~~ var myObject = new Object(); ~~~ ~~~ myObject.name = "James"; ~~~ ~~~ myObject.age = "22"; ~~~ ~~~ myObject.phone = "555 1234"; ~~~ ~~~ // ~~~ 枚举(循环)对象的所有属性 ~~~ for (prop in myObject) ~~~ ~~~ { ~~~ ~~~ // ~~~ 显示 ~~~ "The property 'name' is James" ~~~ ,等等。 ~~~ window.alert("The property '" + prop + "' is " + myObject[prop]); ~~~ ~~~ } ~~~ 尽管 **for...in** 循环看起来像 VBScript 的 **For Each...Next** 循环,其实并不一样。JScript 的 **for...in 循环**重复Jscript 对象所有的属性。VBScript 的 **For Each...Next **循环重复集合中的所有项目。要循环 JScript 中的所有集合,需要用 **Enumerator** 对象。尽管某些对象(像 Internet 浏览器中的那些)支持 VBScript 的 **For Each...Next **和 Jscript 的 **for...in **循环,但多数对象并不都支持。 ### 使用 while 循环 **while** 循环相似于 **for** 循环。其不同之处是 **while** 循环没有内置的计数器或更新表达式。如果希望控制语句或语句块的循环执行,需要不只是“运行该代码 n 次”,而是更复杂的规则,用 **while** 循环。下面的示例使用 Internet 浏览器对象模型和 **while** 循环来询问用户一个简单的问题。 ~~~ var x = 0; while ((x != 42) && (x != null)) { x = window.prompt("What is my favourite number?", x); } if (x == null) window.alert("You gave up!"); else window.alert("Yep - it's the Ultimate Answer!"); ~~~ **注意   **由于 **while** 循环没有显式的内置计数器变量,因此比其他类型的循环更容易产生无限循环。此外,由于不易发现循环条件是在何时何地被更新的,很容易编写一个实际上从不更新条件的 **while** 循环。因此在编写 **while** 循环时应特别小心。 同上面所提到的,在 JScript 中还有 **do...while **循环与 while 循环相似,不同处在于它总是至少运行一次,因为是在循环的末尾检查条件,而不是在开头。例如,上面的循环可以被改写为: ~~~ var x = 0; do { x = window.prompt("What is my favourite number?", x); } while ((x != 42) && (x != null)); if (x == null) window.alert("You gave up!"); else window.alert("Yep - it's the Ultimate Answer!"); ~~~ ### 使用 break 和 continue 语句 在 Microsoft Jscript 中当某些条件得到满足时,用 [break](#) 语句来中断一个循环的运行。(请注意,也用 **break** 语句退出一个 **switch **块。)。如果是一个 **for** 或者 **for...in **循环,在更新计数器变量时使用 [continue](#) 语句越过余下的代码块而直接跳到下一个循环中。 下面的例子基于前面的示例用 **break **和 **continue **语句控制循环。 ~~~ var x = 0; do { x = window.prompt("What is my favourite number?", x); // ~~~ 判断用户是否选择取消?如果是,退出循环。 ~~~ if (x == null) ~~~ ~~~ break; ~~~ ~~~ // ~~~ 是否输入一个数? ~~~ // ~~~ 如果是则无需要求输入一个数。 ~~~ if (Number(x) == x) ~~~ ~~~ continue; ~~~ ~~~ // ~~~ 要求用户只输入数字。 ~~~ window.alert("Please only enter in numbers!"); ~~~ ~~~ } while (x != 42) ~~~ ~~~ if (x == null) ~~~ ~~~ window.alert("You gave up!"); ~~~ ~~~ else ~~~ ~~~ window.alert("Yep - it's the Ultimate Answer!"); ~~~ [© 2000 Microsoft Corporation 版权所有。保留所有权利。使用规定。](#)