类型化数组

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);