3.10 其他运算符
除了前面章节里所介绍的运算符之外,JavaScript还支持许多其他运算符,请看以下介绍。
3.10.1 条件运算符
条件运算符(?:)是JavaScript中唯一的三元运算符。三元运算符必须有3个操作数:第1个操作数位于“?”之前;第2个操作数位于“?”与“:”之间;第3个操作数位于“:”之后。其语法代码如下:
X ? Y : Z
在条件运算符中,第1个操作数(X)必须是布尔值(如“a>b”),而第2个操作数(Y)和第3个操作数(Z),可以是任何类型的值。条件运算符返回的值是由第1个操作数的值所决定的,如果第1个操作数的值为true,那么返回第2个操作数的值;如果第1个操作数的值为false,那么返回第3个操作数的值。
【实例3.31】请看以下代码,注意加粗的文字。
01 <html> 02 <head> 03 <title>条件运算符</title> 04 <script type="text/javascript"> 05 <!-- 06 var x = 12; 07 var a = "x大于10<br>"; 08 var b = "x不大于15<br>"; 09 document.write(x>10?a:b); 10 document.write(x>15?a:b); 11 --> 12 </script> 13 </head> 14 <body> 15 </body> 16 </html>
【代码说明】在本例中,x的值为12,因此x>10的值为true,所以返回变量a的值,即“x大于10”。而x>15的值为false,所以返回变量b的值,即“x不大于15”。
【运行效果】以上代码为本书配套代码文件目录“代码\第03章\sample31.htm”里的内容,其运行结果如图3.19所示。
3.10.2 new运算符
在JavaScript中有很多内置对象,如日期对象、字符串对象、布尔对象和数值对象等,使用new运算符可以定义一个新的内置对象实例,JavaScript会调用构造函数初始化这个对象实例。new运算符的语法如下:
对象实例名称 = new 对象类型 (参数) 对象实例名称 = new 对象类型
当函数调用时,如果没有用到参数,可以省去括号,但这种省略方式只限于new运算符。
【实例3.32】有关new运算符的使用请看以下代码,注意加粗的文字。
01 <html> 02 <head> 03 <title>new运算符</title> 04 <script type="text/javascript"> 05 <!-- 06 var mydate = new Date(); 07 document.write(mydate.getFullYear() + "<br>"); 08 09 var arr = new Array; 10 arr = ["1",true]; 11 document.write(arr[1] + "<br>"); 12 --> 13 </script> 14 </head> 15 <body> 16 </body> 17 </html>
【代码说明】本例中的知识点说明如下。
■代码第6行使用“var mydate = new Date();”定义了一个名为mydate的新的日期型对象。
■在定义了日期型对象实例之后,JavaScript会自动调用构造函数初始化mydate,因此,可以通过mydate.getYear()来获取该日期型对象中的年份。
■代码第9行使用“var arr = new Array;”定义了一个名为arr数组。在定义数组对象实例时,没有使用参数,所以可以省略Array后面的括号。
【运行效果】以上代码为本书配套代码文件目录“代码\第03章\sample32.htm”里的内容,其运行结果如图3.20所示。
3.10.3 void运算符
void运算符是一个特殊的一元运算符,可以作用在任何类型的操作数之前。void运算符可以让操作数进行运算,但是却舍弃运算之后的结果。通常void运算符出现在HTML代码的<a>标签中,其语法代码如下:
void 操作数 void(操作数)
【实例3.33】有关void运算符的使用方法请看以下代码,注意加粗的文字。
01 <html> 02 <head> 03 <title>void运算符</title> 04 <script type="text/javascript"> 05 <!-- 06 var a = 1; 07 var b = 2; 08 document.write("a+b = " + (a+b) + "<br>"); 09 document.write("void(a+b) = " + void(a+b) + "<br>"); 10 --> 11 </script> 12 </head> 13 <body> 14 <a href="javascript:void window.open()">打开一个新窗口</a><br> 15 <a href="javascript:window.open()">打开一个新窗口</a> 16 </body> 17 </html>
【代码说明】在本例中可以看到,变量a加上变量b的结果为3,而void(a+b)的结果是undefined。单从这一步来看,好像并没有执行a+b操作,而事实上JavaScript是执行了a+b操作,只是弃舍了结果。
【运行效果】以上代码为本书配套代码文件目录“代码\第03章\sample33.htm”里的内容,其运行结果如图3.21所示。
在本例中的第1个超链接里,使用了“javascript:void window. open()”语句来打开一个新窗口,如果单击该超链接,将会打开一个新窗口,如图3.22所示。
在本例中的第2个超链接里,使用了“javascript:window.open()”语句来打开一个新窗口,如果单击该超链接,也会打开一个新窗口,如图3.23所示。
比较图3.22与图3.23,可以发现,单击两个超链接之后,都会打开一个新窗口,但单击第1个超链接之后,原浏览器窗口中的内容并没有改变,而单击第2个超链接之后,原浏览器窗口中的内容已经改变。这是因为在第1个超链接中,使用了void运算符舍弃了操作数,而在第2个超链接中没有舍弃操作数。
3.10.4 typeof运算符
typeof运算符是一个一元运算符,作用于操作数之前,该操作数可以是一个任何类型。typeof运算符可以返回一个字符串,该字符串说明操作数是什么类型。typeof运算符的语法代码如下:
typeof 操作数 typeof(操作数)
【实例3.34】有关typeof运算符的使用方法请看以下代码,注意加粗的文字。
01 <html> 02 <head> 03 <title>typeof运算符</title> 04 <script type="text/javascript"> 05 <!-- 06 var x = 12; //数字型 07 var a = "x大于10"; //字符串型 08 var b = true; //布尔型 09 var c = null; //空 10 var now = new Date(); //日期型 11 var arr = ["1",true]; //数组 12 function myalert() //函数 13 { 14 alert("警告"); 15 } 16 17 document.write(typeof x + "<br>"); 18 document.write(typeof a + "<br>"); 19 document.write(typeof(b) + "<br>"); 20 document.write(typeof(c) + "<br>"); 21 document.write(typeof(d) + "<br>"); 22 document.write(typeof(now) + "<br>"); 23 document.write(typeof(arr) + "<br>"); 24 document.write(typeof(myalert) + "<br>"); 25 --> 26 </script> 27 </head> 28 <body> 29 </body> 30 </html>
【代码说明】在本例中可以看出,typeof运算符返回值的几种情况如下。
■当操作数为数字型时,返回“number”。
■当操作数为字符串型时,返回“string”。
■当操作数为布尔型时,返回“boolean”。
■当操作数为空时,返回“object”。
■当操作数不存在时,返回“undefined”。
■当操作数为日期型时,返回“object”。
■当操作数为数组时,返回“object”。
■当操作数为函数时,返回“function”。
【运行效果】以上代码为本书配套代码文件目录“代码\第03章\sample34.htm”里的内容,其运行结果如图3.24所示。
3.10.5 对象属性存取运算符
对象属性存取运算符(.)是一个二元运算符,该运算符要求第1个操作数必须是对象或对象实例名,而第2个操作数必须是对象的属性名。对象属性存取运算符的语法代码如下:
对象名.属性名
【实例3.35】有关对象属性存取运算符的使用方法如下所示,注意加粗的文字。
01 <html> 02 <head> 03 <title>对象属性存取运算符</title> 04 <script type="text/javascript"> 05 <!-- 06 //定义一个对象实例 07 myObject = new Object(); 08 //设置对象实例的属性 09 myObject = {a: "myObject对象a属性的值", b:"myObject对象b属性的值 10 "}; 11 12 //输出对象属性 13 document.write(myObject.a + "<br>"); 14 document.write(myObject.b + "<br>"); 15 16 //输出一个不存在的对象属性 17 document.write(myObject.d); 18 --> 19 </script> 20 </head> 21 <body> 22 </body> </html>
【代码说明】在使用对象属性存取运算符时,有以下两点需要注意。
■虽然对象属性存取运算符要求第2个操作数是对象的属性名,但是如果第2个操作数所指定的属性不存在,JavaScript也不会报错,只会返回undefined。
■使用对象属性存取运算符,不但可以存取对象的属性,还可以调用对象的方法。
【运行效果】以上代码为本书配套代码文件目录“代码\第03章\sample35.htm”里的内容,其运行结果如图3.25所示。
3.10.6 数组元素存取运算符
数组元素存取运算符([])用于存取数组中某个元素的值。在该运算符中,“[]”之前为第1个操作,该操作数必须是数组的名称。在“[”与“]”之间为第2个操作数,该操作数为数组的下标,并且必须是整数型,其取值范围为从0到数组元素个数减1。数组元素存取运算符的语法代码如下:
数组名[下标]
【实例3.36】有关数组元素存取运算符的使用方法如下所示,注意加粗的文字。
01 <html> 02 <head> 03 <title>数组元素存取运算符</title> 04 <script type="text/javascript"> 05 <!-- 06 //定义一个数组 07 var arr = ["数组元素一","数组元素二"]; 08 09 //输出数组元素的值 10 document.write(arr[0] + "<br>"); 11 document.write(arr[1] + "<br>"); 12 13 //输出一个不存在的数据元素的值 14 document.write(arr[2]); 15 --> 16 </script> 17 </head> 18 <body> 19 </body> 20 </html>
【代码说明】代码第7行定义了一个数组,包括两个值。代码第10~14行分别读取数组的值,其中第14行的索引已经超出了数组的边界。
【运行效果】以上代码为本书配套代码文件目录“代码\第03章\sample36.htm”里的内容,其运行结果如图3.26所示。
注意
如果数组的下标大于或等于数组元素的个数,JavaScript也不会报错,只会返回undefined。
数组元素存取运算符不但可以用来存取数组元素的值,还可以用来存取对象属性的值,此时要求第1个操作数为对象名称、第2个操作数为对象的属性名称。
【实例3.37】请看以下代码,注意加粗的文字。
01 <html> 02 <head> 03 <title>数组元素存取运算符</title> 04 <script type="text/javascript"> 05 <!-- 06 //定义一个对象 07 myObject = new Object(); 08 //设置对象的属性 09 myObject = {a:"myObject对象a属性的值" , b:"myObject对象b属性的值 10 "}; 11 12 //输出对象的属性值 13 document.write(myObject["a"] + "<br>"); 14 document.write(myObject["b"] + "<br>"); 15 --> 16 </script> 17 </head> 18 <body> 19 </body> 20 </html>
【代码说明】代码第9~10行定义了一个数组,这里和以前有区别,在{ }内用“:”来间隔操作对象和对象的属性。代码第13~14行演示了这种读取方式。
【运行效果】以上代码为本书配套代码文件目录“代码\第03章\sample37.htm”里的内容,其运行结果如图3.27所示。
3.10.7 delete运算符
delete运算符用于删除变量、对象的属性或数组中的元素。delete运算符返回的是布尔值数据。如果删除操作成功,则返回true,否则返回false。delete运算符的使用语法如下:
delete 对象名 delete 对象名称.属性 delete 数组[索引] delete 变量名
在使用delete运算符时,必须注意以下几点。
■并不是所有属性和变量都可以删除,某些对象的内部核心属性和客户端属性是不能删除的。
■使用var定义的变量、对象、数组是不能删除的。
■删除对象中不存在的属性会返回true。
■删除未定义的变量会返回true。
【实例3.38】有关delete运算符的使用方法请看以下代码,注意加粗的文字。
01 <html> 02 <head> 03 <title>delete运算符</title> 04 <script type="text/javascript"> 05 <!-- 06 //定义一个对象 07 myObject = new Object(); 08 //设置对象的属性 09 myObject = {a:"myObject对象a属性的值" , b:"myObject对象b属性的值 10 "}; 11 //定义变量 12 var a = "使用var定义的变量"; 13 b = "没有使用var定义的变量"; 14 //定义一个数组 15 var arr = ["数组元素一","数组元素二"]; 16 17 //输出对象属性 18 document.write(myObject.a + "<br>"); 19 document.write(myObject.b + "<br>"); 20 //删除对象属性 21 delete myObject.b; 22 //输出删除过的对象属性,此时myObject.b属性不存在,输出undefined 23 document.write(myObject.b + "<br>"); 24 //删除对象不存在的对象属性,也会返回true 25 document.write(delete myObject.c + "<br><br>"); 26 27 //删除对象 28 delete myObject; 29 //输出已删除的对象类型,此时myObject对象不存在,输出undefined 30 document.write(typeof(myObject) + "<br><br>"); 31 32 //输出变量a的值 33 document.write(a + "<br>"); 34 //删除变量a,由于变量a是使用var定义的,所以不能删除,返回false 35 document.write(delete a + "<br><br>"); 36 37 //输出变量b的值 38 document.write(b + "<br>"); 39 //删除变量b,由于变量b是没有使用var定义的,所以可以删除,返回true 40 document.write(delete b + "<br>"); 41 //输出已删除的变量b的类型,此时变量b不存在,输出undefined 42 document.write(typeof(b) + "<br><br>"); 43 44 //输出数组元素的值 45 document.write(arr[0] + "<br>"); 46 document.write(arr[1] + "<br>"); 47 //删除数组元素 48 delete arr[0]; 49 //输出数组元素的值,arr[0]被删除了,所以输出undefined 50 document.write(arr[0] + "<br>"); 51 document.write(arr[1] + "<br><br>"); 52 53 //不能删除未定义的变量,因此返回true 54 document.write(delete d); 55 --> 56 </script> 57 </head> 58 <body> 59 </body> 60 </html>
【代码说明】在本例中的知识点如下。
■代码第7行定义了一个myObject对象,并为myObject对象创建a和b两个属性。使用delete运算符删除myObject.b属性,然后输出myObject.b属性。此时由于myObject.b属性已经删除,所以显示undefined。如图3.28所示中的第3行文字所示。
■使用delete运算符删除myObject对象中并不存在的c属性,但此时仍然返回true。如图3.28所示中第4行文字所示。
■使用delete运算符删除myObject对象,再使用typeof运算符返回myObject对象的类型。由于myObject对象已经删除,所以返回的是undefined。如图3.28所示中第5行文字所示。
■代码第12行使用var定义一个变量a,然后使用delete运算符删除变量a,此时返回false,因为delete运算符不能删除使用var定义的变量。如图3.28所示中的第7行文字。
■代码第13行定义一个变量b,该变量b没有使用var定义,然后使用delete运算符删除变量b,此时返回true。如图3.28所示中的第9行文字所示。
■再用typeof运算符返回变量b的类型,由于变量b已经删除,所以返回undefined。图3.28所示中的第10行文字所示。
■代码第15行定义一个名为arr的数组,该数组中有两个元素。使用delete运算符删除数组中的第1个元素。再输出arr数组中的第1个元素,由于该元素已经删除,所以返回undefined。图3.28所示中的第13行文字所示。
■使用delete运算符删除一个未定义的变量d,返回的还是true。图3.28所示中最后一行文字所示。
【运行效果】以上代码为本书配套代码文件目录“代码\第03章\sample38.htm”里的内容,其运行结果如图3.28所示。
3.10.8 逗号运算符
逗号运算符是一个二元运算符,其作用只是分隔两个操作数,JavaScript会先计算第1个操作数的值,再计算第2个操作数的值。通常逗号运算符都与for语句联合使用。
【实例3.39】有关逗号运算符的使用请看以下代码,注意加粗的文字。
01 <html> 02 <head> 03 <title>逗号运算符</title> 04 <script type="text/javascript"> 05 <!-- 06 var a = 1; 07 var b = 2; 08 c = a+1, d = a+b; 09 document.write(c + "<br>"); 10 document.write(d + "<br>"); 11 for (i=0,j=1;i<3;i++,j=j+3) 12 { 13 document.write("i = " + i + ";j = " + j + "<br>"); 14 } 15 --> 16 </script> 17 </head> 18 <body> 19 </body> 20 </html>
【代码说明】代码第8行使用了逗号运算符,其实这完成了两个运算。代码第11行中的for循环中也使用了逗号运算符,这里起到间隔的作用。
【运行效果】以上代码为本书配套代码文件目录“代码\第03章\sample39.htm”里的内容,其运行结果如图3.29所示。
提示
有关for语句的使用方法会在后续章节详细介绍。
3.10.9 函数调用运算符
函数调用运算符(())是一个特殊的运算符,其作用是调用函数。之所以说它特殊,是因为该运算符没有确定数量的操作数,操作数的多少由函数的参数多少来决定。函数调用运算符的语法代码如下:
函数名() 函数名(参数) 函数名(参数1,参数2,…) 对象名.方法名() 对象名.方法名(参数) 对象名.方法名(参数1,参数2,…)
【实例3.40】有关函数调用运算符的使用方法请看以下代码,注意加粗的文字。
01 <html> 02 <head> 03 <title>函数调用运算符</title> 04 <script type="text/javascript"> 05 <!-- 06 //调用document对象的write()方法 07 document.write("输出文字<br>"); 08 09 //定义一个函数 10 function myFun() 11 { 12 alert("弹出警告框"); 13 } 14 //调用函数 15 myFun(); 16 --> 17 </script> 18 </head> 19 <body> 20 </body> 21 </html>
【代码说明】代码第10~13行创建了一个函数myFun,代码第15行调用这个函数直接用名称+( )的形式即可。
【运行效果】以上代码为本书配套代码文件目录“代码\第03章\sample40.htm”里的内容,其运行结果如图3.30所示。
3.10.10 this运算符
虽然在很多时候,都称this为运算符,但this更像是一个关键字,因为它不需要操作数。this所代表的是当前对象,其语法代码如下所示:
this[.属性]
【实例3.41】有关this运算符的使用方法请看以下代码,注意加粗的文字。
01 <html> 02 <head> 03 <title>this运算符</title> 04 <script type="text/javascript"> 05 <!-- 06 function outtext1(obj) 07 { 08 alert(obj.value); 09 } 10 function outtext2(str) 11 { 12 alert(str); 13 } 14 --> 15 </script> 16 </head> 17 <body> 18 <input type="text" value="第一个文本框" onclick="outtext1(this)"> 19 <input type="text" value="第二个文本框" onclick="outtext2(this.value)"> 20 </body> 21 </html>
【代码说明】在本例中,第18~19行创建了两个文本框,第6~13行表示在单击文本框时,会弹出一个警告窗口。
【运行效果】以上代码为本书配套代码文件目录“代码\第三章\sample41.htm”里的内容,如图3.31为单击第1个文本框之后的结果。
在本例中第1个文本框里使用了“onclick="outtext1(this)"”来调用outtext1函数,该函数中的参数为对象型参数,此时this代表的是第1个文本框对象。在本例中第2个文本框里使用了“onclick= "outtext2(this.value)"”来调用outtext2函数,该函数中的参数为字符串型参数,此时this代表的是第2个文本框对象,而this.value代表的是第2个文本框中的内容。