讀古今文學網 > 編寫高質量代碼:改善JavaScript程序的188個建議 > 建議151:數據存儲要考慮訪問速度 >

建議151:數據存儲要考慮訪問速度

計算機科學的一個經典問題是確定數據應當存放在什麼地方,以實現最佳的讀寫效率。數據存儲在哪裡,關係到代碼運行期間數據被檢索到的速度。在JavaScript中,此問題相對簡單,因為進行數據存儲只有少量方式可供選擇。正如其他語言那樣,數據存儲位置關係到訪問速度。JavaScript中有4種基本的數據存儲位置,下面分別進行介紹。

❑直接量:僅僅代表自己,而不存儲於特定位置。JavaScript的直接量包括字符串、數字、布爾值、對像、數組、函數、正則表達式、具有特殊意義的空值(null)和未定義值(undefined)。

❑變量:使用var關鍵字創建用於存儲的數據值。

❑數組項:具有數字索引,存儲一個JavaScript數組對象。

❑對像成員:具有字符串索引,存儲一個JavaScript對象。

每一種數據存儲位置都具有特定的讀寫操作負擔。在大多數情況下,對一個直接量和一個局部變量數據進行訪問的性能差異是微不足道的。訪問數組項和對像成員的代價要高一些,具體高多少,很大程度上取決於瀏覽器。

早期版本的瀏覽器使用傳統的JavaScript引擎,如Firefox 3、IE 6和Safari 3.2,它們比優化後的JavaScript引擎耗費更多時間。總的來說,直接量和局部變量的訪問速度要快於數組項和對像成員的訪問速度。因此,如果關心運行速度,那麼盡量使用直接量和局部變量,限制數組項和對像成員的使用。

在JavaScript中,數據存儲位置可以對代碼整體性能產生重要影響。數據訪問類型有4種:直接量、變量、數組項、對像成員。它們有不同的性能考慮。

❑直接量和局部變量訪問速度非常快,而數組項和對像成員需要更長時間。

❑局部變量的訪問速度比域外變量快,因為它位於作用域鏈的第一個對像中。變量在作用域鏈中的位置越深,訪問所需的時間就越長。全局變量總是最慢的,因為它們總是位於作用域鏈的最後一環上。

❑避免使用with表達式,因為它改變了運行期上下文的作用域鏈。還應當小心對待trycatch表達式的catch子句,因為catch子句具有同樣效果。

❑嵌套對像成員會造成重大性能影響,盡量少用。

❑一個屬性或方法在原型鏈中的位置越深,訪問它的速度就越慢。

一般來說,可以通過這種方法提高JavaScript代碼的性能:將經常使用的對象成員、數組項和域外變量存入局部變量中。然後,訪問局部變量的速度會快於那些原始變量。通過使用這些策略,可以極大地提高那些需要大量JavaScript代碼的網頁應用的實際性能。