1. 遞增和遞減操作符 遞增和遞減操作符直接借鑑自 C,而且各有兩個版本:前置型和後置型。 ①顧名思義,前置型應該位於要操作的變數之前,而後置型則應該位於要操作的變數之後。因此,在使用前置遞增操作符給一個數值加 1 時,要把兩個加號(++)放在這個數值變數前面,如下所示:
var age = 29;
++age;
複製程式碼
在這個例子中,前置遞增操作符把 age 的值變成了 30(為 29 加上了 1)。實際上,執行這個前置遞增操作與執行以下操作的效果相同:
var age = 29;
age = age + 1;
複製程式碼
執行前置遞減操作的方法也類似,結果會從一個數值中減去 1。使用前置遞減操作符時,要把兩個減號( -- )放在相應變數的前面,如下所示:
var age = 29;
--age;
複製程式碼
這樣, age 變數的值就減少為 28(從 29 中減去了 1)。 執行前置遞增和遞減操作時,變數的值都是在語句被求值以前改變的。(在電腦科學領域,這種情況通常被稱作副效應。)請看下面這個例子。
var age = 29;
var anotherAge = --age + 2;//變數的age值都是在語句被求值以前改變的,機在這裡 age=28
alert(age); // 輸出 28
alert(anotherAge); // 輸出 30
複製程式碼
這個例子中變數 anotherAge 的初始值等於變數 age 的值前置遞減之後加 2。由於先執行了減法操作, age 的值變成了 28,所以再加上 2 的結果就是 30。 由於前置遞增和遞減操作與執行語句的優先順序相等,因此整個語句會從左至右被求值。再看一個例子:
var num1 = 2;
var num2 = 20;
var num3 = --num1 + num2; // 等於 21
var num4 = num1 + num2; // 等於 21
IncrementDecrementExample02.htm
複製程式碼
在這裡, num3 之所以等於 21 是因為 num1 先減去了 1 才與 num2 相加。而變數 num4 也等於 21 是因為相應的加法操作使用了 num1 減去 1 之後的值。
②後置型遞增和遞減操作符的語法不變(仍然分別是 ++ 和 -- ),只不過要放在變數的後面而不是前面。後置遞增和遞減與前置遞增和遞減有一個非常重要的區別,即遞增和遞減操作是在包含它們的語句被求值之後才執行的。這個區別在某些情況下不是什麼問題,例如:
var age = 29;
age++;
複製程式碼
把遞增操作符放在變數後面並不會改變語句的結果,因為遞增是這條語句的唯一操作。但是,當語句中還包含其他操作時,上述區別就會非常明顯了。請看下面的例子:
var num1 = 2;
var num2 = 20;
var num3 = num1-- + num2; //等於22 遞增和遞減操作是在包含它們的語句被求值之後才執行的,即這裡在num3被求值後,num1 = 1;
var num4 = num1 + num2; // 等於 21
IncrementDecrementExample03.htm
複製程式碼
這裡僅僅將前置遞減改成了後置遞減,就立即可以看到差別。在前面使用前置遞減的例子中, num3 和 num4 最後都等於 21。而在這個例子中, num3 等於 22, num4 等於 21。差別的根源在於,這裡在計 算 num3 時使用了 num1 的原始值(2)完成了加法計算,而 num4 則使用了遞減後的值(1)。 所有這 4 個操作符對任何值都適用,也就是它們不僅適用於整數,還可以用於字串、布林值、浮 點數值和物件。在應用於不同的值時,遞增和遞減操作符遵循下列規則。 在應用於一個包含有效數字字元的字串時,先將其轉換為數字值,再執行加減 1 的操作。字串變數變成數值變數。 在應用於一個不包含有效數字字元的字串時,將變數的值設定為 NaN (第 4 章將詳細討論)。 字串變數變成數值變數。 在應用於布林值 false 時,先將其轉換為 0 再執行加減 1 的操作。布林值變數變成數值變數。 在應用於布林值 true 時,先將其轉換為 1 再執行加減 1 的操作。布林值變數變成數值變數。 在應用於浮點數值時,執行加減 1 的操作。 在應用於物件時,先呼叫物件的 valueOf() 方法(第 5 章將詳細討論)以取得一個可供操作的值。然後對該值應用前述規則。如果結果是 NaN ,則在呼叫 toString() 方法後再應用前述規則。物件變數變成數值變數。 以下示例展示了上面的一些規則:
var s1 = "2";
var s2 = "z";
var b = false;
var f = 1.1;
var o = {
valueOf: function() {
return -1;
}
};
s1++; // 值變成數值 3
s2++; // 值變成 NaN
b++; // 值變成數值 1
f--; // 值變成 0.10000000000000009(由於浮點舍入錯誤所致)
o--; // 值變成數值-2
複製程式碼