《JavaScript語言精粹》學習筆記——附錄A.毒瘤

作者的意思是需要特殊注意的部分。

1、全局變量

JavaScript 依賴全局變量。定義全局變量的三種方式,儘量減少全局變量的使用。

第一種,在任何函數之外放置一個 var 語句。

var foo = value;
第二種,直接給全局變量增加一個屬性,在 web 瀏覽器中,全局對象名爲 window。

window.foo = value;
第三種,直接使用未聲明的變量,被稱爲隱式的全局變量

foo = value ;
2、作用域

JavaScript 採用了塊語法,卻沒有提供塊級作用域:代碼塊中聲明的所有變量在包含此代碼塊的函數的任何位置是可見的。在JavaScript中,聲明變量最好的方式是在每個函數的開頭部分聲明所有變量。

3、自動插入分號

這是 JavaScript 的自動修復機制。把 { 放在上一行的尾部而不是下一行的頭部,避免這種方式帶來的錯誤

4、保留字

保留字不能用來命名變量或參數。當保留字作爲對象字面量的鍵值時,它們必須被引號括起來,而不能被用在點表示法中。

var method ;                // ok
var class ;                 // 非法
object = {box: value};      // ok
object = {case: value};     // 非法
object = {'case': value};   // ok
object.box = value;         // ok
object.case = value;        // 非法
object['case'] = value;     // ok
5、Unicode

Unicode 認爲一對字符是一個字符,而 JavaScript 認爲一對字符是兩個不同的字符。

6、typeof

typeof  null 等於 'object',不能識別 null 和 object。可使用以下方式來識別 null 和 對象

typeof null  // 返回 'object'
if ( my_value && typeof my_value === 'object'){   // null 值爲假
         // my_value 是一個對象或數組
}
7、parseInt

parseInt 函數將字符串轉換爲整數,在遇到非數字時停止,但是遇到非數字時不會給出提示或額外文本。

由 '0' 開頭的字符串,會基於八進制來求值,八進制中 8 和 9 不是數字,因此 parseInt("08") 和  parseInt("09") 都產生 0 的結果。建議總是加上第二個參數——基數, parseInt("08",10) 的結果爲 8。

8、+

+ 運算符可以用於加法運算或字符串連接。如果想使用 + 做加法運算,請保證兩個運算數都是整數。

9、浮點數

0.1 + 0.2 不等於 0.3,小數位的運算是不精確的,浮點數中整數運算是精確的。

10、NaN

NaN 是一個特殊的數量值。typeof 不能區別 數字和 NaN,而且 NaN 也不等同於它自己。

typeof NaN === 'number' // true<pre name="code" class="javascript">NaN === NaN  // true
NaN !==  NaN  // true


JavaScript 提供了一個函數,可以辨別數字和 NaN。

isNaN(NaN)      // true
isNaN(0)        // false
isNaN('oops')   // true
isNaN('0')      // false

isFinite 函數會篩掉 NaN 和 Infinity ,但是不能識別參數是不是數值。結合一下,判斷是不是數值:

var isNumber = function isNumber (value) {
         return  typeof value === 'number'  &&  isFinite(value);   // 先判斷是不是數值,再篩掉 NaN 和 Infinity
}

11、僞數組

JavaScript 沒有真正的數組。typeof 不能識別數組和對象,要識別數組,可檢查它的 constructor 屬性:

if (my_value && typeof my_value === 'object' && my_value.constructor === Array){
        // my_value 是一個數組
}
但不能識別在不同幀或窗口中創建的數組,結果爲false。可以檢測對象的原型來判斷是不是數組:

if (object.prototype.toString.apply(my_value) ==== '[ object Array] '){
        // my_value 確實是一個數組
}
argument 不是一個真正的數組。
12、假值

JavaScript 擁有6個假值,這些值全都等於假,但這些值不能互換,就是不相等。

undefined 和 NaN 在 IE8 及以下的 IE 瀏覽器不是常量,而是全局變量,其值可以被更改,這是非常可怕的一件事。

類型
0
Number
NaN(非數字) Number
' ' (空字符串) String
false Boolean
null Object
undefined Undefined








13、hasOwnProperty

hasOwnProperty 是一個方法,而不是一個運算符,在任何對象中,可能會被一個不同的函數甚至一個非函數的值所替代。

14、對象

JavaScript 的對象永遠不會是真的空對象,因爲它們可能從原型鏈中取得成員屬性。爲了避免這個原因帶來的問題,用 hasOwnProperty 方法檢測成員關係,或者查找指定的類型。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章