1. 程式人生 > >高效能 JavaScript 讀書筆記 (二)

高效能 JavaScript 讀書筆記 (二)

資料存取

字面量、本地變數、陣列元素、物件成員

字面量只代表自身,不儲存在特定的位置。JavaScript 中的字面量有:字串、數字、布林值、物件、陣列、函式、正則表示式以及特殊的 null 和 undefined 值。

一般來說,訪問本地變數和字面量的事件較少,訪問陣列元素和物件成員花費時間較多。

訪問區域性變數的時間比全域性變數的時間少。

還有一點,從伺服器獲取的資料、陣列的長度之類的變數最好用一個變數儲存起來,這樣再次訪問的時候就相當於直接訪問區域性變數,否則計算會消耗部分效能。

瀏覽器中的 DOM

DOM 和 JavaScript 相當於兩個島嶼,因此 ECMAScript 每次訪問 DOM ,都需要耗費時間和精力。

因此想要提高效能,減少 ECMAScript 和 DOM  之間的互動也是知識點的一部分。

DOM 訪問與修改

在不影響功能的情況下,儘可能減少對 DOM 的訪問,能只訪問一次決不訪問多次。

innerHTML 對比 DOM 方法

最新研究表明,innerHTML 比 document.createElement() 方法快。

HTML  集合

昂貴的集合

document.getElementsByName()

document.getElementsByClassName()

document.getElementsByTagName()

document.images   頁面中所有 img 元素

document.links  所有 a 元素

document.forms 所有表單元素

document.forms[0].elements 頁面中第一個表單種的所有欄位

以上方法和屬性的返回值就是 HTML 集合物件,是一個類似陣列的列表。他們並不是真正的陣列,因為他們沒有 push() 或者 slice() 之類的方法。

但他們提供了一個類似陣列中的 length 屬性,可以通過數字索引的方式訪問列表種的元素。

***** 但實際上,這種方法非常昂貴。這樣最意味著 javascript 和 dom 元素一直保持著連線。每次需要最新資訊時,都會重複執行查詢的過程。即使你只是想獲取集合的長度,也會查詢。因此,這種做法非常低效

****

我們可以接收一個集合,將它放到陣列中。

var coll = document.getElementsByTagName('div');

var ar = toArray(coll);

訪問集合元素時使用區域性變數

當遍歷一個集合時,第一優化原則是把集合儲存在區域性變數中,並把 length 快取在迴圈外部,然後,使用區域性變數替代這些需要多此讀取的元素。

function collectionNodeLocal(){

    var coll = document.getElementsByTagName('div'),
    len = coll.length,
    name = '',
    el = '',
    
    for(var count = 0; count < len; count ++){
        el = coll[count];
        name = el.nodeName;
        name = el.nodeType;
        name = el.tagName;
    }

    return name;
}

// 其實我感覺 這段 name 的程式碼好像有點錯誤,但是書上原文是這樣子。意思表達的就是儘可能的化遍歷量為常量,減少迴圈次數吧

 

獲取 DOM 元素

新提供的 querySelectorAll() 比 getElementById() 和 getElementsByTagName() 更好控制。

例如如下程式碼:

var elements = document.querySelectorAll('#menu a');

elements 的值包含一個引用列表,指向位於 id  = "menu" 的元素之中的所有 a 元素。

 

待續。