直接处理二进制数据,提升脚本性能。
数据类型 | 字节长度 | 含义 | 范围 |
---|---|---|---|
Int8Array | 1 | 8位带符号整数 | -128-127 -2^7 - 2^7-1 |
Uint8Array | 1 | 8位不带符号整数 | 0-255 |
Uint8ClampedArrayy | 1 | 8位不带符号整数(自动过滤溢出) | |
Int16 | 2 | 16位带符号整数 | |
Uint16 | 2 | 16位不带符号整数 | |
Int32 | 4 | 32位带符号整数 | |
Uint32 | 4 | 32位不带符号整数 | |
Float32 | 4 | 32位浮点数 | |
Float64 | 8 | 64位浮点数 |
ArrayBuffer
代表了存储二进制数据的一段内存,不能直接读写。通过视图(TypedArray/DataView)以指定格式进行读/写.
// 生成一段32字节的内存区域,默认填充 0
var buffer = new ArrayBuffer(32);
// 通过创建视图,对buffer进行读写
var view = new DataView(buffer);
view.getUint8(0); // 以不带符号的8位整数读取第一个元素 为 0
.prototype.byteLength
返回分配的内存区域的字节长度。
buffer.byteLength; // 32
.prototype.slice()
截取部分二进制数据并生成一个新的实例对象。
var buffer_1 = buffer.slice(0,4);
var view_1 = new DataView(buffer_1);
view_1.setUint8(0,12);
view.getUint8(0); // 0
view_1.getUint8(0); // 12
.isView() 静态方法
返回一个布尔值,是否是视图实例。
ArrayBuffer.isViewe(buffer); // false
ArrayBuffer.isView(view); // true
TypedArray
用于处理简单同一个类型的二进制数据。支持9中类型的视图,Uint8Array
/Int16Array
/Float32Array
等
-
参数定义(buffer[,byteOffset=0,length]) 指向的buffer实例、起始点、长度。
var typed = new Int32Array(buffer); typed[0] = 1; var typed_2 = new Uint8Array(buffer); typed_2[0] =2; // 操作的时同一块内存,typed[0] = 2
接受一个数组作为参数,并完成内存分配。
var typed_3 = new Uint8Array([3,4,5]); // typed_3 [4,5,6]
byteOffset
必须是实例对象的类型的倍数var t8 = new Uint8Array(buffer,1,3); // 建立从1开始,长度为3 的视图 var t16 = new Uint16Array(buffer,1,3); // Error ,byteOffset必须是 2 的倍数。
可以使用
DataView
从任意位置读取字节。 -
额外的实例化方法
TypedArray(length)
直接分配内存生成。TypedArray(typedArray)
接受另一个TypedArray实例作为参数,且开辟了新内存区域。TypedArray(array)
使用普通的数组实例化,开辟了新内存并建立视图。
普通数组的方法可用于TypedArray数组。没有
concat
方法,可自定义实现。 -
.BYTES_PER_ELEMENT
标识数据类型占据的字节数。 -
实例的方法
.prototype
-
.buffer
返回ArrayBuffer对象。 -
.byteLength/.byteOffset
返回占据的内存长度以及是从哪个字节开始的。 -
.length
返回的是成员的长度。 -
.set(array[,byteOffset])
byteOffset开始复制的位置。
复制数组(普通数组、TypedArray),开辟新内存区域存储。 -
.subarray(start,end)
截取视图的一部分建立新的视图。 -
.slice()
-
TypedArray.of()
将参数转换为实例Uint8Array.of(3,4);
-
TypedArray.from()
将一个可遍历的数据结构作为参数,返回一个基于此结构的TypedArray实例。接受第二参数,对元素进行遍历,类似map()
方法。
字节序
数值在内存中的表示方式。
-
小端字节序
将一个数值中决定其大小的重要字节放在最后面,不重要的放到前面。 -
大端字节序
与小端字节序相反,最重要的放到最前面。
小端字节序,不同的结果展现。
var i16 = new Uint16Array([2,4,6]);
[...i16.values()]; // [2,4,6]
var i8 = new Uint8Array(i16.buffer);
[...i8.values()]; // [2,0,4,0,6,0]
溢出
超出视图范围的数值会出现溢出。TypedArray处理溢出方式为求余值。
- 正向溢出,大于范围最大值;最后的值等于当前数据类型的最小值加上余值,再减去 1。
- 负向溢出就等于当前数据类型的最大值减去余值,再加上1 。
DataView
复合视图在同一段内存中存放不同类型的数据。
用于读写复杂二进制数据。是一组
构造函数 ,可以自定义复合格式视图。即第一个字节是Uint8
,第二个字节是Int16
等等,还可以自定义字节序。
var view = new DataView(buffer[,byteOffset,byteLength]);
-
读取内存的方法:
getInt8()...getFloat64
共8中。不包括Uint8ClampedArrayy
第一个参数为字节序号,第二个字节为存储方式(针对读取两个或两个以上字节),默认大端存储。view.getInt8(0); view.getInt8(0,true); // 小端字节序读取。
-
写入内存:
setInt8...setFloat64
共8种。
第一个参数为字节序号,第二个字节为写入的数据。第三个参数为存储方式(针对读取两个或两个以上字节),默认大端存储。
实际应用
- ajax
- Canvas 图像二进制像素数据处理,专有的数据类型
Uint8ClampedArray
. - WebSocket
- Fetch API
- File API