控製程序的流程

來源:互聯網
上載者:User
程式|控制

Jscript 指令碼中的語句一般是按照寫的順序來啟動並執行。這種運行稱為順序運行,是程式流的預設方向。

與順序運行不同,另一種運行將程式流轉換到指令碼的另外的部分。也就是,不按順序運行下一條語句,而是運行另外的語句。

要使指令碼可用,該控制的轉換必須以邏輯方式執行。程式控制的轉換是基於一個“決定”,這個“決定”結果是真或假(返回  Boolean 型 true false)。 建立一個運算式,然後測試其是否為真。主要有兩種程式結構實現本功能。

第一種是選擇結構。用來指明兩種程式流方向,在程式中建立一個交叉點(像岔路)。在 Jscript 中有四種選擇結構可用。

  • 單一選擇結構(if),
  • 二路選擇結構(if/else),
  • 內聯三元運算子 ?:
  • 多路選擇結構(switch)。

第二種類型的程式控制結構是迴圈結構。使用迴圈結構來指明當某些條件保持為真時要重複的動作。當控制語句的條件得到滿足時(通常在某些迭代的特定數字後),控制跳過迴圈結構傳遞到下條語句。在 Jscript 中有四種迴圈結構可用。

  • 在迴圈的開頭測試運算式(while),
  • 在迴圈的末尾測試運算式(do/while),
  • 對對象的每個屬性都進行操作(for/in),
  • 由計數器控制的迴圈(for)。

通過嵌套和堆棧選擇、迴圈控制結構,可以建立相當複雜的指令碼。

第三種形式的結構程式流由意外處理給出,本文檔不作討論。

使用條件陳述式

JScript 支援 ifif...else 條件陳述式。在 if 語句中將測試一個條件,如果該條件滿足測試,執行相關的 JScript 編碼。在 if...else 語句中,如果條件不滿足測試,則將執行不同的代碼。最簡單的 if 語句格式可以在一行中寫完,不過更常見的是多行的 ifif...else 語句。

下述樣本示範了使用 ifif...else 語句的各種可能的文法。第一個樣本示範了最簡單的布爾測試。當(且僅當)括弧之間的項的值為(或者可被強制轉換為) true 時,if 後續的語句或語句塊才會被執行。

// smash() 函數是在該代碼的其他地方定義的。// 布爾測試,看 newShip 是否為 trueif (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;  // 將迴圈次數限制為 10var sum = new Array(howFar);  // 建立一個稱為 sum 並具有 10 個成員的數組,這 10 個成員從 0  9var 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 不大於 howFarnewSum += 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!");


相關文章

Beyond APAC's No.1 Cloud

19.6% IaaS Market Share in Asia Pacific - Gartner IT Service report, 2018

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。