类型化数组
ArrayBuffer对象是HTML5标准,也就说明在浏览器和node.js都能使用。
表示二进制数据的原始缓冲区,该缓冲区用于存储各种类型化数组的数据。 无法直接读取或写入 ArrayBuffer,但可根据需要将其传递到类型化数组或 DataView 对象 来解释原始缓冲区。
创建ArrayBuffer对象var buf = new ArrayBuffer(8);
不能像Buffer对象那样操作它,那么如何读与写呢?答案就是ArrayBuffer针对不同的类型定义了相关类,通过这些类实例化对象对其进行操作。这些个类型虽然名字和Buffer定义的读写方法名不完全一致,但仔细观察会发现,都是可以对号入座的。
类型化数组类型表示可编制索引和操纵的 ArrayBuffer 对象 的各种视图。这些个类包括:Int8Array 、Uint8Array 、Int16Array 、Uint16Array 、Int32Array 、Uint32Array 、Float32Array 、64Array
例1. 创建的buf内部有8个bytes,我们想让第二个字节储存12,代码如下。var buf = new ArrayBuffer(8);
console.log(buf);
打印结果是{ '0': 0,
'1': 0,
'2': 0,
'3': 0,
'4': 0,
'5': 0,
'6': 0,
'7': 0,
slice: [Function: slice],
byteLength: 8 }
用无符号8位整数类型数组包装ArrayBuffer对象。// 用无符号8位整数类型数组包装ArrayBuffer对象
var arr = new Uint8Array(buf,1,1);
// 设置arr视图的第一个byte,也就是buf的第二个byte为12
arr.set(0,12);
console.log(buf);
打印结果是:{ '0': 0,
'1': 12,
'2': 0,
'3': 0,
'4': 0,
'5': 0,
'6': 0,
'7': 0,
slice: [Function: slice],
byteLength: 8 }
类型数组具有的构造方法
new XXXArray( length ); 参数length , 指定数组的长度。
例var int8Array = new Int8Array(1);
console.log(int8Array.byteLength); // 打印 1 ,表示占用1个byte。
var uint8Array = new Uint8Array(1);
console.log(uint8Array.byteLength); // 打印 1 ,表示占用1个byte。
var int16Array = new Int16Array(1);
console.log(int16Array.byteLength); // 打印 2 ,表示占用2个byte。
var uint16Array = new Uint16Array(1);
console.log(uint16Array.byteLength); // 打印 2 ,表示占用2个byte。
var int32Array = new Int32Array(1);
console.log(int32Array.byteLength); // 打印 4 ,表示占用4个byte。
var uint32Array = new Uint32Array(1);
console.log(uint32Array.byteLength); // 打印 4 ,表示占用4个byte。
var float32Array = new Float32Array(1);
console.log(float32Array.byteLength); // 打印 4 ,表示占用4个byte。
var float64Array = new Float64Array(1);
console.log(float64Array.byteLength); // 打印 8 ,表示占用8个byte。
new XXXArray( array ); array ,该数组中包含的数组(或类型化数组)。 内容将初始化为给定数组或类型化数组的内容,且每个元素均转换为此类型。
例var int8Array = new Int8Array([22,24]);
console.log(int8Array.byteLength); // 打印 2 ,表示占用2个byte。
var uint8Array = new Uint8Array([22,24]);
console.log(uint8Array.byteLength); // 打印 2 ,表示占用2个byte。
var int16Array = new Int16Array([22,24]);
console.log(int16Array.byteLength); // 打印 4 ,表示占用4个byte。
var uint16Array = new Uint16Array([22,24]);
console.log(uint16Array.byteLength); // 打印 4 ,表示占用4个byte。
var int32Array = new Int32Array([22,24]);
console.log(int32Array.byteLength); // 打印 8 ,表示占用8个byte。
var uint32Array = new Uint32Array([22,24]);
console.log(uint32Array.byteLength); // 打印 8 ,表示占用8个byte。
var float32Array = new Float32Array([22,24]);
console.log(float32Array.byteLength); // 打印 8 ,表示占用8个byte。
var float64Array = new Float64Array([22,24]);
console.log(float64Array.byteLength); // 打印 16 ,表示占用16个byte。
new XXXArray( buffer, byteOffset, length); buffer,此数组类型表示的 ArrayBuffer。byteOffset 可选,指定与 此类型数组将开始的缓冲区的开始处的偏移量(以字节为单位),根据测试这个参数除了Int8Array和Uint8Array可以正常使用,其余都必须设置为0,原因作者暂时也不得而知。length,数组的长度。
例var ab = new ArrayBuffer(20);
var int16Array = new Int16Array(ab,0,2);
console.log(int16Array.length); // 2 表示数组长度。
console.log(int16Array.byteLength); // 4 表示占用4个byte。
类型数组具有的属性
buffer 属性 只读。 获取此数组引用的 ArrayBuffer。fuck
sexbyteLength 属性 只读。 此数组的从其 ArrayBuffer 开始的长度(以字节为单位)在构造时已固定。
byteOffset 属性 只读。 此数组的从其 ArrayBuffer 开始的偏移量(以字节为单位)在构造时已固定。
length 属性,数组的长度。
例var arr = new Uint16Array(2);
arr.set(0,12);
arr.set(1,322);
console.log(arr.buffer);
/打印
{ '0': 12,
'1': 0,
'2': 66,
'3': 1,
slice: [Function: slice],
byteLength: 4 }/
godconsole.log(arr.byteLength); // 4
console.log(arr.byteOffset); // 0
console.log(arr.length); // 2
类型数组具有的方法
get(index) 方法,获取指定索引处的元素
set(index, value) 方法,设置索引位置的值。
set(array, offset) 方法,在指定offset位置写入类型化或非类型化数组。
subarray() 方法,为此数组获取 ArrayBuffer 存储的新视图。var arr = new Uint16Array(4);
arr.set(0,12);
arr.set(1,35);
arr.set(2,666);
arr.set(3,980);
console.log(arr.get(2)); // 666
console.log(arr.length); // 4
var subarr = arr.subarray(1, 3);
console.log(subarr.length); // 2
常量
BYTES_PER_ELEMENT , 数组中的每个元素的大小(以字节为单位)。var int8Array = new Uint8Array(10);
var int32Array = new Uint32Array(2);
console.log(int8Array.BYTES_PER_ELEMENT);
console.log(Int32Array.BYTES_PER_ELEMENT);