ES12 中的字节序列详解

在 ECMAScript 2021(ES12)中,新增了一种数据类型:BigInt。与其他数字类型不同的是,BigInt 可以表示任意大的整数,而不会溢出。为了支持这种新的数据类型,ES12 引入了一种新的字节序列类型:BigUint64ArrayBigInt64Array

字节序列

字节序列是一种由一组固定长度的二进制数据组成的数据类型。在 JavaScript 中,可以使用 ArrayBuffer 来表示字节序列。ArrayBuffer 是一种固定长度的缓冲区,可以存储任意类型的数据,但是不能直接访问其中的数据。要访问 ArrayBuffer 中的数据,需要使用 TypedArrayDataView

TypedArray 是一种可以直接操作 ArrayBuffer 中数据的视图类型。它可以将 ArrayBuffer 中的数据解析成不同类型的数据,如整数、浮点数等。TypedArray 支持以下几种类型:

  • Int8Array:8 位有符号整数数组
  • Uint8Array:8 位无符号整数数组
  • Int16Array:16 位有符号整数数组
  • Uint16Array:16 位无符号整数数组
  • Int32Array:32 位有符号整数数组
  • Uint32Array:32 位无符号整数数组
  • Float32Array:32 位浮点数数组
  • Float64Array:64 位浮点数数组

DataView 是一种可以直接操作 ArrayBuffer 中数据的通用视图类型。它可以将 ArrayBuffer 中的数据解析成任意类型的数据。与 TypedArray 不同的是,DataView 可以指定字节序,因此可以在不同的平台上传输数据。

BigInt64Array 和 BigUint64Array

在 ES12 中,新增了两种 TypedArrayBigInt64ArrayBigUint64Array。它们可以直接操作 ArrayBuffer 中的 64 位整数数据,其中 BigInt64Array 表示有符号整数,BigUint64Array 表示无符号整数。

BigInt64ArrayBigUint64Array 支持以下几个方法:

  • length:返回数组长度
  • byteLength:返回数组占用的字节数
  • byteOffset:返回数组相对于 ArrayBuffer 的偏移量
  • set():将一个 TypedArrayArray 中的数据复制到当前数组中
  • subarray():返回当前数组的一个子数组
  • slice():返回当前数组的一个浅拷贝

以下是 BigInt64ArrayBigUint64Array 的示例代码:

字节序

在计算机系统中,多个字节的数据存储顺序可以分为两种:大端序(Big-Endian)和小端序(Little-Endian)。

  • 大端序:数据的高位字节存储在内存的低地址处,数据的低位字节存储在内存的高地址处。
  • 小端序:数据的低位字节存储在内存的低地址处,数据的高位字节存储在内存的高地址处。

在 JavaScript 中,默认使用小端序。但是在某些情况下,需要使用大端序。例如,在网络传输中,需要指定字节序。

DataView 中,可以使用 getUint16()getUint32() 等方法指定字节序。在 TypedArray 中,可以使用 BYTES_PER_ELEMENT 属性获取每个元素所占用的字节数,从而判断字节序。例如,Int8Array.BYTES_PER_ELEMENT 的值为 1,表示每个元素占用 1 个字节,因此不需要指定字节序。

总结

ES12 中新增的 BigInt64ArrayBigUint64Array 可以直接操作 ArrayBuffer 中的 64 位整数数据。在使用字节序列时,需要注意字节序的问题。DataView 可以指定字节序,而 TypedArray 的字节序由平台决定。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/656631efd2f5e1655df4e2c1


纠错
反馈