成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

理解 typed array

_Zhao / 3248人閱讀

摘要:在內部設計時分成了兩部分和。層表示內存中的數(shù)據(jù)塊,負責提供操作數(shù)據(jù)塊的接口。也就是說通過創(chuàng)建內存塊,通過實現(xiàn)對內存塊的讀寫操作。很顯然中的結果是。有同學可能對輸出的順序不理解,覺得為什么不是呢。上例在小端模式下的存儲形式,每個框框表示位。

我們知道在C語言中,可以使用mallocfree方法來分配和釋放內存。隨著web的發(fā)展中,js在ES6中新增了內存操作的支持。其實現(xiàn)方式就是---typed array。

typed array是個集體的概念。int8Array,Uint8Array,int16Array,Uint16Array等統(tǒng)統(tǒng)等稱為typed array。通過這些類,開發(fā)者可以方便地讀寫內存中的二進制數(shù)據(jù)。

typed array在內部設計時分成了兩部分:bufferview。buffer層表示內存中的數(shù)據(jù)塊,view負責提供操作數(shù)據(jù)塊的接口。

ArrayBuffer

buffer層的底層實現(xiàn)就是基于ArrayBuffer類。ArrayBuffer的功能與malloc類似,為用戶分配一塊內存。

創(chuàng)建一個ArrayBuffer實例很簡單,它接收一個參數(shù),參數(shù)表示要分配多大的一塊內存區(qū)域,字節(jié)為單位。下面的代碼片段,分配了一塊8字節(jié)的內存區(qū):

var buffer = new ArrayBuffer(8);

我們還可以通過byteLength訪問該實例的內存大?。?/p>

console.log(buffer.byteLength) // 8

使用slice方法創(chuàng)建一個新的實例,其內容復制原ArrayBuffer實例中的部分內容。

var buf2 = buffer.slice(0,2);

創(chuàng)建一個新的實例,分配2字節(jié)大小的內存,其內容復制buffer中索引為0和1的內存中的數(shù)據(jù)。

但是ArrayBuffer并不提供對內存讀寫的方法。如果要對該內存塊進行操作,需要用到另一個類DataView。

DataView

DataView類提供了訪問ArrayBuffer的接口。其語法如下:

new DataView(buffer [, byteOffset [, byteLength]])

首先接收一個必傳的buffer對象,該對象就是DataView實例接下來將要操作的內存塊。其次是一個可選的byteOffset,該參數(shù)表示DataView實例要操作的buffer對象的開始位置。最后的參數(shù)指定要操作的buffer對象中元素的個數(shù)。
下面的代碼片段演示了DataView如何操作ArrayBuffer

var buffer = new ArrayBuffer(16);
var dv = new DataView(buffer, 0);

dv.setInt16(1, 42);
dv.getInt16(1); //42

示例中創(chuàng)建了一個DataView實例,該實例將buffer作為被操作的內存塊,并且指定該內存塊的16個字節(jié)都位于可操作區(qū)。
接著調用setInt16方法向從buffer的第2個字節(jié)開始存儲帶符號的16位整數(shù)。調用getInt16方法讀出位于第2個字節(jié)處的帶符號的16位整數(shù)。

typed array

如上所述,typed array的實現(xiàn)是組合了ArrayBufferDataView。也就是說typed array 通過ArrayBuffer創(chuàng)建內存塊,通過DataView實現(xiàn)對內存塊的讀寫操作。

typed array提供了多個類實現(xiàn)對同一塊內存中的二進制數(shù)據(jù)按照不同的位數(shù)格式進行讀寫。如使用int8Array從內存中以帶符號的8位整數(shù)的形式讀寫數(shù)據(jù)。

下面看一個例子來加深對typed array的理解

var buffer = new ArrayBuffer(16) //創(chuàng)建16b的內存區(qū)
var int32View = new Int32Array(buffer);
var int16View = new Int16Array(buffer);

for (var i = 0; i < int32View.length; i++) {
  int32View[i] = i * 2;
  console.log(int32View[i]); // 0, 2, 4, 6
}

for (var i = 0; i < int16View.length; i++) {
  console.log(int16View[i]); // 0, 0, 2, 0, 4, 0, 6, 0
}

buffer是一個ArrayBuffer實例,表示一塊16b的內存區(qū)。同時創(chuàng)建了兩個typed array,分別是32位和16位的。區(qū)別在于使用32位的訪問buffer時,會把buffer(16b)以32位為單位劃分為4個元素,讀寫都是以32位為單位進行的。16位的進行訪問時,會把buffer(16b)以16位為單位劃分為8個元素,每次讀寫都是16位。

第一個循環(huán)中,我們使用int32Viewbuffer中的4個元素中分別寫入了0,2,4,6 4個整數(shù)。
很顯然console中的結果是0,2,4,6。

第二個循環(huán)中,我們使用int16View以16位的格式讀取同一塊內存,可以想象原來的4個元素變成了8個元素,因此讀出的時候也會將原來的32位元素拆分為2個16位元素。因此console中的結果是0,0,2,0,4,0,6,0

有同學可能對輸出的順序不理解,覺得為什么不是0,0,0,2,0,4,0,6呢。這里稍微解釋一下。
原因是默認情況下typed array 讀取數(shù)據(jù)的時候都是以小端模式來返回的。

所謂的小端模式(Little-endian),是指數(shù)據(jù)的高字節(jié)保存在內存的高地址中,而數(shù)據(jù)的低字節(jié)保存在內存的低地址中,這種存儲模式將地址的高低和數(shù)據(jù)位權有效地結合起來,高地址部分權值高,低地址部分權值低,和我們的邏輯方法一致。

上例在小端模式下的存儲形式,每個框框表示16位。小端模式下數(shù)據(jù)的位權和地址的順序是一致的,從小到大排列。

總結

typed array提供了一組讀取不同字長的類數(shù)組對象如,int8Array,int16Array,int64Array來實現(xiàn)對內存的操作。typed array的底層實現(xiàn)是基于ArrayBufferDataView實現(xiàn)的,對內存的分配和內存的讀取做了很好的分層設計。使用typed array使js向C語言等具備了操作二進制數(shù)據(jù)的能力。

文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉載請注明本文地址:http://systransis.cn/yun/90116.html

相關文章

  • 對類型化數(shù)組(Typed Array)與ArrayBuffer的理解

    摘要:類型化數(shù)組也是中新引入的。用一句話解釋類型化數(shù)組就是它是操作二進制數(shù)據(jù)的接口。類型化數(shù)組類型化數(shù)組的應用二進制數(shù)據(jù)的接口主要應用于文件,在中涉及文件處理的幾乎都可以應用,主要是,,。 類型化數(shù)組(Typed Array)也是HTML5中新引入的API。用一句話解釋類型化數(shù)組就是:它是JS操作二進制數(shù)據(jù)的接口。 眾所周知,直接操作二進制數(shù)據(jù)可以使程序更為高效, 盡管JS對常規(guī)數(shù)組做了很多...

    Worktile 評論0 收藏0
  • 怎么避免寫出爛代碼

    摘要:例外回調函數(shù)生命周期函數(shù)框架級別函數(shù)說明函數(shù)的命名需要體現(xiàn)內部工作值變量以動詞命名容易讓人誤解為是一個匿名函數(shù)以名詞開頭,看不明白什么有什么功能時態(tài)不對規(guī)則避免使用拼音或者縮寫命名。前端代碼處理錯誤的方式一般為提示用戶有異常發(fā)生。 命名 規(guī)則:除非在小于 5 行的函數(shù)里,否則不要使用單字命名變量 說明:含義不清晰,不能做到「望文生義」 BadCode var l = data.leng...

    yuanxin 評論0 收藏0
  • JS學習理解之閉包和高階函數(shù)

    摘要:閉包的形成與變量的作用域以及變量的生存周期密切相關?,F(xiàn)在我們把變量用閉包封閉起來,便能解決請求丟失的問題二高階函數(shù)高階函數(shù)是指至少滿足下列條件之一的函數(shù)?;卣{函數(shù)在異步請求的應用中,回調函數(shù)的使用非常頻繁。 一、閉包 對于 JavaScript 程序員來說,閉包(closure)是一個難懂又必須征服的概念。閉包的形成與變量的作用域以及變量的生存周期密切相關。下面我們先簡單了解這兩個知識...

    張紅新 評論0 收藏0
  • 讀 Zepto 源碼之內部方法

    摘要:調用函數(shù),判斷返回的類型字符串,就知道是什么數(shù)據(jù)類型了判斷是否為瀏覽器的對象要為對象首先要滿足的條件是不能為或者,并且為自身的引用。必須存在中必須存在屬性返回的值調用函數(shù),返回的數(shù)據(jù)類型。 數(shù)組方法 定義 var emptyArray = [] concat = emptyArray.concat filter = emptyArray.filter slice...

    Freelander 評論0 收藏0
  • 深入淺出redux學習(-)

    摘要:只要輸入的值不變,每次輸出都是一樣的值。指定位置元素運算操作如可用以下方式代替主要是生成中最核心的對象。描述發(fā)生了什么,是響應并對進行更新。生成的對象包含個方法,分別為,和。按照約定,具有字段來表示它的類型。 前言: 一開始接觸redux的時候最令我記住的一句話是:You Might Not Need Redux(那我還寫這篇文章干嘛?手動滑稽) 回歸正題,本文主要是圍繞redux...

    xietao3 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<