Chapter 5 
                  
         
                   
                  Statements
      
      
      
        JavaScript
      supports a compact set of statements that you can use to incorporate a
      great deal of interactivity in Web pages. This chapter provides an
      overview of these statements. 
       
      
         This
        chapter contains the following sections, which provide a brief overview
        of each statement:
        
      
       Any
      expression is also a statement. See Chapter
      3, "Expressions and Operators," for complete information about
      statements.
       
      
         Use the
        semicolon (;) character to separate statements in JavaScript code.
        
        
      
      
         See the
        Core
        JavaScript Reference for details about the statements in this
        chapter.
        
      
      
        
        
           Block Statement
        
      
      
      
        A block
      statement is used to group statements. The block is delimited by a pair
      of curly brackets:
       
      
        
        {statement1 statement2 . . .statementn} 
        
        
      
      
        
        
           Conditional
        Statements
        
      
      
      
        A
      conditional statement is a set of commands that executes if a specified
      condition is true. JavaScript supports two conditional statements:
      if...else and
      switch. 
      
       
      
        
           if...else
           Statement
        
        
          Use the
        if statement
        to perform certain statements if a logical condition is true; use the
        optional else
        clause to perform other statements if the condition is false. An
        if statement
        looks as follows:
        
      
      
        if
        (condition) {
            statements1
         }
         [else {
            statements2
         } ] 
        
      
      
         The
        condition can be any JavaScript expression that evaluates to true or
        false. The statements to be executed can be any JavaScript statements,
        including further nested if statements. If you
        want to use more than one statement after an if or else statement, you must
        enclose the statements in curly braces, {}. 
        
      
      
         You should
        not use simple assignments in a conditional statement. For example, do
        not use the following code: 
        
      
      
        
        if(x = y)
         {
            /* do the right thing */
         } 
        
      
      
         If you
        need to use an assignment in a conditional statement, put additional
        parentheses around the assignment. For example, use if( (x = y) ).
        
        
      
      
         Do not
        confuse the primitive Boolean values true and false with the true and
        false values of the Boolean object. Any object whose value is not
        undefined, null, zero, NaN, or the empty string, including a Boolean
        object whose value is false, evaluates to true when passed to a
        conditional statement. For example: 
        
      
      
        var
        b = new Boolean(false);
         if (b) // this condition evaluates to true 
        
      
      
         
        Example. In the following example, the
        function checkData returns true if
        the number of characters in a Text object is three;
        otherwise, it displays an alert and returns false. 
        
        
      
      
        
        function checkData () {
            if (document.form1.threeChar.value.length == 3)
        {
               return true
            } else {
               alert("Enter exactly three
        characters. " +       
               document.form1.threeChar.value + "
        is not valid.")
               return false
            }
         } 
        
      
      
        
           switch Statement
        
        
          A
        switch
        statement allows a program to evaluate an expression and attempt to
        match the expression's value to a case label. If a match is found, the
        program executes the associated statement. A switch statement looks as
        follows:
        
      
      
        
        switch (expression){
            case label :
               statement;
               break;
            case label :
               statement;
               break;
            ...
            default : statement;
         } 
        
      
      
         The
        program first looks for a label matching the value of expression and
        then executes the associated statement. If no matching label is found,
        the program looks for the optional default statement, and if
        found, executes the associated statement. If no default statement is
        found, the program continues execution at the statement following the
        end of switch.
        
        
      
      
         The
        optional break
        statement associated with each case label ensures that the program
        breaks out of switch once the matched
        statement is executed and continues execution at the statement
        following switch. If break is omitted, the
        program continues execution at the next statement in the
              switch
              statement.
        
      
      
         
        Example. In the following example, if
        expr evaluates
        to "Bananas", the program matches the value with case "Bananas" and
        executes the associated statement. When break is encountered, the
        program terminates switch and executes the
        statement following switch. If
              break
              were omitted, the statement for case "Cherries" would also be
              executed. 
        
      
      
        
        switch (expr) {
            case "Oranges" :
               document.write("Oranges are $0.59
        a pound.<BR>");
               break;
            case "Apples" :
               document.write("Apples are $0.32 a
        pound.<BR>");
               break;
            case "Bananas" :
               document.write("Bananas are $0.48
        a pound.<BR>");
               break;
            case "Cherries" :
               document.write("Cherries are $3.00
        a pound.<BR>");
               break;
            default :
               document.write("Sorry, we are out
        of " + i + ".<BR>");
         } 
        
      
      
        
        document.write("Is there anything else you'd
        like?<BR>"); 
        
      
      
        
        
           Loop Statements
        
      
      
      
        A loop is a
      set of commands that executes repeatedly until a specified condition is
      met. JavaScript supports the for, do while, and
            while loop
            statements, as well as label (label is not itself a looping
            statement, but is frequently used with these statements). In
            addition, you can use the break and continue statements
            within loop statements.
       
      
         Another
        statement, for...in, executes
        statements repeatedly but is used for object manipulation. See
           Object Manipulation Statements. 
           
        
      
      
        
           for Statement
        
        
          A
        for loop
        repeats until a specified condition evaluates to false. The JavaScript
        for loop is
        similar to the Java and C for loop. A
              for
              statement looks as follows:
        
      
      
        for
        ([initialExpression]; [condition];
        [incrementExpression]) {
            statements
} 
        
      
      
         When a
        for loop
        executes, the following occurs:
        
      
      
        - 
          
        
- 
          
          The initializing expression initial-expression, if
          any, is executed. This expression usually initializes one or more
          loop counters, but the syntax allows an expression of any degree of
          complexity. This expression can also declare variables. 
          
           
          
            
           
- 
          
          The condition expression is
          evaluated. If the value of condition is true, the
          loop statements execute. If the value of condition is false, the
          for loop
          terminates. If the condition expression is
          omitted entirely, the condition is assumed to be true. 
          
           
          
            
           
- 
          
          The statements execute.
          
           
          
            
           
- 
          
          The update expression incrementExpression, if
          there is one, executes, and control returns to Step 2.
          
        
Example. The following function contains a
      for statement
      that counts the number of selected options in a scrolling list (a
      Select object
      that allows multiple selections). The for statement declares the
      variable i and
      initializes it to zero. It checks that i is less than the number
      of options in the Select object, performs the
      succeeding if
      statement, and increments i by one after each pass
      through the loop.
        
        <SCRIPT>
         function howMany(selectObject) {
            var numberSelected=0;
            for (var i=0; i < selectObject.options.length;
        i++) {
               if
        (selectObject.options[i].selected==true)
                  numberSelected++;
            }
            return numberSelected;
         } 
        
      
      
        
        </SCRIPT>
         <FORM NAME="selectForm">
         <P><B>Choose some music types, then click the button
        below:</B>
         <BR><SELECT NAME="musicTypes" MULTIPLE>
         <OPTION SELECTED> R&B
         <OPTION> Jazz
         <OPTION> Blues
         <OPTION> New Age
         <OPTION> Classical
         <OPTION> Opera
         </SELECT>
         <P><INPUT TYPE="button" VALUE="How many are selected?"
         onClick="alert ('Number of options selected: ' +
        howMany(document.selectForm.musicTypes))">
         </FORM> 
        
      
      
        
           do...while
           Statement
        
        
          The
        do...while
        statement repeats until a specified condition evaluates to false. A
        do...while
        statement looks as follows:
        
      
      
        do
        {
   
        statement
} while (condition
        ) 
        
        
      
      
         
              statement
              executes once before the condition is checked. If condition is true,
              the statement executes again. At the end of every execution, the
              condition is checked. When the condition is false, execution
              stops and control passes to the statement following do...while. 
              
        
      
      
         
        Example. In the following example, the
        do loop
        iterates at least once and reiterates until i is no longer less than 5.
        
        
      
      
        do
        {
            i+=1;
            document.write(i);
         } while (i<5); 
        
      
      
        
           while Statement
        
        
          A
        while
        statement executes its statements as long as a specified condition
        evaluates to true. A while statement looks as
        follows:
        
      
      
        
        while (condition) {
            statements
} 
        
      
      
         If the
        condition becomes false, the statements within the loop stop executing
        and control passes to the statement following the loop.
        
        
      
      
         The
        condition test occurs before the statements in the loop are executed.
        If the condition returns true, the statements are executed and the
        condition is tested again. If the condition returns false, execution
        stops and control is passed to the statement following
              while. 
              
        
      
      
         Example
        1. The following while loop iterates as
        long as n is
        less than three:
        
      
      
        n =
        0;
         x = 0;
         while( n < 3 ) {
            n ++;
            x += n;
         } 
        
      
      
         With each
        iteration, the loop increments n and adds that value to
        x. Therefore,
        x and
        n take on the
        following values:
        
      
      
        - 
          
        
- 
          
          After the first pass: n = 1 and
                x = 1 
                
           
          
            
           
- 
          
          After the second pass: n = 2 and
                x = 3 
                
           
          
            
           
- 
          
          After the third pass: n = 3 and
                x = 6 
                
          
        
After
      completing the third pass, the condition n < 3 is no longer true,
      so the loop terminates.
         Example
        2: infinite loop. Make sure the condition in a loop eventually
        becomes false; otherwise, the loop will never terminate. The statements
        in the following while loop execute
        forever because the condition never becomes false: 
        
        
      
      
        
        while (true) {
            alert("Hello, world") } 
        
      
      
        
           label Statement
        
        
          A label
        provides a statement with an identifier that lets you refer to it
        elsewhere in your program. For example, you can use a label to identify
        a loop, and then use the break or
              continue
              statements to indicate whether a program should interrupt the
              loop or continue its execution.
        
      
      
         The syntax
        of the label statement looks like the following:
        
      
      
        
        label :
            statement 
        
      
      
         The value
        of label may be any
        JavaScript identifier that is not a reserved word. The
              statement
              that you identify with a label may be any statement. 
              
        
      
      
         
        Example. In this example, the label
        markLoop
        identifies a while loop. 
        
        
      
      
        
        markLoop:
         while (theMark == true)
            doSomething();
         } 
        
      
      
        
           break Statement
        
        
          Use the
        break
        statement to terminate a loop, switch, or label
        statement.
        
      
      
        - 
          
        
- 
          
          When you use break without a label,
          it terminates the innermost enclosing while,
                do-while,
                for,
                or switch
                immediately and transfers control to the following statement. 
                
           
          
            
           
- 
          
          When you use break with a label, it
          terminates the specified labeled statement. 
          
        
The syntax
      of the break
      statement looks like this:
        1.
        break
         2. break label 
        
      
      
         The first
        form of the syntax terminates the innermost enclosing loop or
        switch; the
        second form of the syntax terminates the specified enclosing label
        statement.
        
      
      
         
        Example. The following example iterates
        through the elements in an array until it finds the index of an element
        whose value is theValue: 
        
        
      
      
        for
        (i = 0; i < a.length; i++) {
            if (a[i] = theValue)
               break;
         } 
        
      
      
        
           continue
           Statement
        
        
          The
        continue
        statement can be used to restart a while, do-while,
              for, or
              label
              statement.
        
      
      
        - 
          
        
- 
          
          When you use continue without a
          label, it terminates the current iteration of the innermost enclosing
          while,
          do-while or
          for
          statement and continues execution of the loop with the next
          iteration. In contrast to the break statement,
          continue
          does not terminate the execution of the loop entirely. In a
          while loop,
          it jumps back to the condition. In a for loop, it jumps to
          the increment-expression.
          
           
          
            
           
- 
          
          When you use continue with a label,
          it applies to the looping statement identified with that label.
          
          
        
The syntax
      of the continue
      statement looks like the following:
        1.
        continue
         2. continue label 
        
      
      
         Example
        1. The following example shows a while loop with a
        continue
        statement that executes when the value of i is three. Thus,
        n takes on the
        values one, three, seven, and twelve.
        
      
      
        i =
        0;
         n = 0;
         while (i < 5) {
            i++;
            if (i == 3)
               continue;
            n += i;
         } 
        
      
      
         Example
        2. A statement labeled checkiandj contains a
        statement labeled checkj. If
              continue
              is encountered, the program terminates the current iteration of
              checkj
              and begins the next iteration. Each time continue is
              encountered, checkj reiterates
              until its condition returns false. When
              false is
              returned, the remainder of the checkiandj
              statement is completed, and checkiandj
              reiterates until its condition returns false. When
              false is
              returned, the program continues at the statement following
              checkiandj. 
              
        
      
      
         If
        continue had a
        label of checkiandj, the program
        would continue at the top of the checkiandj statement.
        
        
      
      
        
        checkiandj :
            while (i<4) {
               document.write(i +
        "<BR>");
               i+=1;
               checkj :
                  while (j>4)
        {
                     document.write(j
        + "<BR>");
                     j-=1;
                     if
        ((j%2)==0)
                        continue
        checkj;
                     document.write(j
        + " is odd.<BR>");
                  }
               document.write("i = " + i +
        "<br>");
               document.write("j = " + j +
        "<br>");
            } 
        
      
      
        
        
           Object
        Manipulation Statements
        
      
      
      
        JavaScript
      uses the for...in and
            with
            statements to manipulate objects.
       
      
        
           for...in
           Statement
        
        
          The
        for...in
        statement iterates a specified variable over all the properties of an
        object. For each distinct property, JavaScript executes the specified
        statements. A for...in statement looks
        as follows:
        
      
      
        for
        (variable in object) {
            statements } 
        
      
      
         
        Example. The following function takes as
        its argument an object and the object's name. It then iterates over all
        the object's properties and returns a string that lists the property
        names and their values.
        
      
      
        
        function dump_props(obj, obj_name) {
            var result = "";
            for (var i in obj) {
               result += obj_name + "." + i + " =
        " + obj[i] + "<BR>"
            }
            result += "<HR>";
            return result;
         } 
        
      
      
         For an
        object car
        with properties make and
              model,
              result
              would be:
        
      
      
         
              car.make
              = Ford
         car.model = Mustang
        
      
      
        
           with Statement
        
        
          The
        with statement
        establishes the default object for a set of statements. JavaScript
        looks up any unqualified names within the set of statements to
        determine if the names are properties of the default object. If an
        unqualified name matches a property, then the property is used in the
        statement; otherwise, a local or global variable is used. 
        
        
      
      
         A
        with statement
        looks as follows:
        
      
      
        
        with (object){
            statements
} 
        
      
      
         
        Example. The following with statement specifies
        that the Math
        object is the default object. The statements following the
              with
              statement refer to the PI property and the
              cos and
              sin
              methods, without specifying an object. JavaScript assumes the
              Math
              object for these references.
        
      
      
        var
        a, x, y;;
         var r=10
         with (Math) {
            a = PI * r * r;
            x = r * cos(PI);
            y = r * sin(PI/2);
         } 
        
      
      
         Note:
        Using a with
        statement can significantly slow down your program.
        
        
      
      
        
        
           
        Comments
        
      
      
      
        Comments are
      author notations that explain what a script does. Comments are ignored by
      the interpreter. JavaScript supports Java and C++-style comments:
      
       
      
        - 
          
        
- 
          
          Comments on a single line are preceded by a
          double-slash (//).
           
          
            
           
- 
          
          Comments that span multiple lines are preceded
          by /* and followed by */:
          
        
Example. The following example shows two
      comments:
        //
        This is a single-line comment. 
        
      
      
        /*
        This is a multiple-line comment. It can be of any length, and
         you can put whatever you want here. */ 
        
      
      
        
        
          
        
        Exception Handling Statements
        
      
      
      
        You can
      throw exceptions using the throw statement and handle
      them using the try...catch statements.
      
       
      
         You also
        use the try...catch statement to
        handle Java exceptions. See "Handling Java
        Exceptions in JavaScript" on page 141 and "Handling JavaScript Exceptions in Java" on
        page 144 for information. 
        
      
      
        
           The throw
           Statement
        
        
          Use the
        throw
        statement to throw an exception. When you throw an exception, you
        specify an expression containing the value of the exception: 
        
        
      
      
        
        throw expression 
        
      
      
         The
        following code throws several exceptions. 
        
      
      
        
        throw "Error2";    // generates an
        exception with a string value
         throw
        42;          //
        generates an exception with the value 42
         throw true;        //
        generates an exception with the value true 
        
      
      
         You can
        specify an object when you throw an exception. You can then reference
        the object's properties in the catch block. The
        following example creates an object myUserException of type
        UserException
        and uses it in a throw statement.
        
        
      
      
        //
        Create an object type UserException
         function UserException (message) {
            this.message=message;
            this.name="UserException";
         }
         // Create an instance of the object type and throw it
         myUserException=new UserException("Value too high");
         throw myUserException; 
        
      
      
        
          
        The
        try...catch Statement
        
        
          The
        try...catch
        statement marks a block of statements to try, and specifies one or more
        responses should an exception be thrown. If an exception is thrown, the
        try...catch
        statement catches it.
        
      
      
         The
        try...catch
        statement consists of a try block, which contains
        one or more statements, and zero or more catch blocks, containing
        statements that specify what to do if an exception is thrown in the
        try block.
        That is, you want the try block to succeed, and
        if it does not succeed, you want control to pass to the
              catch
              block. If any statement within the try block (or in a
              function called from within the try block) throws
              an exception, control immediately shifts to the catch block. If no
              exception is thrown in the try block succeed,
              the catch block is
              skipped. The finally block
              executes after the try and catch blocks
              execute but before the statements following the try...catch
              statement.
        
      
      
         The
        following example uses a try...catch statement.
        The example calls a function that retrieves a month name from an array
        based on the value passed to the function. If the value does not
        correspond to a month number (1-12), an exception is thrown with the
        value "InvalidMonthNo" and the statements in the catch block set the
        monthName
        variable to "unknown".
        
      
      
        
        function getMonthName (mo) {
            mo=mo-1; // Adjust month number for array index
        (1=Jan, 12=Dec)
            var months=new
        Array("Jan","Feb","Mar","Apr","May","Jun","Jul",
               "Aug","Sep","Oct","Nov","Dec");
            if (months[mo] != null) {
               return months[mo]
            } else {
               throw "InvalidMonthNo"
            }
         } 
        
      
      
        try
        {
            // statements to try
            monthName=getMonthName(myMonth) // function could
        throw exception
         }
         catch (e) {
            monthName="unknown"
               logMyErrors(e) // pass exception
        object to error handler
         } 
        
      
      
          
        The catch Block
        
        
          You can
        use a single catch block to handle all
        exceptions that may be generated in the try block, or you can use
        separate catch
        blocks each of which handles a particular type of exception. 
        
        
      
      
          Single catch Block
        
          Use a
        single try...catch statement's
        catch block
        (recovery block) to execute error-handling code for any
        exceptions thrown in the try block. 
        
        
      
      
         A single
        catch block
        has the following syntax:
        
      
      
        
        catch (catchID) {
            statements
} 
        
      
      
         The
        catch block
        specifies an identifier (catchID in the preceding
        syntax) that holds the value specified by the throw statement; you can
        use this identifier to get information about the exception that was
        thrown. JavaScript creates this identifier when the catch block is entered;
        the identifier lasts only for the duration of the catch block; after the
        catch block
        finishes executing, the identifier is no longer available. 
        
        
      
      
         For
        example, the following code throws an exception. When the exception
        occurs, control transfers to the catch block. 
        
        
      
      
        try
        {
            throw "myException" // generates an exception
         }
         catch (e) {
            // statements to handle any exceptions
            logMyErrors(e) // pass exception object to error
        handler
         } 
        
      
      
        
      
      
          Multiple
           catch Blocks
        
          A single
        try statement
        can contain multiple conditional catch blocks, each of which handles a
        specific type of exception. In this case, the appropriate conditional
        catch block is
        entered only when the exception specified for that block is thrown. You
        can also include an optional catch-all catch block for all
        unspecified exceptions as the final catch block in the
        statement.
        
      
      
         For
        example, the following function invokes three other functions (declared
        elsewhere), which validate its arguments. If a validation function
        determines that the component that it is checking is invalid, it
        returns 0, causing the caller to throw a particular exception. 
        
        
      
      
        
        function getCustInfo(name, id, email)
         {
            var n, i, e; 
        
      
      
        
           if (!validate_name(name))
               throw "InvalidNameException"
            else
               n = name;
            if (!validate_id(id))
               throw "InvalidIdException"
            else
               i = id;
            if (!validate_email(email))
               throw "InvalidEmailException"
            else
               e = email;
            cust = (n + " " + i + " " + e);
            return (cust);
         } 
        
      
      
         The
        conditional catch blocks route control to the appropriate exception
        handler.
        
      
      
        try
        { 
        
      
      
        //
        function could throw three exceptions
            getCustInfo("Lee", 1234, "lee@netscape.com")
         } 
        
      
      
        
        catch (e if e == "InvalidNameException") {
         // call handler for invalid names
         bad_name_handler(e)
         } 
        
      
      
        
        catch (e if e == "InvalidIdException") {
         // call handler for invalid ids
         bad_id_handler(e)
         } 
        
      
      
        
        catch (e if e == "InvalidEmailException") {
         // call handler for invalid email addresses
         bad_email_handler(e)
         } 
        
      
      
        
        catch (e){
         // don't know what to do, but log it
         logError(e)
         } 
        
      
      
        
      
      
          
        The finally Block
        
        
          The
        finally block
        contains statements to execute after the try and catch blocks execute but
        before the statements following the try...catch statement.
        The finally
        block executes whether or not an exception is thrown. If an exception
        is thrown, the statements in the finally block execute
        even if no catch block handles the
        exception.
        
      
      
         You can
        use the finally block to make
        your script fail gracefully when an exception occurs; for example, you
        may need to release a resource that your script has tied up. The
        following example opens a file and then executes statements that use
        the file (server-side JavaScript allows you to access files). If an
        exception is thrown while the file is open, the finally block closes the
        file before the script fails.
        
      
      
        
        openMyFile();
         try {
            writeMyFile(theData)
         }
         finally {
            closeMyFile() // always close the resource
         } 
        
      
      
        
      
      
          Nesting try...catch
        Statements
        
        
          You can
        nest one or more try...catch statements.
        If an inner try...catch statement
        does not have a catch block, the
        enclosing try...catch statement's
        catch block is
        checked for a match.