本文共 13686 字,大约阅读时间需要 45 分钟。
判定赋予了程序智能。不使用它你就不能写出一个好的程序,不管你是创建游戏、校验密码、根据用户前面的做出的选择给予用户一组选择,还是一些其他的情况。 判定是以条件语句为基础的,条件语句是一种值或真或假的简单语句。这就是基本数据类型中的布尔(Boolean)数据类型该应用的地方了。循环是进行判定的另一个重要工具,例如,可以使你从头到尾地循环用户的输入或循环一个数组,并对应的进行决策。 l 数据比较运算符:比较操作数并返回布尔(Boolean)值。 n 警告: 小心这个 == 相等运算符:它太容易了,以至于在一个脚本中常由于会被误用为赋值运算符:=,而产生许多错误。 这些运算符都使用于字符串数据类型和数值类型,并且是区分大小写的: <script type="text/javascript"> document.write( "Apple" == "Apple" ) document.write( "<br />" ); document.write( "Apple" < "Banana" ) document.write( "<br />" ); document.write( "apple" < "Banana" ) 当计算一个字符串比较的表达式时,JavaScript解释器会依次比较两个字符串中每个字符的ASCII码—每个字符串的第一个字符,然后是第二个字符,依次类推。大写的A在ASCII中表示65,B 表示 66, C
表示 67 ,依次类推。 计算这个表达式 "Apple" < "Banana" ,JavaScript 解释器使用每个字符中的第一个字符的ASCII码来进行比较: 65 < 66 , 因此 A 排在前面,这个比较是真值。当检验这个表达式 "apple" < "Banana" 的时候,JavaScript解释器做了同样的事情;然而,小写字母 a 的ASCII码是97,因此这个表达式 "a" < "B" 转变为97 < 66,它的值是假。你可以使用 < 、 <=、>、 >= 运算符来进行字母顺序的比较。如果你需要确保所有的字母都是同样的大写或小写,你可以使用String对象的 toUpperCase() 和toLowerCase()方法。比较运算符和数字运算符是一样的,都可以使用变量。如果我们想按字母顺序比较apple和Banana ,我们可以这样做: <script type="text/javascript"> string1 = string1.toLowerCase( ); string2 = string2.toLowerCase( ); document.write( string1 < string2 ) 可是在你使用等号运算符比较String对象的时候,有一些细节需要注意。试一下这个: <script type="text/javascript"> var string1 = new String( "Apple" ); var string2 = new String( "Apple" ); document.write( string1 == string2 ) 你会得到一个返回false值。事实上,我们在上面比较的是两个字符串对象,而不是两个基本类型的字符串包含的字符,返回的false结果业表明,即使两个字符串对象持有相同的字母,它们也不是同一个对象。 如果你确实需要比较两个对象持有的字符串,那么你可以使用 valueOf() 方法来对数据值进行比较: <script type="text/javascript"> var string1 = new String( "Apple" ); var string2 = new String( "Apple" ); document.write( string1.valueOf() == string2.valueOf() ); 有时候你会需要把多个比较放到一个条件组中。你也许想检查用户输入的信息是否有意义,或者根据用户前面的回答,限制他们可以选择的数据项。你可以使用表 2-4 中的逻辑运算符来完成这样的功能。 表 2-4 。 JavaScript 中的逻辑运算符 | | | |
| | | 123 == 234 && 123 < 20 (false) 123 == 234 && 123 == 123 (false) 123 == 123 && 234 < 900 (true) |
| | | 123 == 234 || 123 < 20 (false) 123 == 234 || 123 == 123 (true) 123 == 123 || 234 < 900 (true) |
| | | |
一旦求出了数据的值,我们需要能够根据这个输出结果进行判定选择。这正是条件语句和循环语句可以发挥作用的地方。你会发现这章中我们学习的运算符会经常被用到一个条件语句或循环语句中。 if...else 结构被用来测试条件,格式如下: // Execute code in here if condition is true // Execute code in here if condition is false // After if/else code execution resumes here 如果这个条件测试为真,紧跟if
后面的大括号中的代码就会被执行,但如果它不为真则不会执行。你也可以使用else
语句,创建在if
条件不被满足的情况下应该执行的代码块。 我们来改进一下在这一章的前面建立的货币转换程序,创建一个循环来处理用户的非数值输入: <script type="text/javascript"> var euroToDollarRate = 0.872; // Try to convert the input into a number var eurosToConvert = Number( prompt( "How many Euros do you wish to convert", "" ) ); // If the user hasn't entered a number, then NaN if ( isNaN( eurosToConvert ) ) { // Ask the user to enter a value in numerals document.write( "Please enter the number in numerals" ); // If NaN is not returned, then we can use the input // and do the conversion as before var dollars = eurosToConvert * euroToDollarRate; document.write( eurosToConvert + " euros is " + 这个if
语句使用了isNaN
()函数,它会返回true
,如果变量 eurosToConvert 中的值不是一个数字 。 n 注解: 记住剂可能地使错误信息友好并且有用。良好的错误信息可以明了的告知用户他们该做什么,这样可以使他们更有耐心的使用程序。 我们使用逻辑运算符和嵌套的if语句,可以创建更夫杂的条件: <script type="text/javascript"> // Ask the user for a number and try to convert the var userNumber = Number( prompt( "Enter a number between // If the value of userNumber is NaN, ask the user if ( isNaN( userNumber ) ) { document.write( "Please ensure a valid number is // If the value is a number but over 10, ask the if ( userNumber > 10 || userNumber < 1 ) { document.write( "The number you entered is not // Otherwise the number is between 1 and 10 so document.write( "The number you entered was " + userNumber ); 我们知道这个数只要是一个数字并且小于10
就可以。 注解: 注意这段代码的布局。我们对if与else语句以及代码块使用了缩进,所以阅读和理解代码块是从哪里开始和结束的非常容易。使你的代码尽可能得简单明了是非常重要的。 <script type="text/javascript"> // Ask for a number using the prompt() function and try to make it a number var userNumber = Number(prompt("Enter a number between 1 and 10","")); // If the value of userNumber is NaN, ask the user to try again document.write("Please ensure a valid number is entered"); // If the value is a number but over 10, ask the user to try again if (userNumber > 10 || userNumber < 1) { document.write("The number you entered is not between 1 and 10"); // Otherwise the number is between 1 and 10, so write to the screen document.write("The number you entered was " + userNumber); 它不是不能阅读,但是即使在这个简短的脚本中,也很难分辨出哪个代码块属于if
和else
语句。在更长的代码中,不一致或不合理的缩进使代码很难读懂,它反过来会留给你更多的错误需要修正且使你的工作不必要地更困难。 你也可以在另一个以if
语句开始的else
语句的地方使用else if
语句, 像这样: <script type="text/javascript">
var userNumber = Number( prompt( "Enter a number between
if ( isNaN( userNumber ) ){
document.write( "Please ensure a valid number is
} else if ( userNumber > 10 || userNumber < 1 ) {
document.write( "The number you entered is not
document.write( "The number you entered was " +
这段代码和前面的代码段完成同样的事情,但是使用了一个else if
语句代替一个嵌套的if
语句,并且代码少了两行。 在我们继续之前需要注意一件事情:你可以使用break
语句来中断一个条件语句或循环。它简单地中断了代码块的运行并且使进程调到下一语句。我们会在下一个例子中使用到它。 只要你喜欢,你可以使用许多的if
、else
和else ifs
,尽管你使用太多的话会使你的代码十分复杂。如果在一个代码块中检查一个值有许多可能的条件,那么我们接下来会看到的switch
语句将非常的有用。 Switch 语句允许我们根据一个变量或表达式的值来在多个代码段之间进行“转换”。下面是一个switch语句的概要格式: // Code to execute if expression == someValue;
// Code to execute if expression == someOtherValue;
// Code to execute if expression == yetAnotherValue;
// Code to execute if no values matched
JavaScript
计算switch (expression)
的值,然后把它与每个case
进行比较。只要发现了一个匹配的项,代码就会在那个位置开始执行,并继续遍历执行所有的case
语句直到发现了一个break
语句。如果没有一个case
语句匹配,包含一个默认的情况常常非常的有用。这对于尽快找出错误发生的地方是个非常有用的工具,例如,我们期望一种情况被满足,但是一个程序缺陷却阻止了了它而没有发生。 case 的值可以是任何的数据类型,例如数字或字符串。我们可以根据自己需要选择一个或多个case语句。让我们来看一个简单的例子: <script type="text/javascript"> // Store user entered number between 1 and 4 in userNumber var userNumber = Number( prompt( "Enter a number between 1 and 4", "" ) ); // If userNumber is 1, write out and carry on // executing after case statement document.write( "Number 1" ); document.write( "Number 2" ); document.write( "Number 3" ); document.write( "Number 4" ); document.write( "Please enter a numeric value between // Code continues executing here 试一下。你只会得到自己刚输入的数字或者这个句子“Please enter a numeric value between 1 and 4.” 这个例子也阐明了break语句的重要性。如果我们在每个case语句后不包括break,那么这个代码块中的代码会继续执行直到最后switch的结束。试一下去掉所有的break然后输入2。匹配项后的所有代码都会执行,并给你这样一个输出结果: Number 2Number 3Number 4Please enter a numeric value between 1 and 4 你可以在switch语句中使用任何合法的表达式,例如一个计算: switch( userNumber * 100 + someOtherVariable ) 在这一节中,我们会学习如何重复一个代码块只要一组条件为真。举个例子,我们可能需要循环一遍HTML
表单中的每个输入或者循环遍历一个数组中的每个元素 for 循环被设计用来循环一个代码块许多次,格式如下: for( initial-condition; loop-condition; alter-condition ) { // Code to be repeatedly executed // After loop completes, execution of code continues here 和条件语句类似,关键字for后紧跟着括号。这次,括号中包含由分号分割的三部分。 第一部分初始化一个变量,它被用来当作保存循环次数的计数器。第二部分检查条件。只要这个条件为真,循环就会继续运行。最后一个部分增加或减少这个在第一部分中创建的计数,在每遍循环之后(事实上你会发现这个之后在编程中很重要)。 例如,看一下这个循环,只要loopCounter小于等于10,它就会继续运行: for( loopCounter = 1; loopCounter <= 10; loopCounter++ ) 只要循环条件为真,循环就会继续执行——正如只要 loopCounter 小于或等于。一旦它达到了11,这个循环就会终止并且代码的执行会从loop的结束括号后面的下一个语句开始。 让我们来看一个例子,它使用for循环来遍历一个数组。我们会使用一个for循环来遍历一个叫做 theBeatle 的数组,它使用一个叫loopCounter 的变量。当loopConter的值小于数组的长度时,循环就会继续执行: <script type="text/javascript"> var theBeatles = new Array( "John", "Paul", "George", for ( var loopCounter = 0; loopCounter < theBeatles.length; loopCounter++ ) { document.write( theBeatles[loopCounter] + "<br>" ); 这个例子可以运行因为我们使用了一个从零开始计数的数组,在它内面数据项按顺序被添加到索引上。如果我们使用关键字按如下的方式来保存数据项,那么这个循环就不会执行了: theBeatles["Drummer"] = "Ringo"; 在前面我们讲述数组的时候,我强调了Array对象有一个知道数组长度的属性(有多少元素)。当循环遍历数组的时候,如前面的例子,我们使用了数组的名后跟一个点和length作为条件。它阻止了循环数到数组的长度以外去,这样会造成一个“越界”的错误。 JavaScript 也支持 for..in 循环(尽管IE从IE5才开始支持它,但它从NN2就开始到处被用了)。没有使用一个计数器, for...in 循环使用一个访问数组的变量来遍历数组中的每个元素: <script type="text/javascript"> // Initialize theBeatles array and store in a variable var theBeatles = new Array( ); // Set the values using keys rather than numbers theBeatles["Drummer"] = "Ringo"; theBeatles["SingerRhythmGuitar"] = "John"; theBeatles["SingerBassGuitar"] = "Paul"; theBeatles["SingerLeadGuitar"] = "George"; // Write out each indexKey and the value for that // indexKey from the array for ( indexKey in theBeatles ) { document.write( "indexKey is " + indexKey + "<br>" ); document.write( "item value is " + theBeatles[indexKey] + "<br><br>" ); 在循环的每一遍中,关键字indexKey会与数组中按照同样的顺序使用关键字取出的值一起输出: indexKey is SingerRhythmGuitar indexKey is SingerBassGuitar indexKey is SingerLeadGuitar 2.1.4.2. 依据一个条件判定重复执行动作脚本: while 循环 目前我们所接触的循环都是从脚本自身的内部获取停止循环的指令。可能存在多次这样的情况,你想让用户决定循环应该何时停止,或者当一个用户决定的条件被满足的时候停止循环。循环 while 和 do...while 正是设计被用来解决这类问题的。 while ( some condition true ) { 括号里的条件可以是你在一个if语句当中可能会使用到的所有。我们按如下的方式来使用代码,它允许用户输入数字并且在输入数字99后停止输入的程序。 <script type="text/javascript"> var userNumbers = new Array( ); // Loop for as long as the user doesn't input 99 while ( userInput != 99 ) { userInput = prompt( "Enter a number, or 99 to exit", userNumbers[arrayIndex] = userInput; message += 'You entered the following:\n'; for ( var i = 0; i < arrayIndex-1; i++ ) { message += userNumbers[i] + '\n'; total += Number( userNumbers[i] ); message += 'Total: ' + total + '\n'; 在这里while循环的条件是userInput不等于99,所以只要这个条件为真,循环就会继续。当用户输入99并且条件被检查的时候,它会计算得到假值并且循环会终止。注意用户输入99后,循环不会立即终止,只有当条件在循环的另一遍开始处被再次检查时,循环才会终止。 在while和 do...while 循环之间,有一个比较小但非常明显的不同之处:while循环在代码执行前检查条件,并且只有在条件为真的情况下才会执行代码块。而 do...while 在检查条件之前执行代码块,如果条件为真会执行另一遍循环。简而言之, do...while 循环在你知道你希望循环体中的代码在条件检查前至少会被执行一次的情况下是有用的。我们可以如下所示,使用一个do...while循环来写一个我们前面的例子: <script type="text/javascript"> var userNumbers = new Array( ); // Declare the userInput but don't initialize it userInput = prompt( "Enter a number, or 99 to exit", userNumbers[arrayIndex] = userInput; } while ( userInput != 99 ) message+='You entered the following:\n'; for ( var i = 0; i < arrayIndex-1; i++ ) { message += userNumbers[i] + '\n'; total += Number( userNumbers[i] ); message += 'Total: ' + total + '\n'; 我们不需要初始化userInput,因为循环中的代码在第一次检验它之前已经为它设置了一个值。 2.1.4.3. 继续循环( Continuing the Loop ) 你已经看到了, break 语句只要用于只要某个特定的事件发生就跳出任一类型的循环。这个 continue 关键字的工作原理和 break 类似,可以用来停止循环的执行。可是, continue 语句不是直接的跳出循环,而是在下一次循环遍历中使代码重新开始执行。 让我们首先改变一下前面的例子,使用 break 来达到这样的一种效果,如果用户没有输入一个数字而是输入了其他的,那么这个输入的值不会被记录并且循环会终止。 <script type="text/javascript"> var userNumbers = new Array( ); userInput = Number( prompt( "Enter a number, or 99 // Check that user input is a valid number, // and if not, break with error msg if ( isNaN( userInput ) ) { document.write( "Invalid data entered: please enter a number between 0 and 99 in numerals" ); // If break has been activated, code will continue from here userNumbers[arrayIndex] = userInput; } while ( userInput != 99 ) // Next statement after loop 现在我们再把它改变一下,使用continue语句,可以不让它跳出循环,而是忽略用户的输入并保持循环。 <script type="text/javascript"> var userNumbers = new Array( ); userInput = prompt( "Enter a number, or 99 to exit", if ( isNaN( userInput ) ) { document.write( "Invalid data entered: please enter a number between 0 and 99 in numerals " ); userNumbers[arrayIndex] = userInput; } while ( userInput != 99 ) // Next statement after loop break 语句已被continue给替换了,因此在循环中的代码不会被执行了,但是while语句中的条件会被再次执行。如果条件为真,循环的另一个遍历就会被触发执行;否则这个循环就结束了。 l 如果你想重复一个动作一定的次数,那么使用for循环。 l 当你想一个动作被重复执行直到某个条件被满足的时候,使用while循环。 l 如果你想保证这个动作至少被执行一次,那么使用 do...while 循环。 本文转自 牛海彬 51CTO博客,原文链接:http://blog.51cto.com/newhappy/76824,如需转载请自行联系原作者