在 ECMAScript 2021(ES12)中,新增了一种数据类型:BigInt
。与其他数字类型不同的是,BigInt
可以表示任意大的整数,而不会溢出。为了支持这种新的数据类型,ES12 引入了一种新的字节序列类型:BigUint64Array
和 BigInt64Array
。
字节序列
字节序列是一种由一组固定长度的二进制数据组成的数据类型。在 JavaScript 中,可以使用 ArrayBuffer
来表示字节序列。ArrayBuffer
是一种固定长度的缓冲区,可以存储任意类型的数据,但是不能直接访问其中的数据。要访问 ArrayBuffer
中的数据,需要使用 TypedArray
或 DataView
。
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 中,新增了两种 TypedArray
:BigInt64Array
和 BigUint64Array
。它们可以直接操作 ArrayBuffer
中的 64 位整数数据,其中 BigInt64Array
表示有符号整数,BigUint64Array
表示无符号整数。
BigInt64Array
和 BigUint64Array
支持以下几个方法:
length
:返回数组长度byteLength
:返回数组占用的字节数byteOffset
:返回数组相对于ArrayBuffer
的偏移量set()
:将一个TypedArray
或Array
中的数据复制到当前数组中subarray()
:返回当前数组的一个子数组slice()
:返回当前数组的一个浅拷贝
以下是 BigInt64Array
和 BigUint64Array
的示例代码:
// javascriptcn.com 代码示例 const buffer = new ArrayBuffer(16); const int64Array = new BigInt64Array(buffer); const uint64Array = new BigUint64Array(buffer); int64Array[0] = BigInt('-9223372036854775808'); int64Array[1] = BigInt('9223372036854775807'); uint64Array[0] = BigInt('0'); uint64Array[1] = BigInt('18446744073709551615'); console.log(int64Array); // BigInt64Array [-9223372036854775808n, 9223372036854775807n] console.log(uint64Array); // BigUint64Array [0n, 18446744073709551615n]
字节序
在计算机系统中,多个字节的数据存储顺序可以分为两种:大端序(Big-Endian)和小端序(Little-Endian)。
- 大端序:数据的高位字节存储在内存的低地址处,数据的低位字节存储在内存的高地址处。
- 小端序:数据的低位字节存储在内存的低地址处,数据的高位字节存储在内存的高地址处。
在 JavaScript 中,默认使用小端序。但是在某些情况下,需要使用大端序。例如,在网络传输中,需要指定字节序。
在 DataView
中,可以使用 getUint16()
、getUint32()
等方法指定字节序。在 TypedArray
中,可以使用 BYTES_PER_ELEMENT
属性获取每个元素所占用的字节数,从而判断字节序。例如,Int8Array.BYTES_PER_ELEMENT
的值为 1,表示每个元素占用 1 个字节,因此不需要指定字节序。
总结
ES12 中新增的 BigInt64Array
和 BigUint64Array
可以直接操作 ArrayBuffer
中的 64 位整数数据。在使用字节序列时,需要注意字节序的问题。DataView
可以指定字节序,而 TypedArray
的字节序由平台决定。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/656631efd2f5e1655df4e2c1