# ECMAScript 一元运算符

一元运算符只有一个参数，即要操作的对象或值。它们是 ECMAScript 中最简单的运算符。

## delete

delete 运算符删除对以前定义的对象属性或方法的引用。例如：

    var o = new Object;
    o.name = "David";
    alert(o.name);	//输出 "David"
    delete o.name;
    alert(o.name);	//输出 "undefined"

在这个例子中，删除了 name 属性，意味着强制解除对它的引用，将其设置为 undefined（即创建的未初始化的变量的值）。

delete 运算符不能删除开发者未定义的属性和方法。例如，下面的代码将引发错误：

    delete o.toString;

即使 toString 是有效的方法名，这行代码也会引发错误，因为 toString() 方法是原始的 ECMAScript 方法，不是开发者定义的。

## void

void 运算符对任何值返回 undefined。该运算符通常用于避免输出不应该输出的值，例如，从 HTML 的 <a> 元素调用 JavaScript 函数时。要正确做到这一点，函数不能返回有效值，否则浏览器将清空页面，只显示函数的结果。例如：

    <a href="javascript:window.open('about:blank')">Click me</a>

如果把这行代码放入 HTML 页面，点击其中的链接，即可看到屏幕上显示 "[object]"。TIY

这是因为 window.open() 方法返回了新打开的窗口的引用。然后该对象将被转换成要显示的字符串。

要避免这种效果，可以用 void 运算符调用 window.open() 函数：

    <a href="javascript:void(window.open('about:blank'))">Click me</a>

这使 window.open() 调用返回 undefined，它不是有效值，不会显示在浏览器窗口中。

提示：请记住，没有返回值的函数真正返回的都是 undefined。

## 前增量/前减量运算符

直接从 C（和 Java）借用的两个运算符是前增量运算符和前减量运算符。

所谓前增量运算符，就是数值上加 1，形式是在变量前放两个加号（++）：

    var iNum = 10;
    ++iNum;

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

    var iNum = 10;
    iNum = iNum + 1；

同样，前减量运算符是从数值上减 1，形式是在变量前放两个减号（--）：

    var iNum = 10;
    --iNum;

在这个例子中，第二行代码把 iNum 的值减到 9。

在使用前缀式运算符时，注意增量和减量运算符都发生在计算表达式之前。考虑下面的例子：

    var iNum = 10;
    --iNum;
    alert(iNum);	//输出 "9"
    alert(--iNum);	//输出 "8"
    alert(iNum);	//输出 "8"

第二行代码对 iNum 进行减量运算，第三行代码显示的结果是（"9"）。第四行代码又对 iNum 进行减量运算，不过这次前减量运算和输出操作出现在同一个语句中，显示的结果是 "8"。为了证明已实现了所有的减量操作，第五行代码又输出一次"8"。

在算术表达式中，前增量和前减量运算符的优先级是相同的，因此要按照从左到右的顺序计算之。例如：

    var iNum1 = 2;
    var iNum2 = 20;
    var iNum3 = --iNum1 + ++iNum2;	//等于 "22"
    var iNum4 = iNum1 + iNum2;		//等于 "22"

在前面的代码中，iNum3 等于 22，因为表达式要计算的是 1 + 21。变量 iNum4 也等于 22，也是 1 + 21。

## 后增量/后减量运算符

还有两个直接从 C（和 Java）借用的运算符，即后增量运算符和后减量运算符。

后增量运算符也是给数值上加 1，形式是在变量后放两个加号（++）：

    var iNum = 10;
    iNum++;

不出所料，后减量运算符也是从数值上减 1，形式为在变量后加两个减号（--）：

    var iNum = 10;
    iNum--;

第二行代码把 iNum 的 值减到 9。

与前缀式运算符不同的是，后缀式运算符是在计算过包含它们的表达式后才进行增量或减量运算的。考虑以下的例子：

    var iNum = 10;
    iNum--;
    alert(iNum);	//输出 "9"
    alert(iNum--);	//输出 "9"
    alert(iNum);	//输出 "8"

与前缀式运算符的例子相似，第二行代码对 iNum 进行减量运算，第三行代码显示结果（"9"）。第四行代码继续显示 iNum 的值，不过这次是在同一语句中应用减量运算符。由于减量运算发生在计算过表达式之后，所以这条语句显示的数是 "9"。执行了第五行代码后，alert 函数显示的是 "8"，因为在执行第四行代码之后和执行第五行代码之前，执行了后减量运算。

在算术表达式中，后增量和后减量运算符的优先级是相同的，因此要按照从左到右的顺序计算之。例如：

    var iNum1 = 2;
    var iNum2 = 20;
    var iNum3 = iNum1-- + iNum2++;	//等于 "22"
    var iNum4 = iNum1 + iNum2;		//等于 "22"

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

## 一元加法和一元减法

大多数人都熟悉一元加法和一元减法，它们在 ECMAScript 中的用法与您高中数学中学到的用法相同。

一元加法本质上对数字无任何影响：

    var iNum = 20;
    iNum = +iNum;
    alert(iNum);	//输出 "20"

这段代码对数字 20 应用了一元加法，返回的还是 20。

尽管一元加法对数字无作用，但对字符串却有有趣的效果，会把字符串转换成数字。

    var sNum = "20";
    alert(typeof sNum);	//输出 "string"
    var iNum = +sNum;
    alert(typeof iNum);	//输出 "number"

这段代码把字符串 "20" 转换成真正的数字。当一元加法运算符对字符串进行操作时，它计算字符串的方式与 parseInt() 相似，主要的不同是只有对以 "0x" 开头的字符串（表示十六进制数字），一元运算符才能把它转换成十进制的值。因此，用一元加法转换 "010"，得到的总是 10，而 "0xB" 将被转换成 11。

另一方面，一元减法就是对数值求负（例如把 20 转换成 -20）：

    var iNum = 20;
    iNum = -iNum;
    alert(iNum);	//输出 "-20"

与一元加法运算符相似，一元减法运算符也会把字符串转换成近似的数字，此外还会对该值求负。例如：

    var sNum = "20";
    alert(typeof sNum);	//输出 "string"
    var iNum = -sNum;
    alert(iNum);		//输出 "-20"
    alert(typeof iNum);	//输出 "number"

在上面的代码中，一元减法运算符将把字符串 "-20" 转换成 -20（一元减法运算符对十六进制和十进制的处理方式与一元加法运算符相似，只是它还会对该值求负）。