《javascript語言精粹》讀書筆記(四)

    本篇對這本書的附錄進行摘要。javascript

附錄A:糟粕java

    A.1全局變量
web

        全局變量是javascript全部糟糕特性中最糟糕的。正則表達式

          全局變量是在全部做用域中都可見的變量。若是某些全局變量碰巧和子程序中的變量名稱相同,那麼他們將互相沖突可能致使程序沒法運行,一般還難以調試。
數組

         定義全局變量有3中方式:
瀏覽器

        (1)脫離任何函數安排一個var語句:安全

var foo=value;

        (2)直接添加一個屬性到全局對象上,若是是web瀏覽器,全局對象名是window:函數

window.foo=value;

        (3)直接使用未經聲明的變量,叫作隱式全局變量:this

foo=value;

                這種隱式聲明全局變量的方式,讓初學者很容易出錯。spa

    A.2做用域

        javascript沒有塊級做用域,只有函數做用域。因此聲明一個變量作好的方式是在函數頂部。

    A.3自動插入分號

        好比一個return語句返回一個值,這個值表達式的開始部分必須和return在同一行上,不然會返回undefined。

return
{
    foo:1
};

          正確的方式爲:

return{
    foo:1
};

    A.4保留字

        保留字不能被用來命名變量或參數。當被用做對象字面量的鍵值時,必須用引號括起來

var o={case:true};    //非法
var o={'case':true};    //正確
o['case'];    //正確
o[case];      //錯誤

    A.5 Unicode

        javascript字符是16位的。Unicode把一對字符視爲單一的字符,而javascript認爲一對字符是2個不一樣的字符。

    A.6 typeof

        typeof沒法檢測出null值:

typeof null=='object';

        typeof對正則表達式的實現也不一致,有的實現是'object',有的是'function'。

    A.7 parseInt

        parseInt在遇到非數字時中止解析,如:

parseInt('12');    //12
parseInt('12 top');    //12

          能夠看到輸出結果是同樣的。

          若是字符串第一位是0,則parseInt會按八進制而不是十進制來解析。因此parseInt('08')會返回0。這樣會在解析日誌或時間時出現問題。解決方法是:在parseInt中再加一個參數:

parseInt("08",10);    //8

    A.8 +

        +運算符能夠作加法運算和字符串鏈接,這取決於參數的類型。

          在作加法的時候,請確保全部參數是整數。

    A.9 浮點數

        二進制的浮點數不能正確的處理十進制的小數,所以0.1+0.2不等於0.3。幸運的是,浮點數的整數運算是精確的,因此小數表現出來的問題能夠經過指定精度避免。

    A.10 NaN

        NaN表示不是一個數字,但下面的表達式是正確的:

typeof NaN === 'number';    //true

        NaN不等於他本身。

NaN === NaN;    //false

        判斷一個值是否可用做一個數字的最佳方法是使用isFinite函數,他會篩除掉NaN和Infinity。能夠這樣定義一個isNumber函數:

function isNumber(value){
    return typeof value === 'number' && isFinite(value);
}

    A.11 僞數組

        javascript沒有真正的數組,數組不會產生越界錯誤。

     A.12 假值

        

        undefined和NaN並非常量,而是全局變量,而且你能夠改變他們的值。千萬不要這樣作。

        A.13 hasOwnProperty(略)

        A.14對象   

            javascript的對象永遠不會用真正的空對象,由於他們能夠從原型鏈中取得成員元素。 


附錄B:雞肋  

        B.1 ==

            ==和!=會在兩個運算數數據類型相同是纔會比較,不然會先強制轉換。

''=='0';    //false
0=='';    //true
0=='0';    //true

false=='false';    //false
false=='0';    //true
false==undefined;    //false
false==null;    //false
null==undefined;    //true

' \t\r\n '==0;    //true

            能夠看到,使用==很是混亂,因此儘可能使用===和!==比較。

        B.2 with--不要使用它!

      B.3 eval--不要使用它!(下降安全性,難以閱讀,效率低)

        B.4  continue--效率低,儘可能不要使用!

      B.5 switch貫穿--難以察覺錯誤,儘可能不要使用!

      B.6 缺乏塊的語句

if(ok)
    t=true;
    advance();

         實際上表達的是:

if(true){
    t=true;
}
advance();

        B.7 ++ --

            儘可能不要使用。

        B.8 位運算符--效率很是低,不要使用!

      B.9 function語句對比函數表達式(略)

      B.10 類型的包裝對象

            不要使用new Boolean(), new Number(), new String()。

          避免使用new Object(), new Array()。可以使用{}和[]來代替。

      B.11 new

            new操做符用來建立一個新對象,並把新建立的對象綁定給了構造器的this對象一旦你忘記了使用new,你獲得的是一個普通函數的調用,這是this就會綁定在了全局對象上,這會帶來很大的問題。並且編譯器也不會報錯或警告。

                因此規定構造函數名首字母要大寫,還有一個更好的方法就是不去使用new。

        B.12 void--這是一個運算符,返回undefined,避免使用它!

相關文章
相關標籤/搜索