javascript語言精粹

對象

  • 對象屬性的名字能夠是空字符串,屬性值能夠是undefined(原文爲屬性值能夠是除undefined之外的任何值,可是測試能夠爲undefined)。數組

  • 嘗試從undefined的屬性中取值會致使TypeError,能夠經過&&運算符避免。(obj.name && obj.name.oldName)瀏覽器

函數

  • 調用一個函數會暫停當前函數的執行,控制權轉交給新的函數。每一個函數都接受兩個附加的參數:thisargumentsthis有四種調用狀況再也不贅述。閉包

  • 當一個函數運行時,它從第一個語句開始執行,並在遇到關閉函數體的}時結束。return語句可使函數提早返回,中斷函數的運行。app

  • throw語句也能中斷函數的執行,而且拋出一個錯誤對象。函數

  • 函數總會返回一個值。若是沒有指定返回值,則返回undefined。(任何語句都會返回值,在瀏覽器console面板執行語句後的值就是返回值)。圖片描述性能

  • 柯里化延遲調用,把函數看作一個值,在函數以前傳遞。測試

  • 遞歸優化: 記憶。利用閉包創建一個儲存區,避免重複運算。如優化

var fibonacci = function (n){
    return n < 2 ? n : fibonacci(n - 1) + fibonacci(n - 2);
  }

  // 本身的代碼
  var fibonacci = (function (){
    var memo = {};
    return function (n){
      if (n < 2) {
        return n;
      }
      if (!memo[n]) {
        memo[n] = fibonacci(n-1)+fibonacci(n-2);
      }
      return memo[n];
    }
    })()
    
   // 書上原版
   var fibonacci = function () {
     var memo = [0, 1];
     var fib = function (n) {
       var result = memo[n];
       if (typeof result !== 'number') {
         result = fib(n - 1) + fib(n - 2);
         memo[n] = result;
       }
       return result;
     };
     return fib;
   }();

而後本身測試了一下性能,在大量運算的時候確實很厲害。一開始傳了個100進去,而後瀏覽器就卡死了。。。圖片描述
此外書中還提供了一個包裝函數以下:this

var memoizer = function(memo, formula) {
    var recur = function(n) {
      var result = memo[n];
      if (typeof result !== 'number') {
        result = formula (recur, n);
      }
      return result;
    }
    return recur;
  }

  例如調用一個階乘函數: var factorial = memoizer([1, 1], function(recur, n) {
    return n * recur (n - 1);
    })

區別數組和對象的好方法。Object.prototype.toString.apply(someObj) 返回一個'[object Array]'或者'[object Object]'.用constructor不肯定性太多。instanceof在iframe狀況下不能正常工做。Array.isArray()也是極好的,只是IE8下不兼容。spa

方法

  • array.slice方法對array中的一段作淺複製,[obj,obj]中的對象改變會反應在兩個數組上。

  • array.shift方法要比array.pop慢上30%左右。

毒瘤

  • 自動插入分號,如:

    return
      {
        some: 1
      }
     // 直接執行了 return;
  • typeof null返回'object'

其它的一些缺點由於已經習慣了就沒放上來了。

相關文章
相關標籤/搜索