
2.3.7 特殊运算符
除了前几节列出的运算符之外,JavaScript中还有一些特殊的运算符用来处理特定的问题,主要包括以下几种。
1)逗号运算符:二元运算符,用来将两个操作数隔开,在2.1.3节中提到用逗号来隔开在一行中声明的两个变量。逗号运算符还可以用在for循环语句中,将多个变量更新表达式隔开,例如:

输出如图2.29所示。

图2.29 样例输出2.29
2)存取运算符:二元运算符,用来存取数组或者对象中的数据,存取数组中的数据用“[]”,而存取对象中的数据则使用“.”,例如:

输出如图2.30所示。

图2.30 样例输出2.30
3)条件运算符:三元运算符,用来根据条件的真假执行不同语句。条件运算符是JavaScript中唯一的一个三元运算符,以“?:”作为符号。条件运算符和“if…else”语句类似,只是写法更加简洁。如果条件语句的结果为“true”,则执行“:”前面的语句;如果结果为“false”,则执行“:”后面的语句,例如:

输出如图2.31所示。

图2.31 样例输出2.31
4)new:一元运算符,用来创建一个新的对象,对象被创建后就可以调用其属性和方法,例如:

输出如图2.32所示。

图2.32 样例输出2.32
5)delete:一元运算符,用来删除对象的属性或者数组中的元素,并返回一个布尔值,当删除成功时返回true,失败时返回false。有的书中或者教程中会说,delete可以用来删除不用var或者let关键字定义的变量、对象或者数组。但是在之前的章节中提过,不用var或者let声明的变量其实是为Window对象添加一个属性,本质上与变量是有区别的。而JavaScript中数组的元素其实也是数组的一种属性,只是比较特殊。因此我们只谈其本质,即delete运算符只是用来删除对象的属性,例如:


输出如图2.33所示。

图2.33 样例输出2.33
从结果可以看出,我们成功删除了Student对象中的name属性和arr数组中的第三个元素,再试图使用这些属性或者元素时可以看到,该属性或元素已经变为“undefined”,在2.2.6节中提过,当对象存在而对象的属性或者数组的元素不存在时,其类型会被设定为undefined。
而因为a作为变量时是不能被删除的,因此会出现删除失败的情况,这证明了delete是不能用于删除变量的。但是b作为Window对象的属性时是可以被删除的,但是这种不加“var”声明的变量在删除后是不能再被使用的,否则会报错。
需要注意的是,JavaScript的核心对象的属性是不能被删除的,但是某些内置对象的属性是可以被删除的,但是不建议这么做,因为删除后这些内置对象不能再被访问。
6)this:一元运算符,用来指代当前对象,一般用于在对象或函数内部调用自身的属性或者方法时代替对象自身。在调用对象的属性或方法时,一般会用“对象名.属性名”或者“对象名.方法名()”的方法来进行调用,而“this”的用处就是把对象名替换成“this”,例如:

输出如图2.34所示。

图2.34 样例输出2.34
7)in:二元运算符,用来判断第一个操作数是否属于第二个操作数,并返回一个布尔类型的结果,若属于则返回true,不属于则返回false。第一个操作数可以是数组元素的下标,也可以是对象的属性,第二个操作数就是与它们相对应的数组或者对象,例如:


输出如图2.35所示。

图2.35 样例输出2.35
需要注意的是,当查询元素是否在数组中时,第一个操作数指的是数组元素的下标,而不是元素的值。
8)instanceof:二元运算符,用来识别第一个操作数是否是第二个操作数的类型,并返回一个布尔类型的结果,如果是返回true,否则返回false。其用法与“in”相似,第一个操作数为对象,第二个操作数为对象的类型名,例如:

输出如图2.36所示。

图2.36 样例输出2.36
同样,还可以判断对象是否属于自己定义的变量类型,例如:

输出如图2.37所示。

图2.37 样例输出2.37
9)void:一元运算符,用来取消返回值。当需要进行语句的执行,但又不需要操作数返回值或者对象时,可以用“void”来阻断这个过程,例如:

输出如图2.38所示。

图2.38 样例输出2.38
10)typeof:一元运算符,用来判断操作数类型并返回一个和类型名相同的字符串,对不同类型的操作数,返回的值是不同的,表2.11展示了JavaScript中“typeof”运算符对不同类型的返回值。
表2.11 JavaScript中“typeof”运算符的返回结果

具体用法如下:

输出如图2.39所示。

图2.39 样例输出2.39