4.3 运算符 4.3 运算符 运算符是一种特殊符号, 一般由1-3个字符组成,用于实现数据之间的运算、赋值和比较。运算符共分以下几种 : 4.3 运算符 4.3 运算符 运算符是一种特殊符号, 一般由1-3个字符组成,用于实现数据之间的运算、赋值和比较。运算符共分以下几种 : 算术运算符 赋值运算符 比较运算符 逻辑运算符 位运算符 4.3.1 算术运算符 JavaScript 中的算术运算符有以下一些。 +:加法运算符或正值运算符, 例如, x+5,+6。“+”也能实现多个字符串的相加,只要表达式中至少有一个字符串, “+” 就用于将字符串与其他的数据类型相连成一个新的字符串,例如:“x”+123 的结果是“x123”。 -: 减法运算符或负值运算符, 例如, 7-3,-8。
*:乘法运算符, 例如, 3*6。 /:除法运算符, 例如, 9/4, 如果不能整除, 结果就是实型, 保留小数部分。 %:求模运算符(算术中的求余), 例如, 5%2。 ++:将变量值加1后再将结果赋给这个变量。有两种用法, 即 ++X,X++ 。前者是变量在参与其他运算之前先将自己加1后, 再用新的值参与其他运算, 而后者是先用原值参与其他运算后, 再将自己加1。例如, b=++a 是 a 先自增, 即 a 的值加1后,才赋值给b; b=a++ 是先将 a 赋值给b后, a 再自增。 --:将变量值减1后,再将结果赋给这个变量, 与 ++ 的用法一样。
4.3.2 赋值运算符 赋值运算符的作用是将一个值赋给一个变量。最常用的赋值运算符是“=”。还可以由“=”赋值运算符和其他一些运算符组合产生一些新的赋值运算符, 例如, “+=”,“*=”等。 =:将一个值或表达式的结果赋给变量, 例如,x=3。 +=:将变量与所赋的值相加后的结果再赋给该变量, 例如, X+=3 等价于 X=X+3。 -=:将变量与所赋的值相减后的结果再赋给该变量, 例如, X-=3 等价于 X=X-3。 *=:将变量与所赋的值相乘后的结果再赋给该变量, 例如, X*=3 等价于X=X*3。 /=:将变量与所赋的值相除后的结果再赋给该变量, 例如,X/=3 等价于 X=X/3。 %=:将变量与所赋的值求模后的结果再赋给该变量, 例如, X%=3 等价于 X=X%3。
4.3.3 比较运算符 比较运算符的作用是比较两边的操作数,并根据比较结果返回一个布尔值(true 或false), 具体如下。 !=:当左边操作数不等于右边操作数时返回 true, 否则返回 false。例如 x=4;,则表达式 x<5 的返回结果是 true, 而表达式 x>5 的返回结果是 false。 注意,不要将比较运算符 “==”误写成 “=”, 如果你少写了一个 "=", 那就不是比较了, 整个语句变成了赋值语句。
逻辑运算符采用布尔值 true 或 false 作为操作数, 其返回值也是逻辑值, 具体如下 。 4.3.4 逻辑运算符 逻辑运算符采用布尔值 true 或 false 作为操作数, 其返回值也是逻辑值, 具体如下 。 &&:逻辑与, 当左右两边操作数都为 true 时 , 返回值为 true, 否则返因 false 。 ︱ ︱:逻辑或, 当左右两边操作数都为 false 时, 返回值为 false, 否则返回 true 。 !:逻辑非, 当操作数为 true 时, 返回值为 false, 否则返回true 。 4.3.5 位运算符 计算机是一种电子设备, 由复杂的数字和模拟电子元器件组合而成。数字电子元器件的一个最小单元只有带电和不带电两种状态, 其带电状态表示数值 1, 不带电状态表示数值 0。 多个这样的单元组合可以表示更多状态, 也就是可以表示更多的数据, 其中 ,每个单元分别表示数据中的一位, 被称之为 bit 位, 一个 bit 位中的数据只能是 0 或1。
︱:只有参加运算的两位都为 0, 运算的结果才为 0, 否则就为 1 。就是或运算。 例如, 3 个单元的组合可以具有 23=8 种状态, 它可以表示 8 个数值, 000 表示0, 001 表示 1, 010 表示 2, 011 表示 3, 依此类推 , 111 表示 7, 这种表示数据的方式就叫二进制。在实际应用中 , 总是将 8 个电子元器件单元组合起来使用 , 这样的组合就称之为一 个字节 (byte) , 一个字节可以表示 28=256 个数值 , 数值范值为 0~255。任何信息在计算机中都是以二进制的形式存在的,位运算用于对操作数中的每一个二进制位进行运算,包括位逻辑运算符和位移动运算符。 位逻辑运算符如下: &:只有参加运算的两位都为 1, 运算的结果才为 1, 否则就为 0 。就是与运算。 ︱:只有参加运算的两位都为 0, 运算的结果才为 0, 否则就为 1 。就是或运算。 ∧: 只有参加运算的两位不同, 运算的结果才为 1, 否则就为 0 。就是模二加运算。
位移动运算符如下: >>:将左边操作数在内存中的二进制数据右移右边操作数指定的位数,左边移空的部分补上左边操作数原来的最高位的二进制位值。如图4.2。 <<:将左边操作数在内存中的二进制数据左移右边操作数指定的位数,右边移空的部分补0。例如, a=Ox EOOOOOO1, a 在内存中的二进制状态为 1110,0000,0000,0000,0000,0000,0000,0001。 语句 a<<2 执行后的结果在内存中的二进制状态为 1000,0000,0000,0000,0000,0000,0000,0100 。 >>>:将左边操作数在内存中的二进制数据右移右边操作数指定的位数,左边移空的部分补0。 位运算符也可以与 “=”赋值运算符组合产生一些新的赋值运算符, 如:“<<="、“>>="、"&="、“∧="、"∣=" 等。
4.4 程序的流程控制 JavaScript 常用的程序流程有三种结构 : 顺序结构 选择结构 循环结构 4.4.1 顺序结构 顾名思义, 顺序结构就是程序从上到下按顺序一行一行执行的结构, 这是所有程序的最基本结构,一个程序中的大部分代码采用的都是顺序结构。 4.4.2 if 条件选择语旬 if 语句是使用最为普遍的条件选择语句, 每一种编程语言都有一种或多种形式的if语句, 在编程中总是避免不了要用到它。if 语句有多种形式的应用。
(1) 第一种应用格式 if ( 条件语句 ) { 执行语句 } 其中的条件语句可以是任何一种逻辑表达式。如果条件语句的返回结果为 true, 则程序先执行后面大括号对({ })中的执行语句,然后接着顺序执行它后面的其他代码。如果条件语句的返回结果为 false, 则程序跳过条件语句后面的执行语句, 直接去执行程序后面的其他代码。大括号的作用就是将多条语句组合成一个复合语句, 作为一个整体来处理。
如果大括号中只有一条语句, 这对大括号对 ({ })也可以被省略, 例如:if第1种用法.htm <script language="javascript"> var x=0; if (x==4) alert(“x==4"); </script> 上面的条件语句先判断x的值是否等于4,如果条件成立, 则弹出 "x==4"的对话框, 否则什么也不做。由于x的值等于0,所以 alert ("x==1"); 语句不会执行。为了让程序代码具有易读、易维护性,即使if从句部分只有一条语句, 也不要省略其中的大括号对, 这是一个良好的编程习惯。
如果用下面的语句 : var x; 定义了一个变量 x, 但没有对变量 x 赋值, x 的值为 undefined。在这种情况下, 可以使用 if (x ==null) 或 if (typeof (x) ==‘undefined’)比较语句来判断变量 x 的值是否为 undefined。是则返回 true, 否则返回 false。 要判断变量 x 的值是否为 undefined 或 null, 也可以简写成 if (!x), 例如,下面的程序代码检查到变量 x 没有被赋初值时,则对 x 进行赋值。 <script language="javascript"> if (!x) {x=55;alert("x = "+x);} </script> 举例见后面的网页文件“if第2-1种用法.htm”。
如果 x 未赋值,则弹出 'x==undefinde ! 未赋值。'对话框,否则将弹出’x=’+x对话杠。 (2) 第二种应用格式 if ( 条件语句 ) {执行语句块 1} else {执行语句块 2} 这种格式在 if 从句的后面添加了一个 else 从句。当if条件语句的返回结果为false时, 执行else后面部分的从句, 如:if第2-1种用法.htm <script language="javascript"> var x; if (!x) {alert('x==undefinde ! 未赋值。')} {alert(‘x =‘+x);} </script> 如果 x 未赋值,则弹出 'x==undefinde ! 未赋值。'对话框,否则将弹出’x=’+x对话杠。
<script language="javascript"> var x=-6; y=x>0?x:-x; alert(y) 对于 if...else...语句, 还有一种更简便的写法: 变量 = 布尔表达式 ? 语句 1 : 语句 2; 例如下面的程序代码:if第2-2种用法.htm <script language="javascript"> var x=-6; y=x>0?x:-x; alert(y) </script>可以简写成 : 这是一个求绝对值的语句, 如果 x 大于0, 就把x赋值给交量y, 如果x不大于0, 就把-x 赋值给前面的y。 这就是:如果问号“ ?” 前的表达式结果为真,则计算问号和冒号中间的表达式, 并把结果赋值给变量y; 否则将计算冒号后面的表达式,并把结果赋值给变量y。 这种写法的好处在于代码简洁,并且有一个返回值。
(3) 第三种应用格式 if ( 条件语句1)。 {执行语句块 1} else if ( 条件语句 2) {执行语句块 2} … else if ( 条件语句n ) {执行语句块n} else {执行语句块n +1} 这种格式用 else if 语句进行更多的条件判断 , 不同的条件对应不同的执行代码块。
例如:if第3种用法.htm <script language="javascript"> var x=0.159; if (x<1) alert('x<1'); else if (x>=1&&x<10) alert("x>=1且x<10"); else if (x>=10&&x<100) alert("x>=10且x<100"); else alert('x>=100'); </script> 程序首先判断 x 是否小于1, 如果是, 就执行 alert (“x < 1”) 语句;如果不是, 程序将继续判断x是否大于等于1且小于10, 如果是, 则执行 alert (“x>=l && x<lO”) 语句;如果还不是, 程序将判断x是否大于等于10且小于100, 如果是, 则执行 alert (“x>=10 &&x<100”) 语句;如果上面的条件都不满足,则执行else 从句。最后的 else 语句部分也可以 不要, 这样,当所有的条件都不满足时, 就什么也不做。
但是,在使用 if 嵌套语句时, 最好使用{ }来确定相互的层次关系。例如:if第4种用法.htm if 语句还可以嵌套使用, 当 if 语句 ( 或其他语句 ) 的从句部分的内容是另外一个完整 的 if 语句 ( 或其他语句 ) 时, 外层的 if 语句 ( 或其他语句 ) 的从句部分的{ }也可以省略。 但是,在使用 if 嵌套语句时, 最好使用{ }来确定相互的层次关系。例如:if第4种用法.htm <script language="javascript"> var x=1; var y=135; if (x==1) {if (y==1) alert('x==1,y==1'); else alert('x==1,y!=1');} alert('x!=1,y==1'); alert('x!=1,y!=1');} </script>
4.4.3 switch 选择语句 switch 语句用于将一个表达式的结果同多个值进行比较,并根据比较结果来选择执行语句,switch 语句的使用格式如下: switch ( 表达式 ) { case 取值 1: 语句块1 break; … case 取值 n: 语句块n default: 语句块 n+1 }
<script language="javascript"> var x=2; switch(x) {case 1: case 语句只是相当于定义了一个标记位置, 程序根据 switch 条件表达式的结果,直接跳转到第一个匹配的标记位置处, 开始顺序执行标记后面的所有程序代码, 包括后面的其他case语句下的代码, 直到碰到 break 语句或函数返回语句为止。default 语句是可选的,它匹配上面所有的 case 语句定义的值以外的其他值,也就是谁也不要的都归它。要将1~3 对应的星期几的英文单词打印出来, 程序代码如下:switch用法.htm <script language="javascript"> var x=2; switch(x) {case 1: alert('Monday'); break; case 2: alert ('Tuesday');
alert('Sorry, I do not know!');} </script> case 3: alert('Wednesday'); break; default: alert('Sorry, I do not know!');} </script> 程序运行结果是弹出一个内容为 “Tuesday” 的对话框。 如非刻意, 一定要记住在每个 case 语句后用 break 语句退出 switch 代码块。例如, 如果 alert (‘Tuesda’); 语句后面没有 break 语句, 程序运行的结果将是打开两个对话框, 两个对话框上面显示的内容分别是 Tuesday 和 Wednesday。
最后的匹配语句后有没有 break 语句, 效果都是一样的, 例如上面的 default 语句后就省略了 break 语句。 case 语句后面可以跟多个执行语句, 这些语句可以不用大括号括起来, 如果将多个语句用大括号括起来,当然也是可以的。 接着来思考一个问题:用同一段语句来处理多个 case 条件, 程序该如何编写呢 ? 示例代码如下: case 1: case 2: case 3: case 4: case 5: alert(‘working day’); break; default: alert (‘off day’); 对于上面这种应用, 不用死记硬背, 要从原理上去思考。还记得前面讲的 "switch 条件一旦碰到第一个 case 匹配,如果没有 break 语句 , 就会继续执行后面的所有程序代码,包括后面的其他 case 语句下的代码 " 这个原理吗 ?
4.4.4 while 循环语句 while 语句是循环语句,也是条件判断语句。while 语句的语法结构如下所示: while ( 条件表达式语句 ) { 执行语句块 } 当条件表达式的返回值为 true 时, 则执行{ }中的语句块,当执行完{ } 中的语句块后,再次检测条件表达式的返回值, 如果返回值还为 true, 则重复执行{ }中的语句块,如此往复, 直到返回值为 false 时, 结束整个循环过程, 接着往下执行 while 代码段后面的程序代码。
<script language="javascript"> var x=1; while(x<3) { 例如,while用法.htm <script language="javascript"> var x=1; while(x<3) { alert('x='+x); x++; } 程序运行的结果是打开两个对话框,显示的内容分别是,x=l 和 x=2, 当 x 等于 3 时, 循环结束。注意 while 表达式的括号后一定不要加 “;“。 例如 : while (x<3) ; 这样, 一条空语句被作为 while 从句, 而大括号中的代码不再是 while 语句的一部分, while 语句将进入无限循环。
4.4.5 do while 语旬 do while 语句的语法结构如下所示 : do { 执行语句块 } while ( 条件表达式语句 ) ; do while 语句的功能与 while 语句差不多, 只不过它是在执行完第一次循环之后才检测条件表达式的值, 这意味着包含在大括号中的代码块至少要被执行一次。另外, do while 语句结尾处的 while 条件语句的括号后有一个分号 (;) 。
下面的例子代码中, while 语句和 do while 语句比较条件一开始就都不成立, while 循 环里面的代码块没有机会被执行, 但 do while 循环中的代码块还是能够执行一次。 var x=3; while (x==0) { alert ("okl") ; x++; } var y=3; do alert ("ok2") ; y++; } while (y==0) ;
<script language="javascript"> var output=""; 4.4.6 for 循环语句 for 循环语句的基本使用格式如下 : for ( 初始化表达式 ; 循环条件表达式 ; 循环后的操作表达式 ) { 执行语句块 } 下面是使用 for 循环语句的例子:for用法.htm <script language="javascript"> var output=""; for (var x=1;x<10;x++) output=output+'x='+x; alert(output); </script>
for 后面的小括号中的内容被 “;” 分隔成三部分 , 其中第一部分 x=1 是给 x 赋 一个初值 , 只在刚进入 for 语句时执行一次; 第二部分 x<10 是一个条件判断语句, 条件满足就进入 for 循环, 循环体中的代码执行完后又会回来执行这一条件判断语句, 直到条件 不成立时结束循环;第三部分 x++ 是对变量 x 的操作, 在每次循环体代码执行完 , 即将进入下一轮条件判断前执行。
for 语句还可以用下面的特殊语法格式 : for (;;) { … } 这是一个无限循环语句 , 需要使用 break 语句跳出循环 , 读者在以后的编程中可能会 遇到 , 例如 , 前面使用 for 循环的程序代码 , 还可以修改成下面的情况 : var x=1; for (; ; ) if (x<10) break; x++; 使用 while (true) 语句 , 也能实现无限循环 , 格式如下 : while (true) 在 JavaScript 中 , 还有一种 foru'in 循环语句。读者需要先对 JavaScript 的对象有一个 基本的了解 , 才能够理解 foru'in 循环语句的作用 , 因此 , 我们将 foru'in 循环语句放在本 章后面讲解。
4.4.7 break 与 continue 语句 只有循环条件表达式的值为 false 时, 循环语句才能结束循环, 如果想提前中断循环, 可以在循环体语句块中添加 break 语句。也可以在循环体语句块中添加 continue 语句 , 跳 过本次循环要执行的剩余语句 , 然后开始下一次循环。 (1) break 语句 break 语句可以中止循环体中的执行语句和 switch 语句。一个无标号的 break 语句会把 控制传给当前循环 ( while 、 do 、 for 或 switch) 的下一条语句。如果break 语句有标号, 控制会被传递 给当前方法中的带有这一标号的循环语句 , 例如 :
st :while (true) { while (true) break st; } 执行完 break st; 语句后 , 程序会跳出外面的 while 循环 , 如果不使用 st 标号 , 程序只会 跳出里面的 while 循环。
<script language="javascript"> (2) continue 语句 continue 语句只能出现在循环语句(while、do、for) 的循环体语句块中, 无标号的continm语句的作用是跳过当前循环的剩余语句, 接着执行下一次循环。 下面是一个打印1-10之间的所有奇数的例子程序, 当i是偶数时就跳过本次循环后的代码, 直接执行for 语句中的第三部分, 然后进入下一次循环的比较,若是奇数就打印出来。 Continue用法.htm <script language="javascript"> var output=""; for (var x=1;x<10;x++) {if (x%2==0) continue; output=output+'x='+x+';';} alert(output); </script>