正式開始前需要聲明,本文并不是要講解 JavaScript 數組基礎知識,也不會涉及語法和使用案例。本文講得更多的是內存、優化、語法差異、性能、近來的演進。

在使用 JavaScript 前,我對 C、C++、C# 這些已經頗為熟悉。與許多 C/C++ 開發者一樣,JavaScript 給我的第一印象并不好。
Array 是主要原因之一。JavaScript 數組不是連續(contiguous)的,其實現類似哈希映射(hash-maps)或字典(dictionaries)。我覺得這有點像是一門 B 級語言,數組實現根本不恰當。自那以后,JavaScript 和我對它的理解都發生了變化,很多變化。
為什么說 JavaScript 數組不是真正的數組
在聊 JavaScript 之前,先講講 Array 是什么。
數組是一串連續的內存位置,用來保存某些值。注意重點,“連續”(continuous,或 contiguous),這很重要。

上圖展示了數組在內存中存儲方式。這個數組保存了 4 個元素,每個元素 4 字節。加起來總共占用了 16 字節的內存區。
假設我們聲明了 tinyInt arr[4];,分配到的內存區的地址從 1201 開始。一旦需要讀取 arr[2],只需要通過數學計算拿到 arr[2] 的地址即可。計算 1201 + (2 X 4),直接從 1209 開始讀取即可。

JavaScript 中的數據是哈希映射,可以使用不同的數據結構來實現,如鏈表。所以,如果在 JavaScript 中聲明一個數組 var arr = new Array(4),計算機將生成類似上圖的結構。如果程序需要讀取 arr[2],則需要從 1201 開始遍歷尋址。
以上急速 JavaScript 數組與真實數組的不同之處。顯而易見,數學計算比遍歷鏈表快。就長數組而言,情況尤其如此。
JavaScript 數組的進化
不知你是否記得我們對朋友入手的 256MB 內存的電腦羨慕得要死的日子?而今天,8GB 內存遍地都是。
與此類似,JavaScript 這門語言也進化了不少。從 V8、SpiderMonkey 到 TC39 和與日俱增的 Web 用戶,巨大的努力已經使 JavaScript 成為世界級必需品。一旦有了龐大的用戶基礎,性能提升自然是硬需求。
實際上,現代 JavaScript 引擎是會給數組分配連續內存的 —— 如果數組是同質的(所有元素類型相同)。優秀的程序員總會保證數組同質,以便 JIT(即時編譯器)能夠使用 c 編譯器式的計算方法讀取元素。
不過,一旦你想要在某個同質數組中插入一個其他類型的元素,JIT 將解構整個數組,并按照舊有的方式重新創建。
因此,如果你的代碼寫得不太糟,JavaScript Array 對象在幕后依然保持著真正的數組形式,這對現代 JS 開發者來說極為重要。
此外,數組跟隨 ES2015/ES6 有了更多的演進。TC39 決定引入類型化數組(Typed Arrays),于是我們就有了 ArrayBuffer。
ArrayBuffer 提供一塊連續內存供我們隨意操作。然而,直接操作內存還是太復雜、偏底層。于是便有了處理 ArrayBuffer 的視圖(View)。目前已有一些可用視圖,未來還會有更多加入。
var buffer = new ArrayBuffer(8); var view = new Int32Array(buffer); view[0] = 100;
另外有需要云服務器可以了解下創新互聯scvps.cn,海內外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業上云的綜合解決方案,具有“安全穩定、簡單易用、服務可用性高、性價比高”等特點與優勢,專為企業上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。
本文名稱:JavaScript數組的進化與性能分析-創新互聯
當前路徑:http://www.yijiale78.com/article28/djjecp.html
成都網站建設公司_創新互聯,為您提供域名注冊、響應式網站、手機網站建設、移動網站建設、網站設計、網站營銷
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯