Notes - JavaScript: The Good Parts
《JavaScript-優良部分》(JavaScript: The Good Parts)
頁碼對應於 2008.09 出版的繁中本
由於時代久遠,所以裡面很多東西都算是非常常識了,但我還是把它們列進此筆記
(由於 gitbook 排版問題,以下原版 Evernote 筆記不改排版直接放進來)
p. 17 如果第一個運算元估算為 false,&& 運算子產生他的第一個運算元的值。否則產生第二個運算元的值。 如果第一個運算元估算為 true , || 運算子產生他的第一個運算元的值。否則產生第二個運算元的值。 p. 23 若 flight.equipment //undefined flight.equipment.model //"TypeError" 但 flight.equipment && flight.equipment.model //undefined(利用 && 來避免出現 TypeError) p. 25 for in 敘述傳回的順序會改變 p. 34 for in 和原型的互動很差,可以改用 hasOwnProperty 方法來遮擋被繼承的特性 p. 29 this 的設計錯誤 p. 32 arguments 也是個設計錯誤:它不是陣列,而是個像陣列的物件 p. 32 函式(function)一定會回傳某個值。如果沒有指定 return 值,則回傳 undefined。 如果函式呼叫時附有字首詞 new,而且 return 值不是物件,改為回傳 this(新物件)。 p. 34 教你加 method 的方法 Function.prototype.method = function(name, func) { if (!this.prototype[name]) { this.prototype[name] = func } return this } String.method('trim', function(){ return this.replace(/^\s+|\s+$/g, '') }) p. 36 遞迴 p. 71 巢狀的正規表示式可能會造成效能問題 p. 81 開始講解一些方法的小知識 - Array - concat 是淺層複本(shallow copy) - 如果要附加的東西是個物件,則會把物件的每個元素均單獨附加 - 回傳值就是你預期的新 array - slice 是指定部分 array 淺層複本(shallow copy) - 不要和 splice 搞混了 - push - 如果要附加的東西是個 物件,則會整坨加進去成為一個元素 - 回傳值是 array 的新長度 - pop - 移除 array 的最後一個元素 - 回傳值就是那個被移除的元素 - array 如果是 empty,則回傳 undefined - shift - 移除 array 的第一個元素 - 回傳值就是那個被移除的元素 - array 如果是 empty,則回傳 undefined - 速度通常比 pop 慢很多 - unshift - 從 array 的頭 push 進去 - 回傳值是 array 的新長度 - splice - 移除 array 的幾個元素並插入新增的 - 回傳值是被刪除元素組成的 array - join - 用 join 來組合大量片段產生字串,會比用 + 運算子快 - reverse - 把 array 反轉,並回傳 array - sort - 因為把元素都轉成字串來比較,所以沒任何屁用 - p. 82-83 作者講解的程式碼可以看一看 - Function - apply - Number - toExponential(fractionDigits) - 把 number 轉成 指數形式的字串 - fractionDigits 參數範圍在 0-20 之間 - toFixed(fractionDigits) - 把 number 轉成 十進位形式的字串 - fractionDigits 參數範圍在 0-20 之間,預設為 0 - toPrecision(precision) - 把 number 轉成 十進位形式的字串,控制整串的位數 - precision 參數範圍在 1-21 之間 - toString(radix) - 把 number 轉為字串 - radix 就看你是要用幾進位,預設是十進位 - Object - hasOwnProperty - 它不會沿著特性鏈往上找 - RegExp - exec(string) - 很強大但也很慢的方法...XD - test(string) - 最簡單也最快的方法 - 請勿和 g 旗標一起使用 - String p. 93 - charAt(pos) - 回傳值就是一個 charater,不過 JS 沒有 character type 所以其實就是長度為 1 的 String 而已 - charCodeAt(pos) - 回傳值就是該字元的 code point(一個整數) - concat - 這個沒人在用因為用 + 就好 - indexOf(searchString, position) - 回傳值是位置,找不到就回傳 -1 - localeCompare - 好像根本不要用!? - match(regexp) - 它的行為,取決於旗標 g - 如果沒有 g,則和regexp.exec(string) 沒有差別 - 如果有 g,就會產生符合的陣列 - replace - 北爛 - search - 和 indexOf 類似,但接受的參數是正規式物件 - slice - 請參考 array.slice - substring - 我們沒有使用它的理由 - split - 用來分割的參數如果使用正規式的話,有些實作會阻止空字串 - toLocaleLowerCase - 為考慮土耳其語的方法!? - toLowerCase/toUpperCase - 轉換大小寫 - fromCharCode - 將一組數值轉成字串 p. 104 作者自創的 JavaScript 子集的美 - 函式作為 firortranst 類別物件 - 函式是具有語彙範圍(lexical scoping)的 lambda - 具有原型繼承的動態物件 - 物件不獸類別的限制。用普通的指定就可以新增成員到任何物件 - 物件實字與陣列實字 附錄 糟糕的部分 - 強迫中獎的全域變數 - 區塊的超廣範圍 - 自動安插分號的機制 - 所以最好不要讓 { 獨立一行 - 一堆沒人在用的保留字 - Unicode - Unicode 把 字元對 視為一個字元 - JavaScript 把 字元對 視為兩個字元... - typeof 沒屁用 - parseInt 沒屁用 - + - 使用時務必確認運算元是什麼 - 浮點數 - 最有名:0.1 + 0.2 不會等於 0.3 - NaN - ... - 偽陣列 - JavaScript 沒有真正的陣列。雖然不見得是壞事 - 效能和真正的陣列相比,是滿差的 - false - 你永遠不知道那東西是不是 false XD - hasOwnProperty - 因為它是個方法,所以有可能被替換成其他函式... - 物件 - JavaScript 的物件從未真正為空 不良的部分 - == 的強制改型別 - with - 不要用 - eval 不要用 - Function 的建構式是 eval 的另一個形式,所以也不要用 - continue 不要用 - switch 不要用 - 原因:案例掉落(fall through) - 不要使用 ++、-- - 這樣程式會比較好看(?) - bitwise 運算子 - 速度很慢,真的沒有必要使用 - 而且也不好看 - 不要用系列 - 不要用 new Boolean - 不要用 new Number - 不要用 new String - 不要用 new Object,用 {} - 不要用 new Array,用 [ ] - void - 不知道是啥反正不要用
Last updated