話說這本書還是同學的推薦才讀的,之前感覺這本書太薄了,不值得看,沒想到小身材有大智慧,書中的內容總結的還是很到位的!所以就把最后幾章,精華的部分整理整理。
優美的特性
函數是頂級對象
在JS中,沒有塊級作用域,都是以函數為最小的作用域,這樣就可以把所有的變量放在函數的頂級聲明。同時,也需要注意for循環,與java的使用方法就不一樣了。即便是在for循環的體內,或者if語句中,聲明的變量也是函數級別的。
而函數會延長作用域的范圍,也就衍生出閉包這種概念,詳細的還應該去參考《JS高級程序設計》,那里面講的比較詳細。
基於原型繼承的動態對象
JS中沒有像java一樣的面向對象,但是可以通過prototype進行繼承,不過直接使用prototype,會導致所有的派生對象都共同使用prototype的屬性或者方法。因此在寫面向對象的代碼時,要注意此類問題。
毒瘤
全局變量
在JS中有三種聲明變量的方式:
第一種,使用var語句聲明:
var foo = value;
第二種,直接給全局對象添加屬性
window.foo = value;
第三種,直接使用未聲明的變量
foo = value;
自動插入分號
有時候js會自動為我們加入分號,比如:
return
{
status:true
};
有可能被解析成這樣:
return ;
{
status : true
};
因此應該保持這種風格:
return {
status:true
};
typeof並不是萬能的
檢測null,最好的方法
value === null
偽數組
js沒有真正的數組,因此不會越界出錯。但是檢測的時候有些麻煩,最可靠的辦法是:
if(Object.prototype.toString.apply(my_value) === '[object Array]'){}
假值
Number : 0 NaN
String : ''
Boolean: false
Object : null
Undefined : undefined
糟粕
==
和!=經常會出現強制轉換,再進行比較。因此為了避免出錯,比較值時,應該使用=和!==
with
with語句的結果有時,很難預料。
eval
無論是性能,還是處於安全,都不推薦使用
continue
如果去掉它,會發現性能有所提升
switch
case條件可能不會跳出,而繼續執行。
缺少塊
if(ok)
test1();
test2();
這種代碼有時是因為粗心,有時會給別人帶來困惑。不知道是想要執行test1(),還是兩個都執行。
位運算符
在javascript中,由於並不是像c或者java能接觸機器底層,因此位運算也就沒有那么高效了。
new
在new的時候,是創建一個繼承於運算符后賣弄的對象,然后調用該運算符,把新對象綁定給this。但是如果忘記加new,則會把this綁定到全局對象中,造成污染。