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