JavaScript+jQuery前端开发基础教程(微课版)
上QQ阅读APP看书,第一时间看更新

2.2 运算符与表达式

运算符用于完成运算,参与运算的数称为操作数。由操作数和运算符组成的式子称为表达式。JavaScript中的运算可分为算术运算、字符串运算、关系运算、逻辑运算、位运算和赋值运算。

运算符

2.2.1 算术运算符

算术运算符用于执行加、减、乘和除等算术运算。表2-2列出了JavaScript中的算术运算符。

表2-2 JavaScript中的算术运算符

只使用算术运算符构成的表达式称为算术表达式。

【例2-5】 使用算数运算符。源文件:02\test2-5.html。

…
<body>
    <script>
        x = 5
        y = ++x                             //等价于x=x+1;y=x
        document.write("执行<br>x = 5<br>y = ++x")
        document.write("<br>x = " + x)
        document.write("<br>y = " + y)
        z = x++                             //等价于y=x;x=x+1
        document.write("<br>执行<br>z = x++")
        document.write("<br>x = " + x)
        document.write("<br>z = " + z)
        a = --x                             //等价于x=x-1; a=x
        document.write("<br>执行<br>a = --x")
        document.write("<br>x = " + x)
        document.write("<br>a = " + a)
        b = x--                             //等价于b=x; x=x-1
        document.write("<br>执行<br>b = x--")
        document.write("<br>x = " + x)
        document.write("<br>b = " + b)
        document.write("<br>5 % 2 = " + (5 % 2))
        document.write("<br>5 % -2 = " + (5 % -2))
        document.write("<br>-5 % 2 = " + (-5 % 2))
        document.write("<br>-5 % -2 = " + (-5 % -2))
        document.write("<br>5 % 2.4 = " + (5 % 2.4))
    </script>
</body>
</html>

浏览器中的输出结果如图2-9所示。

图2-9 使用算术运算符的输出结果

2.2.2 字符串运算符

可使用加号(+)将两个字符串连接成一个字符串。例如:

x="I like " + "JavaScript"  //x中的值为"I like JavaScript"

加号既可表示加法,也可表示字符串连接,所以在使用时应注意。例如:

x=2+3+"abc"

在该语句中,按照从左到右的顺序,先计算2+3,再计算5+"abc",结果为"5abc"。

x="abc"+2+3

在该语句中,按照从左到右的顺序,先计算"abc"+2,再计算"abc2"+3,结果为"abc23"。

所以,当加号两侧都是数值时执行加法运算。如果有一个操作数为字符串,加号执行字符串连接。

【例2-6】 使用字符串运算符。源文件:02\test2-6.html。

…
<body>
    <script>
        x = "I like " + "JavaScript"
        document.write('"I like " + "JavaScript" ')
        document.write(" 结果为:" + x)
        x = 2 + 3 + "abc"
        document.write('<br>2 + 3 + "abc" ')
        document.write(" 结果为:" + x)
        x = "abc" + 2 + 3
        document.write('<br>"abc" + 2 + 3 ')
        document.write(" 结果为:" + x)
    </script>
</body>
</html>

浏览器中的输出结果如图2-10所示。

图2-10 使用字符串运算符的输出结果

2.2.3 关系运算符

关系运算符用于比较操作数的大小关系,运算结果为布尔值true或false。表2-3列出了JavaScript中的关系运算符。

表2-3 JavaScript中的关系运算符

由算术运算符和关系运算符(至少包含关系运算符)构成的表达式称为关系表达式。

相等运算符用于测试两个表达式的值是否相等。例如,3==5结果为false。一种特殊情况是,字符串和数值会被认为相等。例如,"5"==5结果为true。

如果使用绝对相等运算符,只有在两个数的数据类型和值都相同时结果才为true。例如,"5"===5结果为false。

关系运算符也可用于字符串比较。当两个字符串进行比较时,JavaScript首先比较两个字符串的第1个字符的ASCII码。若ASCII码相同,则继续比较下一个字符,否则根据ASCII码大小给出两个字符串的大小。若两个字符串的字符完全相同,则两个字符串相等。若一个字符串中的字符已经比较完,则另一个还有未比较字符的字符串更大。

【例2-7】 使用关系运算符。源文件:02\test2-7.html。

…
<body>
    <script>
        var x = 5, y = 3
        document.write('x = 5 , y = 3')
        document.write("<br>x < y 结果为:" + (x < y))
        document.write("<br>x > y 结果为:" + (x > y))
        document.write("<br>x <= y 结果为:" + (x <= y))
        document.write("<br>x >= y 结果为:" + (x >= y))
        document.write("<br>x == 5 结果为:" + (x == 5)
        document.write('<br>x == "5" 结果为:' + (x == "5"))
        document.write("<br>x === 5 结果为:" + (x === 5))
        document.write('<br>x === "5" 结果为:' + (x === "5"))
        document.write('<br>x != "5" 结果为:' + (x != "5")
        document.write('<br>x !== "5" 结果为:' + (x !== "5"))
        var x = "abc", y = "cba"
        document.write('<br>x = "abc" , y = "cba"')
        document.write("<br>x < y 结果为:" + (x < y))
        document.write("<br>x > y 结果为:" + (x > y))
        document.write("<br>x <= y 结果为:" + (x <= y))
        document.write("<br>x >= y 结果为:" + (x >= y))
        document.write("<br>x == y 结果为:" + (x == y))
        document.write("<br>x > 'ab' 结果为:" + (x > 'ab'))
    </script>
</body>
</html>

浏览器中的输出结果如图2-11所示。

图2-11 使用关系运算符的输出结果

2.2.4 逻辑运算符

逻辑运算符用于对布尔型值执行运算。表2-4列出了JavaScript中的逻辑运算符。

表2-4 JavaScript中的逻辑运算符

【例2-8】 使用逻辑运算符。源文件:02\test2-8.html。

…
<body>
    <script>
        / **
         * 闰年的判断条件为能被400整除,或者能被4整除但不能被100整除
         * 判断闰年的逻辑表达式为( x % 4 == 0 && x % 100 != 0)|| x % 400 == 0
         * /
        var x=1900
        document.write('1900年是闰年?')
        document.write((x % 4 == 0 && x % 100 != 0)|| x % 400 == 0 )
        x = 2000
        document.write('<br>2000年是闰年?')
        document.write((x % 4 == 0 && x % 100 != 0)|| x % 400 == 0 )
        x = 2002
        document.write('<br>2002年是闰年?')
        document.write((x % 4 == 0 && x % 100 != 0) || x % 400 == 0)
        x = 2004
        document.write('<br>2004年是闰年?')
        document.write((x % 4 == 0 && x % 100 != 0) || x % 400 == 0)
    </script>
</body>
</html>

浏览器中的输出结果如图2-12所示。

图2-12 使用逻辑运算符的输出结果

2.2.5 位运算符

位运算符用于对操作数按二进制位执行运算。表2-5列出了JavaScript中的位运算符。

表2-5 JavaScript位运算符

【例2-9】 使用位运算符。源文件:02\test2-9.html。

…
<body>
    <script>
        document.write('<br>~5 结果为:' + (~5))
        document.write('<br>5 & -6 结果为:' + (5 & -6))
        document.write('<br>5 | -6 结果为:' + (5 | -6))
        document.write('<br>5 << 2 结果为:' + (5 << 2))
        document.write('<br>-5 >> 2 结果为:' + (-5 >> 2))
        document.write('<br>-5 >>> 2 结果为:' + (-5 >>> 2))
    </script>
</body>
</html>

浏览器中的输出结果如图2-13所示。

图2-13 使用位运算符的输出结果

2.2.6 赋值运算符

“=”是JavaScript中的赋值运算符号,用于将其右侧表达式的值赋给左边的变量。例如:

x=5;
y=x*x+2;

赋值运算符可以和算术运算符以及位运算符组成复合赋值运算符,包括*=、/=、%=、+=、-=、<<=、>>=、>>>=、&=、|=和^=。复合赋值运算符首先计算变量和右侧表达式,然后将结果赋给变量。例如:

x+=5;    //等价于x=x+5

赋值运算表达式可出现在任何表达式出现的位置。例如:

x=(y=5)+3;            //等价于y=5;x=y+3;

【例2-10】 使用赋值运算符。源文件:02\test2-10.html。

…
<body>
    <script>
        var x = 5
        document.write('<br>x = 5')
        x += 10
        document.write('<br>执行 x += 10 后 x = '+ x)
        x -= 10
        document.write('<br>执行 x -= 10 后 x = '+ x)
        x *= 10
        document.write('<br>执行 x *= 10 后 x = '+ x)
        x /= 10
        document.write('<br>执行 x /= 10 后 x = '+ x)
        x %= 2
        document.write('<br>执行 x %= 2 后 x = '+ x)
    </script>
</body>
</html>

浏览器中的输出结果如图2-14所示。

图2-14 使用赋值运算符的输出结果

2.2.7 特殊运算符

JavaScript还提供了一些特殊的运算符,包括条件运算符、逗号运算符、数据类型运算符及new运算符等。

1. 条件运算符

条件运算符基本格式如下。

表达式1 ? 表达式2 : 表达式3

若表达式1的值为true,则条件运算结果为表达式2的值,否则为表达式3的值。例如,下面的代码输出两个数中的较大的值。

var a =2, b = 3, c
c = a > b ? a : b
document.write(c)  //输出3

2. 逗号运算符

逗号可以将多个表达式放到一起,整个表达式的值为其中最后一个表达式的值。例如:

c = (a = 5, b = 6, a + b)
document.write(c)  //输出11

3. 数据类型运算符

typeof运算符可返回操作数的数据类型,其基本格式如下。

typeof 操作数

例如:

a = 100
document.write(typeof a) //输出number

表2-6列出了各种数据的typeof数据类型名称。

表2-6 各种数据的typeof数据类型名称

4. new运算符

new用于创建对象实例。例如:

a = new Array()     //创建一个数组对象

【例2-11】 使用特殊运算符。源文件:02\test2-11.html。

…
<body>
    <script>
        var a =2, b = 3, c
        c = a > b ? a : b
        document.write("a =2, b = 3 较大值为" + c)
        c = (a = 5, b = 6, a + b)
        document.write("<br>表达式:(a = 5, b = 6, a + b) 的值为" + c)
        document.write("<br>100 的数据类型为:" + typeof 100)
        document.write("<br>1.5 的数据类型为:" + typeof 1.5)
        document.write("<br>'abc' 的数据类型为:" + typeof 'abc')
        document.write("<br>true 的数据类型为:" + typeof true)
        var x
        document.write("<br>"+ x + " 的数据类型为:" + typeof x)
        document.write("<br>nul 的数据类型为:" + typeof nul)
        a = new Array()     //创建一个数组对象
        document.write("<br>数组的数据类型为:" + typeof a)
        function test() { }  //定义一个函数
        document.write("<br>函数的数据类型为:" + typeof test)
    </script>
</body>
</html>

浏览器中的输出结果如图2-15所示。

图2-15 使用特殊运算符

2.2.8 运算符的优先级

JavaScript的运算符具有明确的优先级,优先级高的运算符将优先计算,同级的运算符按照从左到右的顺序依次计算。

表2-7按照从高低的顺序列出了JavaScript运算符的优先级。

表2-7 JavaScript运算符的优先级

例如,表达式x % 4 == 0 && x % 100 != 0 || x % 400 == 0按从左到右的顺序进行计算,过程如下。

(1)%优先级高于==,所以先计算x % 4,结果为0。表达式变为0 == 0 && x % 100 != 0 || x % 400 == 0。

(2)==优先级高于&&,所以先计算0==0,结果为true。表达式变为true && x % 100 != 0 || x % 400 == 0。

(3)&&、%和!=中,%优先级最高,所以先计算x % 100,结果为0。表达式变为true && 0 != 0 || x % 400 == 0。

(4)&&、!=和||中,!=优先级最高,所以先计算0 != 0,结果为false。表达式变为true && false || x % 400 == 0。

(5)&&比||优先级高,所以先计算true && false,结果为false。表达式变为false || x % 400 == 0。

(6)||、%和==中,%优先级最高,所以先计算x % 400,结果为300。表达式变为false || 300 == 0。

(7)||比==优先级低,所以先计算300 == 0,结果为false。表达式变为false || false。

(8)计算false || false,结果为false。

2.2.9 表达式中的数据类型转换

运算符要求操作数具有相应的数据类型。算术运算符要求操作数都是数值类型,字符串运算符要求操作数都是字符串,逻辑运算符要求操作数都是逻辑值。JavaScript在计算表达式时,会根据运算符自动转换不匹配的数据类型。

1. 其他类型转换为数值类型

其他类型转换为数值类型时,遵循下面的规则。

• 字符串:若内容为数字,则转换为对应数值,否则转换为NaN。

• 逻辑值:true转换为1,false转换为0。

• undefined:转换为NaN。

• null:转换为0。

• 其他对象:转换为NaN。

2. 其他类型转换为字符串类型

其他类型转换为字符串类型,遵循下面的规则。

• 数值:转换为对应数字的字符串。

• 逻辑值:true转换为"true",false转换为"false"。

• undefined:转换为"undefined"。

• null:转换为"null"。

• 其他对象:若对象存在tostring()方法,则转换为该方法返回值,否则转换为"undefined"。

3. 其他类型转换为逻辑值

其他类型转换为逻辑值,遵循下面的规则。

• 字符串:长度为0的字符串转换为false,否则转换为true。

• 数值:值为0和NaN时,转换为false,否则转换为true。

• undefined:转换为false。

• null:转换为false。

• 其他对象:转换为true。

【例2-12】 测试数据类型转换。源文件:02\test2-12.html。

…
<body>
    <script>
        document.write("其他类型转换为数值:")
        x=1 *"abc"
        document.write('<br>"abc" 转换为:' + x)
        x = 1 * "125"
        document.write('<br>"125" 转换为:' + x)
        x = 1 * true
        document.write('<br>true 转换为:' + x)
        x =1 * false
        document.write('<br>false 转换为:' + x)
        x = 1 * nul
        document.write('<br>nul 转换为:' + x)
        a = new Date()
        x = 1 * a
        document.write('<br>Date对象 转换为:' + x)
        document.write("<p>其他类型转换为字符串:")
        document.write('<br>123.45 转换为:"' + 123.45 + '"')
        document.write('<br>true 转换为:"' + true + '"')
        document.write('<br>false 转换为:"' + false + '"')
        document.write('<br>nul 转换为:"' + nul + '"')
        var a1
        document.write('<br>' + a1 + '转换为:"' + a1 + '"')
        a = new Date()
        document.write('<br>Date对象 转换为:"' + a + '"')
        document.write("<p>其他类型转换为逻辑值:")
        x = "abc" ? true : false
        document.write('<br>"abc" 转换为:' + x)
        x = "" ? true : false
        document.write('<br>空字符串"" 转换为:' + x)
        x = 0 ? true : false
        document.write('<br>0 转换为:' + x)
        x = (1 * "abc") ? true : false
        document.write('<br>NaN 转换为:' + x)
        x = 123 ? true : false
        document.write('<br>123 转换为:' + x)
        var abc
        x = abc ? true : false
        document.write('<br>' + abc + '转换为:' + x)
        x = nul ? true : false
        document.write('<br>nul 转换为:' + x)
        a = new Date()
        x = a ? true : false
        document.write('<br>Date对象 转换为:' + x)
    </script>
</body>
</html>

浏览器中的输出结果如图2-16所示。

图2-16 测试数据类型转换