ArrayBuffer

了解什麼是ArrayBuffer以及如何使用它 就像Blob是對磁碟上可用數據的不透明表示一樣,ArrayBuffer是對內存中可用位元組的不透明表示。 構造函數接受一個參數,即以位元組為單位的長度: const buffer = new ArrayBuffer(64) ArrayBuffer有一個(只讀)屬性:byteLength,正如其名,表示其長度以位元組為單位。 它還提供了一個slice()實例方法,從現有ArrayBuffer中創建新的ArrayBuffer,接受一個起始位置和一個可選的長度: const buffer = new ArrayBuffer(64) const newBuffer = buffer.slice(32, 8) 通過ArrayBuffer從互聯網下載數據 我們可以使用XHR從互聯網下載blob,並將其存儲到ArrayBuffer中: const downloadBlob = (url, callback) => { const xhr = new XMLHttpRequest() xhr.open('GET', url) xhr.responseType = 'arraybuffer' xhr.onload = () => { callback(xhr.response) } xhr.send(null) }

ArrayBufferView

了解什麼是ArrayBufferView對象以及如何使用它 一個ArrayBufferView是ArrayBuffer的一部分。 它有一個偏移量和一個長度。 一旦創建,它提供了3個只讀屬性: buffer指向原始的ArrayBuffer byteOffset是這個buffer的偏移量 byteLength是它的內容在字節中的長度 Typed Arrays和DataViews都是ArrayBufferView的實例。

DataView物件

了解DataView物件及其使用方法 DataView是一個對ArrayBuffer的視圖,類似於Typed Arrays,但是在這種情況下,數組中的項目可以具有不同的大小和類型。 以下是一個例子: const buffer = new ArrayBuffer(64) const view = new DataView(buffer) 因為這是對緩衝區的視圖,我們可以指定從哪個字節開始,以及長度: const view = new DataView(buffer, 10) //從第10個字節開始 const view = new DataView(buffer, 10, 30) //從第10個字節開始,添加30個項目 如果不添加這些附加參數,則該視圖從位置0開始,並加載緩衝區中的所有字節。 我們可以使用一組方法將數據添加到緩衝區中: setInt8() setInt16() setInt32() setUint8() setUint16() setUint32() setFloat32() setFloat64() 這是如何調用其中一個方法的示例: const buffer = new ArrayBuffer(64) const view = new DataView(buffer) view.setInt16(0, 2019) 默認情況下,數據使用big endian表示。您可以通過添加第三個帶有true值的參數來覆蓋此設置並使用little endian: const buffer = new ArrayBuffer(64) const view = new DataView(buffer) view.setInt16(0, 2019, true) 以下是如何從視圖中獲取數據:...

類型化數組

了解什麼是類型化數組以及如何使用它們 JavaScript提供了8種類型化數組類型: Int8Array:8位有符號整數數組 Int16Array:16位有符號整數數組 Int32Array:32位有符號整數數組 Uint8Array:8位無符號整數數組 Uint16Array:16位無符號整數數組 Uint32Array:32位無符號整數數組 Float32Array:32位浮點數數組 Float64Array:64位浮點數數組 它們都是ArrayBufferView實例。 類型化數組本質上是對ArrayBuffer的一個視圖,其中每個項目的大小和類型相同。 DataView是對ArrayBuffer的另一種視圖,但在這種情況下,數組中的項目可以具有不同的大小和類型。 以下是創建一個8位有符號整數數組的示例: const a = new Int8Array() 您可以預先分配n個字節: const bytes = 1024 const a = new Int8Array(bytes) 主要用途是允許查看ArrayBuffer的內容,因為ArrayBuffer本身是不透明的(我們無法查看其內容)。 下面是如何進行查看: //我們有這個`buffer` ArrayBuffer const a = new Int8Array(buffer) 這些類型化數組類似於數組,因此現在我們可以通過常用的數組訪問技術來查看緩衝區的內容,並且我們可以訪問許多方法和屬性,包括map()、reduce()等。 類型化數組的主要用例是與WebGL、Web Audio或Canvas API一起使用。一些WebGL函數期望使用類型化數組,因為它們比常規JavaScript數組更高效。 需要記住的一點是,類型化數組無法控制字節順序:它使用平台的字節順序。一般來說,這樣做是沒問題的,因為正如我們所說,主要用例是在本地使用數組,使用多媒體API之一。另外,大多數消費型計算機使用小端序(Intel使用該約定)。但是,如果您將類型化數組的數據轉移到使用大端序的系統上,則數據可能編碼錯誤,因此無效。 如果需要對字節順序進行這種控制,請改用DataView。