對象屬性的名字能夠是空字符串,屬性值能夠是undefined
(原文爲屬性值能夠是除undefined
之外的任何值,可是測試能夠爲undefined
)。數組
嘗試從undefined
的屬性中取值會致使TypeError
,能夠經過&&
運算符避免。(obj.name && obj.name.oldName)
瀏覽器
調用一個函數會暫停當前函數的執行,控制權轉交給新的函數。每一個函數都接受兩個附加的參數:this
和 arguments
。this
有四種調用狀況再也不贅述。閉包
當一個函數運行時,它從第一個語句開始執行,並在遇到關閉函數體的}
時結束。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'
。
其它的一些缺點由於已經習慣了就沒放上來了。