本篇對這本書的附錄進行摘要。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,避免使用它!