1. 程式人生 > 其它 >JS的控制語句與異常

JS的控制語句與異常

if 控制語句

'''
if-else基本格式
if (表示式){
語句1;
......
}else{
語句2;
.....
};
功能說明:如果表示式的值為true則執行語句1,否則執行語句2
'''
var x= (new Date()).getDay();
// 獲取今天的星期值,0為星期天
var y;

if ( (x==6) || (x==0) ) {
y="週末";
}else{
y="工作日";
};
alert(y);
// 等價於 y="工作日"; if ( (x==6) || (x==0) ) { y="週末"; };

if 可以單獨使用

if語句巢狀格式
if (表示式1) {
    語句1;
}
else if (表示式2){ 語句2; }else if (表示式3){ 語句3; } else{ 語句4; };
if (x==1){
    y="星期一";
}else if (x==2){
    y="星期二";
...
}else if (x==6){
    y="星期六";
}else if (x==0){
    y="星期日";
}else{
    y="未定義";
};

switch 選擇控制語句

switch基本格式
switch (表示式) {
case 值1:語句1;break;
case 值2:語句2;break;
case 值3:語句3;break;
default:語句4;
};

switch(x){
case 1:y="星期一";    break;
case 2:y="星期二";    break;
case 3:y="星期三";    break;
case 4:y="星期四";    break;
case 5:y="星期五";    break;
case 6:y="星期六";    break;
case 7:y="星期日";    break;
default: y="未定義";};

switchelse if結構更加簡潔清晰,使程式可讀性更強,效率更高。

首先要看一個問題,if 語句適用範圍比較廣,只要是 boolean 表示式都可以用 if
判斷;而 switch 只能對基本型別進行數值比較。兩者的可比性就僅限在兩個基本型別比較的範圍內。 說到基本型別的數值比較,那當然要有兩個數。然後重點來了—— if 語句每一句都是獨立的,看下面的語句: if (a == 1) ... else if (a == 2) ... 這樣 a 要被讀入暫存器兩次,1 和 2 分別被讀入暫存器一次。於是你是否發現其實 a 讀兩次是有點多餘的,在你全部比較完之前只需要一次讀入暫存器就行了,其餘都是額外開銷。但是 if 語句必須每次都把裡面的兩個數從記憶體拿出來讀到暫存器,它不知道你其實比較的是同一個 a。 於是 switch case 就出來了,把上面的改成 switch case 版本: switch (a) { case 0: break; case 1: } 總結: 1.switch用來根據一個整型值進行多路分支,並且編譯器可以對多路分支進行優化 2.switch-case只將表示式計算一次,然後將表示式的值與每個case的值比較,進而選 擇執行哪一個case的語句塊 3.if..else 的判斷條件範圍較廣,每條語句基本上獨立的,每次判斷時都要條件載入 一次。 所以在多路分支時用switch比if..else if .. else結構要效率高。
switch為什麼效率高?

for 迴圈控制語句

'''
for迴圈基本格式
for (初始化;條件;增量) {
    語句1;
    ...
};
功能說明:實現條件迴圈,當條件成立時,執行語句1,否則跳出迴圈體
'''
for (var i=1;i<=7;i++){
    document.write("<H"+i+">hello</H "+i+"> ");
    document.write("<br>");
};
//----------------------------------------------
var arr=[1,"hello",true]//var dic={"1":"111"}
for (var i in arr){
    console.log(i);
    console.log(arr[i]);
};

注意:

doms=document.getElementsByTagName("p");

for (var i in doms) {
    console.log(i); // 0 1 2 length item namedItem
};

// 迴圈的是你獲取的th一個DOM元素集,for in用來迴圈物件的所有屬性,dom元素集包含了你上面輸出的屬性。
// 如果你只要迴圈dom物件的話,可以用for迴圈:

for (var i=0;i<doms.length;i++) { console.log(i); // 0 1 2 // console.log(doms[i]); };

結論:for i in 不推薦使用.

while 迴圈控制語句

'''
while迴圈基本格式
while (條件){
語句1;
...
};
功能說明:執行功能和for類似,當條件成立迴圈執行語句花括號{}內的語句,否則跳出迴圈
'''
var i=1;
while (i<=7) {
    document.write("<H"+i+">hello</H "+i+"> ");
    document.write("<br>");
    i++;
}
//迴圈輸出H1到H7的字型大小
<script language="JavaScript">
/* sayhello是定義的函式名,前面必須加上function和空格*/
function sayHello() {
    var hellostr;
    var myname=prompt("請問您貴姓?",""); 
    hellostr="您好,"+myname+'先生,歡迎進入"探索之旅"!';
    alert(hellostr); 
    document.write(hellostr);
};
 //這裡是對前面定義的函式進行呼叫
sayHello();
</script>

練習:分別用for迴圈和while迴圈計算出1-100的和?

異常處理

'''
try {
    // 這段程式碼從上往下執行,其中任何一個語句丟擲異常該程式碼塊就結束執行
}
catch (e) {
    // 如果try程式碼塊中丟擲了異常,catch程式碼塊中的程式碼就會被執行。
    // e是一個區域性變數,用來指向Error物件或者其他丟擲的物件
}
finally {
     // 無論try中程式碼是否有異常丟擲(甚至是try程式碼塊中有return語句),finally程式碼塊中始終會被執行。
};
'''

注:主動丟擲異常 throw Error('xxxx')

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>標題</title>
</head>
<body>

<p>p1</p>
<p>p2</p>
<p>p3</p>
<p>p4</p>

    <script>
        /* if控制語句 */
        // var name='alex';
        // if (name=='mike') {
        //     alert('mike')
        // }else if (name=='jack') {
        //     alert('jack')
        // }else {
        //     alert('alex')
        // };


        /* switch控制語句 */
        // var week='7';
        // switch (week) {
        //     case 1:alert('星期一'); break; // case 判斷值:執行語句; break; 如果沒有break,那麼執行完後依舊會執行下一條
        //     case 2:alert('星期二'); break;
        //     case 3:alert('星期三'); break;
        //     case 4:alert('星期四'); break;
        //     case 5:alert('星期五'); break;
        //     case 6:alert('星期六'); break;
        //     case 7:alert('星期天'); break;
        //     default: alert('未定義'); // default: 執行語句; 儘量放在最後,如果不在最後那麼後面也要加上break
        // }


        /* for迴圈 */
        // for (var a=0; a<10; a++) {
        //     // for (初始化; 條件; 增量) {執行語句};
        //     document.write("迴圈第" + (a+1) + "次" + "<br>")
        // };
        //
        // var attr=['a', 'b', 'c', 'd']
        // for (var x=0; x<attr.length; x++) {
        //     // attr.length代表此陣列長度(4);x代表的是索引,還需要通過陣列索引進行取值
        //     document.write('x的值為:' + x + '<br>')
        //     document.write('獲取到的值是:' + attr[x] + '<br>')
        // };
        //
        // for (var i in attr) {
        //     // for (初始化 in 物件) {執行語句}; i是索引並不是值;此種方法不推薦使用
        //     document.write('i的值為:' + i + '<br>')
        //     document.write('獲取到的值是:' + attr[i] + '<br>')
        // };
        //
        // // for (初始化 in 物件) {執行語句}; 的不便之處,在html加上幾個標籤然後再迴圈取,發現最後多出了length item namedItem,這三個為標籤屬性
        // var eles_P=document.getElementsByTagName('p');
        // for (var e in eles_P) {
        //     console.log(e)
        // };


        /* while迴圈,格式while (條件) {執行語句}; */
        // var n=0, m=0;
        // while (n<101) {
        //     m+=n;
        //     n++; // 這裡是控制n的自增,很容易忘記,不控制的話進入了死迴圈
        // };
        // document.write(m);


        /* 異常 */
        try {
            // 這段程式碼從上往下執行,其中任何一個語句丟擲異常該程式碼塊就結束執行
            console.log('ok');
            throw Error('***define error***') // throw Error主動丟擲異常
        }
        catch (e) {
            // 如果try程式碼塊中丟擲了異常,catch程式碼塊中的程式碼就會被執行
            // e是一個區域性變數,用來指向Error物件或者其他丟擲的物件
            console.log(e)
        }
        finally {
            // 無論try中程式碼是否有異常丟擲(甚至是try程式碼塊中有return語句),finally程式碼塊中始終會被執行
            console.log('finally')
        };
    </script>

</body>
</html>
while True: print('studying...')