类型化数组

  讲解类型数组必然要联系到Javascript语言一直存在的普通数组, 普通数组的创建方式是使用运算符中括号[]或者Javascript语言内置的Array()构造函数。 类型数组的创建方式一般使用Int8Array等构造函数。

  为了降低Javascript语言的编程门槛,简化封装底层的计算机知识,在最初的Javascript语言中设计的Array数组, 可以支持任意数据类型的元素,数组里面可以嵌套数组,这一点上要比C语言的数组灵活得多,通用型强、易使用、易学习的代价就是效率低。

  类型数组适合计算量大的场景,需要大规模处理数据,比如矩阵计算。类型化数据最早 引入的原因就是为了WebGL的需要 ,关于计算机图形学的应用涉及到大量 的顶点数据数据处理,大量的矩阵变换,如果在使用原来的数组Array,效率低,浪费内存。

  通过前面的学习大家应该至少知道普通数组,普通数组对待数字处理一般分为有符号32位整形数据和64位浮点数。类型数组之所以有类型这个定语,就是因为每一个构造函数对应一种 number类型里面细分的数据类型。Javascript一般情况处理整数只有一种整型模式,一个整型数据分配32位内存空间, 类型数组中,构造函数Int8Array()创建的数组每个元素占据的内存是8位,正如其名前半部分Int8; Int16Array()创建数组的数字元素分配内存分配16位,诸如其他的构造函数 Float32Array 、 Float64Array、Int32Array根据名字都知道它的元素类型和元素分配的内存空间。

几种不同数组创建方式对应的内存分配图

1. arr1 = [10,12,13];或arr1 = new Array(10,12,13);

arr1的第一个元素10在内存中状态(10对应的二进制是1010)

00000000 00000000 00000000 0000 1010

2.arr2 = new Uint16Array([10,12,13]);

arr2的第一个元素10在内存中状态

0000 0000 0000 1010

3.arr3 = new Uint8Array([10,12,13]);

arr3的第一个元素10在内存中状态

0000 1010

类型数组构造函数表

  说明: 位数指构造函数创建的数组存储一个元素需要的内存空间,字节就是位数除以8。

构造函数 位数 字节 类型描述 C语言等价类型
Int8Array 8 1 有符号8位整型 int8_t
Uint8Array 8 1 无符号8位整型 uint8_t
Int16Array 16 2 有符号16位整型 int16_t
Uint16Array 16 2 无符号16位整型 int16_t
Int32Array 32 4 有符号32位整型 int32_t
Uint32Array 32 4 无符号32位整型 uint32_t
Float32Array 32 4 单精度(32位)浮点数 float
Float64Array 64 8 双精度(64位)浮点数 double

  Int来自单词integer整数,无符号的U来自单词Unsigned无符号,整型对应的就是整数,浮点数你可以简单的理解位小数,整数分为整数有正数和负数之分。 无符号整数不能用来表示负数,内存的存储不要要符号位,有符号自然包括负数,正数分配的最小存储单元第一位会用来作为符号位,0表示正数,1表示复数。

类型数组属性

  类型数组和普通数组一样都是对象,也一样具有属性,类型数组有些属性是独有属性,有些属性和普通数组一样

BYTES_PER_ELEMENT

构造函数创建的数组里面元素分配的内存字节数,参考上面表格“字节”一栏

  let data1 = new Float32Array([0.4, 1.0,  0.4, 0.4, 1.0 ]);
  let data2 = new Int16Array([4,1,4,4,1 ]);
  let size1 = data1.BYTES_PER_ELEMENT;//返回结果size1为4
  let size2 = data2.BYTES_PER_ELEMENT;//返回结果size2为2

byteLength

byteLength属性表示数组暂用的内存总数,单位是字节B

  let data1 = new Float32Array([0.4, 1.0,  0.4, 0.4, 1.0 ]);
  let data2 = new Int16Array([4,1,4,4,1 ]);
  let bL1 = data1.byteLength;//返回结果20
  let bL2 = data2.byteLength;//返回结果10

length

length属性值是数组对象内涵元素个数

  let data1 = new Float32Array([0.4, 1.0,  0.4, 0.4, 1.0 ]);
  let data2 = new Int16Array([4,1,4,4,1 ]);
  let L1 = data1.length;//返回结果5
  let L2 = data2.length;//返回结果5

类型数组属性对照表

属性 含义
BYTES_PER_ELEMENT 构造函数创建的数组里面元素分配的字内存字节数
byteLength 数组所有元素占用的内存空间,单位:字节B
length 数组内含元素个数

类型数组方法

方法 含义
get(index) index是整数值0、1、2,表示类型数组元素的索引,执行方法返回索引index对应的元素值
set(index, value) 更改类型数组索引index对应的元素值为value
set(array,offset) 给类型数组array插入元素,插入位置是偏移offset个元素