| 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 版权所有。保留所有权利。使用规定。](#)
- JScript
- JScript 用户指南
- Jscript 基础
- 什么是 JScript?
- 编写 JScript 代码
- JScript 的变量
- JScript 的数据类型
- JScript 的运算符
- 控制程序的流程
- JScript 函数
- Jscript对象
- 创建自己的对象
- 内部对象
- JScript 保留关键字
- 高级 JScript
- 创建高级对象
- 递归
- 变量范围
- 复制、传递和比较数据
- 使用数组
- 特殊字符
- 脚本问题解答
- 条件编译
- 条件编译变量
- 在浏览器中显示信息
- 使用消息框
- 语言参考
- 特性信息
- Microsoft JScript 特性 - ECMA
- Microsoft JScript 特性 - 非-ECMA
- JScript 字母顺序的关健字列表
- JScript 错误
- JScript 运行时错误
- JScript 语法错误
- JScript 函数
- GetObject 函数
- ScriptEngine 函数
- ScriptEngineBuildVersion 函数
- ScriptEngineMajorVersion 函数
- ScriptEngineMinorVersion 函数
- JScript 方法
- A-E
- abs 方法
- acos 方法
- anchor 方法
- apply 方法
- asin 方法
- atan 方法
- atan2 方法
- atEnd 方法
- big 方法
- blink 方法
- bold 方法
- call 方法
- ceil 方法
- charAt 方法
- charCodeAt 方法
- compile 方法
- concat 方法 (Array)
- concat 方法 (String)
- cos 方法
- decodeURI 方法
- decodeURIComponent 方法
- dimensions 方法
- encodeURI 方法
- encodeURIComponent 方法
- escape 方法
- eval 方法
- exec 方法
- exp 方法
- F-I
- fixed 方法
- floor 方法
- fontcolor 方法
- fontsize 方法
- fromCharCode 方法
- getDate 方法
- getDay 方法
- getFullYear 方法
- getHours 方法
- getItem 方法
- getMilliseconds 方法
- getMinutes 方法
- getMonth 方法
- getSeconds 方法
- getTime 方法
- getTimezoneOffset 方法
- getUTCDate 方法
- getUTCDay 方法
- getUTCFullYear 方法
- getUTCHours 方法
- getUTCMilliseconds 方法
- getUTCMinutes 方法
- getUTCMonth 方法
- getUTCSeconds 方法
- getVarDate 方法
- getYear 方法
- indexOf 方法
- isFinite 方法
- isNaN 方法
- italics 方法
- item 方法
- J-R
- join 方法
- lastIndexOf 方法
- lbound 方法
- link 方法
- localeCompare 方法
- log 方法
- match 方法
- max 方法
- min 方法
- moveFirst 方法
- moveNext 方法
- parse 方法
- parseFloat 方法
- parseInt 方法
- pop 方法
- pow 方法
- push 方法
- random 方法
- replace 方法
- reverse 方法
- round 方法
- S
- search 方法
- setDate 方法
- setFullYear 方法
- setHours 方法
- setMilliseconds 方法
- setMinutes 方法
- setMonth 方法
- setSeconds 方法
- setTime 方法
- setUTCDate 方法
- setUTCFullYear 方法
- setUTCHours 方法
- setUTCMilliseconds 方法
- setUTCMinutes 方法
- setUTCMonth 方法
- setUTCSeconds 方法
- setYear 方法
- shift 方法
- sin 方法
- slice 方法 (Array)
- slice 方法 (String)
- small 方法
- sort 方法
- splice 方法
- split 方法
- sqrt 方法
- strike 方法
- sub 方法
- substr 方法
- substring 方法
- sup 方法
- T-Z
- tan 方法
- test 方法
- toArray 方法
- toDateString 方法
- toExponential 方法
- toFixed 方法
- toGMTString 方法
- toLocaleDateString 方法
- toLocaleLowerCase 方法
- toLocaleString 方法
- toLocaleTimeString 方法
- toLocaleUpperCase 方法
- toLowerCase 方法
- toPrecision 方法
- toString 方法
- toTimeString 方法
- toUpperCase 方法
- toUTCString 方法
- ubound 方法
- unescape 方法
- unshift 方法
- UTC 方法
- valueOf 方法
- JScript 对象
- ActiveXObject 对象
- Array 对象
- Boolean 对象
- Date 对象
- Enumerator 对象
- Error 对象
- Function 对象
- Global 对象
- Math 对象
- Number 对象
- Object 对象
- RegExp 对象
- 正则表达式对象
- String 对象
- VBArray 对象
- JScript 运算符
- 通用信息
- 运算符优先级
- 运算符总结
- 加法赋值运算符 (+=)
- 加法运算符 (+)
- 赋值运算符 (=)
- 按位“与”赋值运算符 (&=)
- 按位“与”运算符 (&)
- 按位左移运算符 (<<)
- 按位“非”运算符 (~)
- 按位“或”赋值运算符 (|=)
- 按位“或”运算符 (|)
- 按位右移运算符 (>>)
- 按位“异或”赋值运算符 (^=)
- 按位“异或”运算符 (^)
- 逗号运算符 (,)
- 比较运算符
- 复合赋值运算符
- 条件(三目)运算符 (?:)
- delete 运算符
- 除法赋值运算符 (/=)
- 除法运算符 (/)
- in 运算符
- 递增 (++) 和递减 (--) 运算符
- instanceof 运算符
- 左移赋值运算符 (<<=)
- 逻辑“与”运算符 (&&)
- 逻辑“非”运算符 (!)
- 逻辑“或”运算符 (||)
- 取余赋值运算符 (%=)
- 取余运算符 (%)
- 乘法赋值运算符 (*=)
- 乘法运算符 (*)
- new 运算符
- 右移赋值运算符 (>>=)
- 减法赋值运算符 (-=)
- 减法运算符 (-)
- typeof 运算符
- 无符号右移运算符 (>>>)
- 无符号右移赋值操作 (>>>=)
- void 运算符
- JScript 属性
- $1...$9 属性
- arguments 属性
- caller 属性
- constructor 属性
- description 属性
- E 属性
- global 属性
- hasOwnProperty 方法
- ignoreCase 属性
- index 属性
- Infinity 属性
- input 属性($_)
- isProptotyeOf 方法
- lastIndex 属性
- length 属性 (Array)
- length 属性 (Function)
- length 属性 (String)
- LN10 属性
- LN2 属性
- LOG10E 属性
- LOG2E 属性
- MAX_VALUE 属性
- message 属性
- MIN_VALUE 属性
- multiline 属性
- name 属性
- NaN 属性
- NaN 属性 (Global)
- NEGATIVE_INFINITY 属性
- number 属性
- PI 属性
- POSITIVE_INFINITY 属性
- propertyIsEnumerable 属性
- prototype 属性
- source 属性
- SQRT1_2 属性
- SQRT2 属性
- undefined 属性
- JScript 语句
- @cc_on 语句
- @if 语句
- @set 语句
- break 语句
- Comment 语句
- continue 语句
- do...while 语句
- for 语句
- for...in 语句
- function 语句
- if...else 语句
- Labeled 语句
- return 语句
- switch 语句
- this 语句
- throw 语句
- try...catch...finally 语句
- var 语句
- while 语句
- with 语句
- FileSystemObject 用户指南
- FileSystemObject 对象模型
- FileSystemObject 和 Scripting 运行时库参考的介绍
- FileSystemObject 对象
- 设计 FileSystemObject
- 处理驱动器和文件夹
- 处理文件
- FileSystemObject 示例代码
- Scripting 运行时库参考
- 脚本运行时方法
- Add 方法 (Dictionary)
- Add 方法 (Folders)
- BuildPath 方法
- Close 方法
- Copy 方法
- CopyFile 方法
- CopyFolder 方法
- CreateFolder 方法
- CreateTextFile 方法
- Delete 方法
- DeleteFile 方法
- DeleteFolder 方法
- DriveExists 方法
- Exists 方法
- FileExists 方法
- FolderExists 方法
- GetAbsolutePathName 方法
- GetBaseName 方法
- GetDrive 方法
- GetDriveName 方法
- GetExtensionName 方法
- GetFile 方法
- GetFileName 方法
- getFileVersion 方法
- GetFolder 方法
- GetParentFolderName 方法
- GetSpecialFolder 方法
- GetTempName 方法
- Items 方法
- Keys 方法
- Move 方法
- MoveFile 方法
- MoveFolder 方法
- OpenAsTextStream 方法
- OpenTextFile 方法
- Read 方法
- ReadAll 方法
- ReadLine 方法
- Remove 方法
- RemoveAll 方法
- Skip 方法
- SkipLine 方法
- Write 方法
- WriteBlankLines 方法
- WriteLine 方法
- 脚本运行时对象
- Dictionary 对象
- Drive 对象
- Drives 集合
- File 对象
- Files 集合
- FileSystemObject 对象
- Folder 对象
- Folders 集合
- TextStream 对象
- 脚本运行时属性
- AtEndOfLine 属性
- AtEndOfStream 属性
- Attributes 属性
- AvailableSpace 属性
- Column 属性
- CompareMode 属性
- Count 属性
- DateCreated 属性
- DateLastAccessed 属性
- DateLastModified 属性
- Drive 属性
- DriveLetter 属性
- Drives 属性
- DriveType 属性
- Files 属性
- FileSystem 属性
- FreeSpace 属性
- IsReady 属性
- IsRootFolder 属性
- Item 属性
- Key 属性
- Line 属性
- Name 属性
- ParentFolder 属性
- Path 属性
- RootFolder 属性
- SerialNumber 属性
- ShareName 属性
- ShortName 属性
- ShortPath 属性
- Size 属性
- SubFolders 属性
- TotalSize 属性
- Type 属性
- VolumeName 属性
- 正则表达式简介
- 正则表达式
- 早期起源
- 使用正则表达式
- 正则表达式语法
- 建立正则表达式
- 优先权顺序
- 普通字符
- 特殊字符
- 非打印字符
- 字符匹配
- 限定符
- 定位符
- 选择和编组
- 后向引用