《重構》、《js高階程式設計》一些筆記知識點
阿新 • • 發佈:2022-12-05
《重構(第2版) : 改善既有程式碼的設計》
1. 函式命名:以它“做什麼”來命名,而不是以它“怎麼做”來命名。
- 一個改進函式名字的好方法:先寫一句註釋描述這個函式的用途,再把這句註釋變成函式的名字;
2. 每當看見一段程式碼在同時處理兩件不同的事,我就想把它拆分成各自獨立的模組,因為這樣到了需要修改的時候,我就可以單獨處理每個主題,而不必同時在腦子裡考慮兩個不同的主題。
- 最簡潔的拆分方法之一,就是把一大段行為分成順序執行的兩個階段。
- 你常能見到一些身兼多職的迴圈,它們一次做了兩三件事,不為別的, 就因為這樣可以只迴圈一次。但如果你在一次迴圈中做了兩件不同的事,那麼每當需要修改迴圈時,你都得同時理解這兩件事情。
3. 分解條件表示式
- 在帶有複雜條件邏輯的函式中,程式碼(包括檢查條件分支的程式碼和真正實現功能的程式碼)會告訴我發生的事,但常常讓我弄不清楚為什麼會發生這樣的事。
- 對於條件邏輯,將每個分支條件分解成新函式還可以突出條件邏輯,更清楚地表明每個分支的作用,並且突出每個分支的原因。
4. 將查詢函式和修改函式分離。
《JavaScript高階程式設計:第2版》
1. 檢測型別
- 檢測基礎資料型別 typeof :String, Number, Boolean, undefined (typeof ss)
- 檢測引用型別 instanceof : person instanceof Array/Object/RegExp(引用型別 instanceof Object 會始終返回 true,基本型別 instanceof Object 會始終返回 false)
- 避免和 null 比較。改為 typeof / instanceof;如果是希望物件包含某個特定的方法名,則使用 typeof 確保指定名字的方法存在於物件上。
- 程式碼中的null比較越少,就越容易確定程式碼的目的,並消除不必要的錯誤。
2. 訪問變數屬性
- 點表示法:只可以使用字串 person.name
- 方括號語法:可以使用變數 let ss=name; person[ss]
- 通常,除非必須使用變數來訪問屬性,否則我們建議使用點表示法。
3. 所有物件都有 toLocaleString(), toString(), valueOf() 方法。
4. 重排序方法: reverse(), sort()
- 預設情況下,sort() 按照升序排列陣列項。sort() 會呼叫每個陣列項的 toString() 方法,然後比較得到的字串並排序,即使陣列中的每一項都是數值,sort() 比較的也是字串。
- 因此 sort() 可以接收一個函式作為引數,以便我們指定哪個值排在前面。
5. 在 javascript 中,沒有任何程式碼是立刻執行的,但一旦程序空閒則儘快執行。
- 如設定一個150ms後執行的定時器不代表150ms後代碼立即執行,它表示程式碼會在150ms後被加入到佇列中。如果這個時間點上,佇列中沒有其它東西,那麼這段程式碼就會被執行,表面上看上去好像程式碼就在精確指定的時間點上執行了。其它情況下,程式碼可能明顯地等待更長時間才執行。
6. 函式節流背後的基本思想是指:某些程式碼不可以在沒有間斷的情況連續重複執行。
- 函式節流在 resize 中最常用。
7. 變數和函式命名
- 變數名應為名詞,如 car, person。
- 函式名應該以動詞開頭,如 getName()。 返回布林型別的函式一般以 is 開頭,如 isEnable()。
- 變數和函式都應該使用合乎邏輯的名字,不要擔心長度,長度問題可以通過後處理和雅俗來緩解。
8. 原生的方法比較快:只要有可能,使用原生方法而不是自己重寫一個。(原生方法是c/c++寫的,比js的快很多。
9. switch 語句較快:還可以通過將case語句按照出現概率從大到小來進一步優化 switch 語句。
10. 位運算子比較快: 可以選擇性地用位運算代替算術運算,如取模、邏輯與、邏輯或等。
11. map(), filter(), some(), every(), forEach() 都可以讓陣列的處理變得更簡單。
12. 解構賦值: 當一個物件字面量出現在等號左邊時,就認為它是一個解構賦值。
- var [name, value] = ["color","red"];//一次給2個變數賦值
- var value1 = 5; var value2 = 10; [value1, value2] = [value2,value1];//交換兩個變數的值