亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

理解 typed array

_Zhao / 3302人閱讀

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

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

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

typed array在內(nèi)部設(shè)計(jì)時(shí)分成了兩部分:bufferviewbuffer層表示內(nèi)存中的數(shù)據(jù)塊,view負(fù)責(zé)提供操作數(shù)據(jù)塊的接口。

ArrayBuffer

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

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

var buffer = new ArrayBuffer(8);

我們還可以通過(guò)byteLength訪問(wèn)該實(shí)例的內(nèi)存大?。?/p>

console.log(buffer.byteLength) // 8

使用slice方法創(chuàng)建一個(gè)新的實(shí)例,其內(nèi)容復(fù)制原ArrayBuffer實(shí)例中的部分內(nèi)容。

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

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

但是ArrayBuffer并不提供對(duì)內(nèi)存讀寫的方法。如果要對(duì)該內(nèi)存塊進(jìn)行操作,需要用到另一個(gè)類DataView。

DataView

DataView類提供了訪問(wèn)ArrayBuffer的接口。其語(yǔ)法如下:

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

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

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

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

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

typed array

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

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

下面看一個(gè)例子來(lái)加深對(duì)typed array的理解

var buffer = new ArrayBuffer(16) //創(chuàng)建16b的內(nèi)存區(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是一個(gè)ArrayBuffer實(shí)例,表示一塊16b的內(nèi)存區(qū)。同時(shí)創(chuàng)建了兩個(gè)typed array,分別是32位和16位的。區(qū)別在于使用32位的訪問(wèn)buffer時(shí),會(huì)把buffer(16b)以32位為單位劃分為4個(gè)元素,讀寫都是以32位為單位進(jìn)行的。16位的進(jìn)行訪問(wèn)時(shí),會(huì)把buffer(16b)以16位為單位劃分為8個(gè)元素,每次讀寫都是16位。

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

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

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

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

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

總結(jié)

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

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/90116.html

相關(guān)文章

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

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

    Worktile 評(píng)論0 收藏0
  • 怎么避免寫出爛代碼

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

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

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

    張紅新 評(píng)論0 收藏0
  • 讀 Zepto 源碼之內(nèi)部方法

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

    Freelander 評(píng)論0 收藏0
  • 深入淺出redux學(xué)習(xí)(-)

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

    xietao3 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<