| 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 屬性
- 正則表達式簡介
- 正則表達式
- 早期起源
- 使用正則表達式
- 正則表達式語法
- 建立正則表達式
- 優先權順序
- 普通字符
- 特殊字符
- 非打印字符
- 字符匹配
- 限定符
- 定位符
- 選擇和編組
- 后向引用