有些開發者習慣將常量寫在運算符的左邊,這樣的話,一旦不小心將相等運算符寫成賦值運算符,就會報錯,因為常量不能被賦值。
if (x = 2) { // 不報錯 if (2 = x) { // 報錯
需要注意的是,switch語句后面的表達式與case語句后面的表示式,在比較運行結果時采用的是嚴格相等運算符(===),而不是相等運算符(==),這意味著比較時不會發生類型轉換。
var x = 1; switch (x) { case true: console.log('x發生類型轉換'); default: console.log('x沒有發生類型轉換');} // x沒有發生類型轉換
注意,JavaScript的標識名區分大小寫,所以undefined
和null
不同于Undefined
和Null
(或者其他僅僅大小寫不同的詞形),后者只是普通的變量名。
如果JavaScript預期某個位置應該是布爾值,會將該位置上現有的值自動轉為布爾值。轉換規則是除了下面六個值被轉為false,其他值都視為true。
undefined null false 0 NaN ""或''(空字符串)
布爾值往往用于程序流程的控制,請看一個例子。
if ('') { console.log(true);} // 沒有任何輸出
上面代碼的if命令后面的判斷條件,預期應該是一個布爾值,所以JavaScript自動將空字符串,轉為布爾值false,導致程序不會進入代碼塊,所以沒有任何輸出。需要特別注意的是,空數組([])和空對象({})對應的布爾值,都是true。
if ([]) { console.log(true);} // true if ({}) { console.log(true);} // true
將數組清空的一個有效方法,就是將length屬性設為0。
需要注意的是,for...in會遍歷數組所有的鍵,即使是非數字鍵。
var a = [1, 2, 3]; a.foo = true; for (var key in a) { console.log(key);} // 0 // 1 // 2 // foo
上面代碼在遍歷數組時,也遍歷到了非整數鍵foo。所以,使用for...in遍歷數組的時候,一定要小心。
delete
命令不影響length屬性。
var a = [1, 2, 3]; delete a[1];delete a[2]; a.length // 3
上面代碼用delete命令刪除了兩個鍵,對length屬性沒有影響。也就是說,length屬性不過濾空位。所以,使用length屬性進行數組遍歷,一定要非常小心。