了解TypedArray:如何更高效地處理二進位數據

一、TypedArray是什麼

TypedArray是JavaScript中一系列與ArrayBuffer相關的類型化數組構造函數的集合,支持對二進位數據進行高效處理。主要包括以下幾種類型:

  • Int8Array、Uint8Array、Uint8ClampedArray
  • Int16Array、Uint16Array
  • Int32Array、Uint32Array
  • Float32Array、Float64Array

這些構造函數的目的是為了提供快速、可預測的操作二進位數據的方式。與普通的JavaScript數組相比,TypedArray數組是在底層表示和存儲上更加接近底層二進位數據。因此,在數量龐大的數據處理中,使用TypedArray可以獲得更高的性能和更少的內存開銷。

二、與ArrayBuffer的關係

TypedArray是一系列與ArrayBuffer相關的類型化數組構造函數的集合。因此使用TypedArray最好的方式是先了解一下ArrayBuffer。

ArrayBuffer是一個通用的二進位數據容器,用於存儲二進位數據。它可以與TypedArray一起使用,作為數據輸入和輸出的中介。創建一個ArrayBuffer的方法為:

let buffer = new ArrayBuffer(16);

上面的代碼創建了一個長度為16個位元組的ArrayBuffer。可以通過下標對這個ArrayBuffer進行訪問:

let buffer = new ArrayBuffer(16);
let intArray = new Int32Array(buffer);   // 構造一個Int32Array

intArray[0] = 10;
console.log(buffer);    // ArrayBuffer { byteLength: 16 }

上述代碼將ArrayBuffer作為Int32Array的構造函數的參數進行傳遞,並將Int32Array的第一個元素設置為10。最後輸出的buffer的位元組長度為16。

三、TypedArray中的各種類型

1. Int8Array、Uint8Array、Uint8ClampedArray

這三種類型都是用來處理8位二進位數據的。

  • Int8Array:用於處理8位有符號整數,在-128到127之間。
  • Uint8Array:用於處理8位無符號整數,在0到255之間。
  • Uint8ClampedArray:使用Uint8ClampedArray會強制將不在0到255之間的值截斷,因此適合處理圖像數據等需要精確控制的二進位數據。

以下是三種類型的創建方式:

let int8Array = new Int8Array(8);
let uint8Array1 = new Uint8Array(8);
let uint8Array2 = new Uint8ClampedArray(8);

上述代碼分別創建了一個長度為8的Int8Array、Uint8Array和Uint8ClampedArray。

2. Int16Array、Uint16Array

這兩種類型都是用來處理16位二進位數據的。

  • Int16Array:用於處理16位有符號整數。
  • Uint16Array:用於處理16位無符號整數。

以下是兩種類型的創建方式:

let int16Array = new Int16Array(8);
let uint16Array = new Uint16Array(8);

上述代碼分別創建了一個長度為8的Int16Array和Uint16Array。

3. Int32Array、Uint32Array

這兩種類型都是用來處理32位二進位數據的。

  • Int32Array:用於處理32位有符號整數。
  • Uint32Array:用於處理32位無符號整數。

以下是兩種類型的創建方式:

let int32Array = new Int32Array(8);
let uint32Array = new Uint32Array(8);

上述代碼分別創建了一個長度為8的Int32Array和Uint32Array。

4. Float32Array、Float64Array

這兩種類型都是用來處理浮點型二進位數據的。

  • Float32Array:用於處理32位浮點數字。
  • Float64Array:用於處理64位浮點數字。

以下是兩種類型的創建方式:

let float32Array = new Float32Array(8);
let float64Array = new Float64Array(8);

上述代碼分別創建了一個長度為8的Float32Array和Float64Array。

四、TypedArray的基本操作

1. TypedArray的創建

TypedArray可以使用以下方式進行創建:

let array = new TypedArray(length);
let array = new TypedArray(buffer);
let array = new TypedArray(buffer, byteOffset, length);
let subarray = new TypedArray(sourceArray);
let subarray = new TypedArray(sourceArray, begin);
let subarray = new TypedArray(sourceArray, begin, end);

以上代碼分別為不同的創建方式:

  • 使用長度創建一個新的TypedArray
  • 使用一個已有的ArrayBuffer創建一個新的TypedArray
  • 使用一個已有的ArrayBuffer創建指定範圍的TypedArray
  • 從一個數組中創建一個子數組
  • 從一個數組中創建指定範圍的子數組

2. TypedArray的讀取和設置

TypedArray的讀取和設置方式與普通的JavaScript數組相同:

let array = new Int32Array(8);
array[0] = 123;
let value = array[0];
console.log(value);    // 123

3. TypedArray的迭代

TypedArray的迭代方式有兩種,一種是通過for循環逐一迭代,另一種是使用TypedArray內置的forEach()方法進行迭代。

for循環的迭代方式如下:

let array = new Int32Array(8);
for(let i=0; i<array.length; i++) {
  console.log(array[i]);
}

TypedArray的forEach()方法可以像普通的數組一樣使用:

let array = new Int32Array(8);
array.forEach(function(element) {
  console.log(element);
});

4. TypedArray的切割

與普通的JavaScript數組一樣,TypedArray也支持數組的切割操作。該操作返回一個新的TypedArray。

let array = new Int32Array([1, 2, 3, 4, 5, 6, 7, 8]);
let slice = array.slice(2, 6);
console.log(slice);    // Int32Array [ 3, 4, 5, 6 ]

5. TypedArray的複製和拷貝

TypedArray也支持複製和拷貝操作。複製操作是直接賦值一個TypedArray,拷貝操作是創建一個新的TypedArray,並將舊的TypedArray中的數據拷貝到新的TypedArray中。

以下是TypedArray的複製和拷貝代碼示例:

let array1 = new Int32Array(8);
let array2 = array1;    // 複製
let array3 = new Int32Array(8);
array3.set(array1);     // 拷貝

五、應用方面

TypedArray在許多應用中得到了廣泛的應用。以下是一些示例。

1. 圖像處理

Web應用中的圖像處理通常需要解碼和處理大量的二進位圖片數據。使用TypedArray可以快速、高效地處理二進位圖像數據,以便進行圖像處理、增強和壓縮等操作。

2. 網路通信

在Web應用中,客戶端與服務端之間通常需要進行大量的網路通信。使用TypedArray可以幫助實現高效、可靠的網路通信並提高數據處理的速度。

3. 流媒體數據

流媒體數據通常是大量的數據流,使用TypedArray可以快速處理、解碼和壓縮這些數據,以便在Web應用中實現高質量的媒體體驗。

六、總結

TypedArray是JavaScript中一個強大的二進位數據處理工具,它提供了以底層二進位數據為中心的高效、可預測的數據處理方式。在Web應用的許多方面,TypedArray都有大量的應用,如圖像處理、網路通信和流媒體數據等。學習使用TypedArray可以使我們更有效地處理大量的二進位數據,提高Web應用的性能和用戶體驗。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/181962.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-24 06:16
下一篇 2024-11-24 06:17

相關推薦

  • Trocket:打造高效可靠的遠程控制工具

    如何使用trocket打造高效可靠的遠程控制工具?本文將從以下幾個方面進行詳細的闡述。 一、安裝和使用trocket trocket是一個基於Python實現的遠程控制工具,使用時…

    編程 2025-04-28
  • Python生成列表最高效的方法

    本文主要介紹在Python中生成列表最高效的方法,涉及到列表生成式、range函數、map函數以及ITertools模塊等多種方法。 一、列表生成式 列表生成式是Python中最常…

    編程 2025-04-28
  • TFN MR56:高效可靠的網路環境管理工具

    本文將從多個方面深入闡述TFN MR56的作用、特點、使用方法以及優點,為讀者全面介紹這一高效可靠的網路環境管理工具。 一、簡介 TFN MR56是一款多功能的網路環境管理工具,可…

    編程 2025-04-27
  • 用Pythonic的方式編寫高效代碼

    Pythonic是一種編程哲學,它強調Python編程風格的簡單、清晰、優雅和明確。Python應該描述為一種語言而不是一種編程語言。Pythonic的編程方式不僅可以使我們在編碼…

    編程 2025-04-27
  • Python生成10萬條數據的高效方法

    本文將從以下幾個方面探討如何高效地生成Python中的10萬條數據: 一、使用Python內置函數生成數據 Python提供了許多內置函數可以用來生成數據,例如range()函數可…

    編程 2025-04-27
  • Gino FastAPI實現高效低耗ORM

    本文將從以下多個方面詳細闡述Gino FastAPI的優點與使用,展現其實現高效低耗ORM的能力。 一、快速入門 首先,我們需要在項目中安裝Gino FastAPI: pip in…

    編程 2025-04-27
  • 如何利用位元組跳動推廣渠道高效推廣產品

    對於企業或者個人而言,推廣產品或者服務是必須的。如何讓更多的人知道、認識、使用你的產品是推廣的核心問題。而今天,我們要為大家介紹的是如何利用位元組跳動推廣渠道高效推廣產品。 一、個性…

    編程 2025-04-27
  • 如何製作高效的目標識別數據集

    對於機器學習中的目標識別任務來說,製作高質量的數據集對於訓練模型十分重要。本文將從數據收集、數據標註、數據增強等方面闡述如何製作高效的目標識別數據集。 一、數據收集 在製作目標識別…

    編程 2025-04-27
  • 用mdjs打造高效可復用的Web組件

    本文介紹了一個全能的編程開發工程師如何使用mdjs來打造高效可復用的Web組件。我們將會從多個方面對mdjs做詳細的闡述,讓您輕鬆學習並掌握mdjs的使用。 一、mdjs簡介 md…

    編程 2025-04-27
  • 如何設計一個高效的中台產品

    本文介紹中台產品的設計思路,並從用戶、技術和可維護性等多個方面進行詳細闡述。 一、用戶體驗至上 中台產品的首要目標是滿足用戶需求和提升用戶體驗。因此,中台產品的設計應該以用戶為中心…

    編程 2025-04-27

發表回復

登錄後才能評論