当前位置: 首页 > news >正文

19. 什么是 TypedArray

总结

  • TypedArray(类型化数组)是 JavaScript 中用于操作二进制数据的特殊数组。
  • 它提供了对 ArrayBuffer 的结构化访问,用于处理原始二进制数据,如图像、音频、网络协议等。
  • 常见类型包括:Int8ArrayUint8ArrayInt16ArrayUint16ArrayFloat32ArrayFloat64Array 等。
  • TypedArrayArrayBuffer 的“视图”,不直接操作内存,而是通过 DataViewTypedArray 本身。

为什么需要 TypedArray

  • JavaScript 原生数组(Array)是动态类型、自动扩容的,不适合直接操作二进制数据。
  • TypedArray 提供了更高效、更底层的访问方式,适用于以下场景:
    • WebSocket 传输
    • Canvas 图像处理
    • 音频/视频处理
    • 文件读取(如通过 FileReader
    • WebGL 数据传递

核心概念

1. ArrayBuffer

  • 表示原始的二进制缓冲区(一块内存区域)。
  • 不能直接操作,需要通过 TypedArrayDataView 来访问。
const buffer = new ArrayBuffer(16); // 分配 16 字节内存

2. TypedArray

  • 提供对 ArrayBuffer 的类型化访问。
  • 每种类型对应不同的字节数。
类型名每个元素大小(字节)描述
Int8Array1有符号 8 位整数
Uint8Array1无符号 8 位整数
Int16Array2有符号 16 位整数
Uint16Array2无符号 16 位整数
Int32Array4有符号 32 位整数
Uint32Array4无符号 32 位整数
Float32Array432 位浮点数
Float64Array864 位浮点数

3. DataView

  • 提供对 ArrayBuffer 的灵活访问,可以按任意偏移和类型读写数据。
const buffer = new ArrayBuffer(16);
const view = new DataView(buffer);
view.setInt32(0, 0x12345678, true); // 小端模式写入

示例代码

创建并操作 TypedArray

const buffer = new ArrayBuffer(8);
const intView = new Int32Array(buffer);intView[0] = 100;
intView[1] = 200;console.log(intView); // Int32Array [100, 200]

多视图访问同一内存

const buffer = new ArrayBuffer(8);
const intView = new Int32Array(buffer);
const byteView = new Uint8Array(buffer);intView[0] = 0x12345678;
console.log(byteView); // Uint8Array [0x78, 0x56, 0x34, 0x12, 0x00, 0x00, 0x00, 0x00]

注意事项

  • TypedArray 是类数组对象,具有 lengthbufferbyteOffset 等属性。
  • 不支持 pushpop 等方法,但可以使用 set()subarray() 等方法操作。
  • 所有操作都是基于底层内存的,需要注意字节顺序(大端/小端)。
  • TypedArray 可以通过 slice()map()filter() 等方法创建新数组。

使用场景

场景应用说明
图像处理通过 Canvas 获取像素数据,使用 Uint8ClampedArray 操作
音频处理使用 AudioBufferFloat32Array 处理音频采样
WebSocket 通信接收和发送二进制数据(如 ArrayBuffer
文件读取使用 FileReader.readAsArrayBuffer() 读取文件
WebGL 渲染向 GPU 传递顶点数据等

http://www.dtcms.com/a/331084.html

相关文章:

  • Subarray Sums II
  • EtherCAT概念介绍
  • Python入门第1课:环境搭建与第一个程序“Hello World”
  • python学习DAY41打卡
  • 前端已死,AI技术正在重塑前端软件工程师
  • 护照查验接口牢筑跨境场景安全防线-JavaScript集成示例
  • Elasticsearch ABAC 配置:实现动态、细粒度的访问控制
  • 玩转Docker | 使用Docker部署JSON格式化工具ZJSON
  • Java-数构map和set
  • 高效解决 pip install 报错 SSLError: EOF occurred in violation of protocol
  • P5967 [POI 2016] Korale 题解
  • Transformer之多头注意力机制和位置编码(二)
  • Canon PowerShot D30相机 CHDK 固件 V1.4.1
  • 5.Ansible-playbook-模块介绍(知识点补充)
  • 【Postgresql】实现 PostgreSQL 全量审计日志:记录所有 SQL 操作及来源
  • 【C++】细说继承(2w字详解)
  • ROS机器人云实践案例博客建议和范文-AI版本
  • imx6ull-驱动开发篇24——Linux 中断API函数
  • MATLAB绘制各种心形曲线
  • window显示驱动开发—在混合系统中使用跨适配器资源
  • nginx-集成prometheus监控(k8s)
  • GitHub 热榜项目 - 日榜(2025-08-14)
  • 一、linux内存管理学习(1):物理内存探测
  • 京东商品列表API开发指南
  • OpenCV对椒盐处理后的视频进行均值滤波处理
  • Opencv 边界填充 图像运算 阈值处理 和图像平滑处理
  • 文件上传接口接收不到文件入参
  • 题解:P4777 【模板】扩展中国剩余定理(EXCRT)
  • Qt项目查找依赖库打包
  • IDEA、Pycharm、DataGrip等激活破解冲突问题解决方案之一