JavaScript高级程序设计—2.9 运算符(1)
ECMA-262定义了一套用于操作变量的运算符。运算符的范围从算术运算符(如加号和减号)和位运算符到关系运算符和等性运算符。对值执行的原始动作在任何时候都被看作运算符。
2.9.1 一元运算符
一元运算符只有一个参数,即要操作的对象或值。它们是ECMAScript中最简单的运算符。
1. delete
delete运算符删除对以前定义的对象属性或方法的引用。例如:

这个例子中,删除了name属性,意味着强制解除对它的引用,将其设置为undefined(即创建的未初始化的变量的值)。
delete运算符不能删除开发者未定义的属性和方法。例如,下面的代码将引发错误:

即使toString是有效的方法名,这行代码也会引发错误,因为toString()方法是原始的ECMAScript方法,不是开发者定义的。
2. void
void运算符对任何值都返回undefined。该运算符通常用于避免输出不应该输出的值,例如,从HTML的<a>元素调用JavaScript函数时。要正确做到这一点,函数不能返回有效值,否则浏览器将清空页面,只显示函数的结果。例如:


如果把这行代码放入到HTML页面,点击其中的链接,即可看到屏幕上显示"[object]"(如图2-3所示)。这是因为window.open()方法(第5章将对该方法和其他与窗口有关的方法做进一步讨论)返回了对新打开的窗口的引用。然后该对象将被转换成要显示的字符串。

图 2-3
要避免这种结果,可以用void运算符调用window.open()函数:

这使window.open()调用返回undefined,它不是有效的值,不会显示在浏览器窗口中。记住,没有返回值的函数真正返回的都是undefined。
3. 前增量/前减量运算符
直接从C(和Java)借用的两个运算符是前增量运算符和前减量运算符。所谓前增量运算符,就是在数值上加1,形式是在变量前放两个加号(++):

第二行代码把iNum增加到了11,它实质上等价于:

同样,前减量运算符是从数值上减1,形式是在变量前放两个减号(--):

在这个例子中,第二行代码把iNum的值减到9。
在使用前缀式运算符时,注意增量和减量运算都发生在计算表达式之前。考虑下面的例子:

第二行代码对iNum进行减量运算,第三行代码显示的结果是("9")。第四行代码又对iNum进行减量运算,不过这次前减量运算和输出操作出现在同一个语句中,显示的结果是"8"。为了证明已实现了所有的减量操作,第五行代码又输出一次"8"。
在算术表达式中,前增量和前减量运算符的优先级是相同的,因此要按照从左到右的顺序计算之。例如:

在前面的代码中,iNum3等于22,因为表达式要计算的是1+21。变量iNum4也等于22,也是1+21。
4. 后增量/后减量运算符
还有两个直接从C(和Java)借用的运算符,即后增量运算符和后减量运算符。后增量运算符也是给数值加1,形式为在变量后加两个加号(++):

不出所料,后减量运算符也是从数值上减1,形式为在变量后加两个减号(--):

第二行代码把iNum的值减到9。
与前缀式运算符不同的是,后缀式运算符是在计算过包含它们的表达式后才进行增量或减量运算的。考虑下面的例子:

与前缀式运算符的例子相似,第二行代码对iNum进行减量运算,第三行代码显示结果(“9”)。第四行代码再次显示iNum的值,不过这次是在同一个语句中应用后减量运算符。由于减量运算发生在计算过表达式之后,所以这条语句显示的数是"9"。执行了第五行代码后,alert函数显示的是"8",因为在执行第四行代码之后和执行第五行代码之前,执行了后减量运算。
在算术表达式中,后增量和后减量运算符的优先级是相同的,因此要按照从左到右的顺序计算之。例如:

在上面的代码中,iNum3等于22,因为表达式要计算的是2+20。变量iNum4也等于22,不过它计算的是1+21,因为增量和减量运算都在给iNum3赋值后才发生。