《JavaScript語言精粹》—— 讀書總結


話說這本書還是同學的推薦才讀的,之前感覺這本書太薄了,不值得看,沒想到小身材有大智慧,書中的內容總結的還是很到位的!所以就把最后幾章,精華的部分整理整理。

優美的特性

函數是頂級對象

在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綁定到全局對象中,造成污染。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM