天天看點

JS程式設計建議——8:謹慎使用運算符(1)

建議8:謹慎使用運算符(1)

1.用===,而不用==

JavaScript有兩組相等運算符:===和!==、==和!=。===和!==這一組運算符會按照期望的方式工作。如果兩個運算數類型一緻且擁有相同的值,那麼===傳回true,而!==傳回false。==和!=隻有在兩個運算數類型一緻時才會做出正确的判斷,如果兩個運算數是不同的類型,會試圖強制轉換運算數的類型。轉換的規則複雜且難以記憶,具體規則如下:

'' == '0' // false

0 == '' // true

0 == '0' // true

false == 'false' // false

false == '0' // true

false == undefined // false

false == null // false

null == undefined // true

上面表達式如果全部使用===運算符,則都會傳回true。

==和!=運算符缺乏傳遞性,需要引起警惕。所謂傳遞性就是:如果a==b為true,b==c為true,則a==c也為true。是以,在JavaScript開發中,建議永遠不要使用==和!=,而選用===和!==運算符。

下面分别介紹一下===和==運算符的算法。

(1)===運算符的算法

在使用===來判斷兩個值是否相等時,如判斷x===y,會先比較兩個值的類型是否相同,如果不相同,直接傳回false。如果兩個值的類型相同,則接着根據x的類型展開不同的判斷邏輯:

如果x的類型是Undefined或Null,則傳回 true。

如果x的類型是Number,隻要x 或y中有一個值為NaN,就傳回 false;如果x和y的數字值相等,就傳回 true;如果x或y中有一個是+0,另外一個是–0,則傳回 true。

如果x的類型是String,當x和y的字元序列完全相同時傳回 true,否則傳回 false。

如果x的類型是Boolean,當x和y同為true或false時傳回 true,否則傳回 false。

當x和y引用相同的對象時傳回 true,否則傳回 false。

(2)==運算符的算法

在使用==來判斷兩個值是否相等時,如判斷x==y,如果x和y的類型一樣,判斷邏輯與=== 一樣;如果x和y的類型不一樣,==不是簡單地傳回false,而是會進行一定的類型轉換。

如果x和y中有一個是 null,另外一個是undefined,傳回true,如null == undefined。

如果x和y中有一個類型是String,另外一個類型是Number,會将String類型的值轉換成 Number來比較,如3 == "3"。

如果x和y中有一個類型是Boolean,會将Boolean類型的值轉換成Number來比較,如true == 1、true == "1"。

如果x和y中有一個類型是String或Number,另外一個類型是Object,會将Object類型的值轉換成基本類型來比較,如[3,4] == "3,4"。

2.謹慎使用++和--

遞增(++)和遞減(--)運算符使程式員可以用非常簡潔的風格去編碼,如在C語言中,它們使得通過一行代碼實作字元串的複制成為可能,例如:

for (p = src, q = dest; !p; p++, q++) q = *p;

事實上,這兩個運算符容易形成一種不謹慎的程式設計風格。大多數的緩沖區溢出錯誤所造成的安全漏洞都是由于這種編碼導緻的。

當使用++和--時,代碼往往變得過于緊密、複雜和隐晦。是以,在JavaScript程式設計中不建議使用它們,進而使代碼風格變得更為整潔。

繼續閱讀