作者:Truly
日期:2007.7.31
引言:由於JavaScript的靈活簡單,很多人忽略了JavaScript技術細節,沒有掌握一些基礎知識點,比如+、-運算這樣的基礎操作。同時應部分網友要求,發一篇基礎知識的文章,希望能夠繼續拋磚引玉。今天閱讀了鳥食軒早期的一篇文章《在JavaScript中也玩變數類型強行轉換》,文中提到的一個例子:"88"-8和"88"+8,結果分別是80和"888",看起來有點奇怪,但是這一點正是我們必須要掌握的JavaScript特性之一,所以,今天再重新回顧一下Javascript的一些細節:
開始:
我們先看一下“+”在JavaScript文檔中的說明:
功能:將數字運算式的值加到另一數字運算式上,或串連兩個字串。
文法:result = expression1 + expression2
參數:result 任何變數。
expression1 任何錶達式。
expression2 任何錶達式。
說明:
如果 那麼
兩個運算式都是數字或 Boolean 值 加
兩個運算式都是字串 串連
一個運算式是數字而另一個是字串 串連
而下面再看“-”的定義:
功能: 從一個運算式的值中減去另一個運算式的值,只有一個運算式時取其相反數。
文法1:result = number1 - number2
文法2:-number
說明: 在文法 1 中,- 運算子是算術減法運算子,用來獲得兩個數值之間的差。在文法 2 中,- 運算子被用作一元取負運算子,用來指出一個運算式的負值。
對於文法 2,和所有一元運算子一樣,運算式按照下面的規則來求值:
如果應用於 undefined 或 null 運算式,則會產生一個執行階段錯誤。
對象被轉換為字串。
如果可能,則字串被轉換為數值。如果不能,則會產生一個執行階段錯誤。
Boolean 值被當作數值(如果是 false 則為 0,如果是 true 則為 1)。
該運算子被用來產生數值。在文法 2 中,如果產生的數值不是零,則 result 與產生的數值顛倒符號後是相等的。如果產生的數值是零,則 result 是零。
這裡我來做一個補充,“+”“-”通常作為算術運算子,也就是參見運算的都應該是數字運算式。而“+”同時還用於字串的串連操作,因此對它們的運算特點可歸納如下:
- 對於含有“-”的運算,最後結果應該是數值,參與運算的2個運算式都將向數值轉換,如果轉換失敗,則拋出執行階段錯誤。
- 對於含有“+”的運算,一旦“+”兩邊其中的一個是字串,那麼認為是字串串連,所有參與運算的運算式都向字串轉換,最終是一個串連好的字串。
總結完上面的一些特性,下面我們看它們在實際中的巧用:
var t = parseInt('08');
我們需要轉換一個字串為整型時,上面的代碼從邏輯上是正確的,但是結果卻是錯誤的,其中的原理可以參考JavaScript文檔,也可參見鳥食軒的另一篇文章《這麼小心還是在"08"向8的轉換上栽了》
這時我們可以使用“-”的特性,進行一次數值轉換,代碼如下:
var t2 = '08'-0;
這次我們得到了正確的值,同樣的“+”也可以進行一些妙用,常用來自動進行數值到string的轉換。
最後要提醒大家的是使用上面的規律時要注意運算式中運算的優先順序,例如:
alert(1+2+'');
alert(1+''+2);
得到不同的結果"3"和"12"。
這裡同時補充一個三目操作的運算運算式。與C#的三目運算相似,使用三目操作可以簡化我們的代碼,下面我們看下面兩行代碼:
<script type="text/javascript">
var dt = new Date();
month1 = dt.getMonth()<10?'0':'' + dt.getMonth();
month2 = (dt.getMonth()<10?'0':'') + dt.getMonth();
alert(month1);
alert(month2);
</script>
這段代碼是用來擷取日期中月份的2位表示字串,那麼哪一種是正確的呢?這個問題留給諸位去思考。
小節:本文通過這幾個典型錯誤的分析,說明了基礎知識的重要性,希望大家以後在編寫JavaScript代碼的時候可以避免這樣的低級錯誤。