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