无需登录 数据私有 本地保存

TypedArray 在线探索器 - 创建并操作二进制缓冲区

8
0
0
0
Uint8Array 每元素1字节
快速填充:
Uint8Array 每元素1字节 | 共8字节
数据视图 范围: 0 – 255
索引 十进制值 十六进制 二进制 / 位模式
最小值
0
最大值
0
总和
0
ArrayBuffer
8 B
批量操作
自定义值填充:
ArrayBuffer 字节视图 偏移量 (hex)
DataView 交叉解读 (偏移0处)
常见问题与知识点
什么是 TypedArray?它与普通数组有什么不同?

TypedArray(类型化数组)是JavaScript中用于处理二进制数据的特殊数组类型。与普通数组不同:

  • 固定类型:每个元素必须是相同的数据类型(如8位整数、32位浮点数等)
  • 固定长度:创建后长度不可改变
  • 连续内存:数据存储在连续的ArrayBuffer中,访问速度极快
  • 无额外开销:不像普通数组存储引用,TypedArray直接存储原始值
  • 性能优势:适合处理大量数值数据,如Canvas像素、WebGL顶点、音频数据等
ArrayBuffer 是什么?它与 TypedArray 的关系?

ArrayBuffer是一块原始的二进制数据缓冲区,类似于C语言中的malloc分配的内存块。它本身不能直接读写,需要借助TypedArrayDataView来操作。

可以把ArrayBuffer理解为"地皮",TypedArray是在这块地皮上建造的"建筑"。多个不同的TypedArray可以共享同一个ArrayBuffer,从不同角度解读同一块内存。这种特性在处理复杂二进制协议时非常有用。

Uint8ClampedArray 有什么特殊之处?

Uint8ClampedArray与Uint8Array类似,但赋值时会自动钳制(clamp)到0–255范围:

  • 值 < 0 → 自动变为 0
  • 值 > 255 → 自动变为 255
  • 小数 → 四舍五入到最近整数

它主要用于Canvas图像数据(ImageData),确保RGB颜色值始终在有效范围内。在处理像素时,不需要手动检查边界。

什么是字节序(Endianness)?TypedArray使用什么字节序?

字节序指多字节数据在内存中的排列顺序:

  • 小端(Little-Endian):低位字节在前(如0x1234存储为34 12),这是大多数现代CPU(x86、ARM)的默认方式
  • 大端(Big-Endian):高位字节在前(如0x1234存储为12 34),网络协议常用

TypedArray使用主机系统的字节序(通常是little-endian)。如果需指定字节序,应使用DataView,它允许在读取/写入时选择字节序。

DataView 与 TypedArray 有何区别?何时使用?

DataView提供更灵活的ArrayBuffer操作方式:

  • 可在任意偏移量读取/写入不同类型的数据
  • 指定字节序(大端或小端)
  • 适合解析复杂的二进制文件格式网络协议

而TypedArray更适合同类型数据的批量操作,如数学计算、图形处理等。在性能敏感的场景中,TypedArray通常更快。

TypedArray 在实际开发中有哪些应用场景?

TypedArray广泛应用于Web开发中:

  • Canvas像素操作:ImageData使用Uint8ClampedArray
  • WebGL 3D图形:顶点数据、纹理数据使用Float32Array等
  • WebSocket二进制消息:收发二进制帧
  • 文件API:读取文件的二进制内容
  • Web Audio API:音频缓冲区使用Float32Array
  • WebAssembly:与WASM模块共享内存
  • 加密算法:处理哈希、加解密中的字节操作
Float32Array 中的特殊值 NaN 和 Infinity 如何表示?

Float32Array和Float64Array遵循IEEE 754标准,支持特殊值:

  • NaN(非数值):指数全1,尾数非零。表示未定义的计算结果(如0/0)
  • Infinity:指数全1,尾数全0。符号位决定正负无穷
  • -0:符号位为1,其余全0。在大多数运算中与+0等价

这些特殊值在TypedArray中正常存储和读取。使用isNaN()isFinite()来检测它们。

BigInt64Array 和普通整数数组有什么区别?

BigInt64Array存储64位有符号大整数(BigInt),范围从-2⁶³到2⁶³-1。关键区别:

  • 元素类型是BigInt(如123n),不是普通Number
  • 普通Number无法精确表示超过2⁵³的整数,而BigInt可以
  • 每个元素占用8字节
  • 适合处理高精度时间戳、大数值ID、加密运算等场景
  • BigInt不能与普通Number混合运算,需要显式转换