js高級程序設計(第三版)--元操做符遞增和遞減操做符(前置型和後置型)詳解

1. 遞增和遞減操做符 遞增和遞減操做符直接借鑑自 C,並且各有兩個版本:前置型和後置型。 顧名思義,前置型應該位於要操做的變量以前,然後置型則應該位於要操做的變量以後。所以,在使用前置遞增操做符給一個數值加 1 時,要把兩個加號(++)放在這個數值變量前面,以下所示:bash

var age = 29;
++age;
複製代碼

在這個例子中,前置遞增操做符把 age 的值變成了 30(爲 29 加上了 1)。實際上,執行這個前置遞增操做與執行如下操做的效果相同:ui

var age = 29;
age = age + 1;
複製代碼

執行前置遞減操做的方法也相似,結果會從一個數值中減去 1。使用前置遞減操做符時,要把兩個減號( -- )放在相應變量的前面,以下所示:spa

var age = 29;
--age;
複製代碼

這樣, age 變量的值就減小爲 28(從 29 中減去了 1)。 執行前置遞增和遞減操做時,變量的值都是在語句被求值之前改變的。(在計算機科學領域,這種狀況一般被稱做副效應。)請看下面這個例子。code

var age = 29;
var anotherAge = --age + 2;//變量的age值都是在語句被求值之前改變的,機在這裏 age=28
alert(age); // 輸出 28
alert(anotherAge); // 輸出 30
複製代碼

這個例子中變量 anotherAge 的初始值等於變量 age 的值前置遞減以後加 2。因爲先執行了減法操做, age 的值變成了 28,因此再加上 2 的結果就是 30。 因爲前置遞增和遞減操做與執行語句的優先級相等,所以整個語句會從左至右被求值。再看一個例子:htm

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 以後的值。對象

後置型遞增和遞減操做符的語法不變(仍然分別是 ++ 和 -- ),只不過要放在變量的後面而不是前面。後置遞增和遞減與前置遞增和遞減有一個很是重要的區別,即遞增和遞減操做是在包含它們的語句被求值以後才執行的。這個區別在某些狀況下不是什麼問題,例如:rem

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() 方法後再應用前述規則。對象變量變成數值變量。 如下示例展現了上面的一些規則:string

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
複製代碼
相關文章
相關標籤/搜索