JavaScript 类型化数组

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

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

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

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

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

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

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

WX20200828-150147@2x.png

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

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

WX20200828-150316@2x.png

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

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

WX20200828-150342@2x.png

类型数组构造函数表

说明: 位数指构造函数创建的数组存储一个元素需要的内存空间,字节就是位数除以8。
构造函数位数字节类型描述C语言等价类型
Int8Array81有符号8位整型int8_t
Uint8Array81无符号8位整型uint8_t
Int16Array162有符号16位整型int16_t
Uint16Array162无符号16位整型int16_t
Int32Array324有符号32位整型int32_t
Uint32Array324无符号32位整型uint32_t
Float32Array324单精度(32位)浮点数float
Float64Array648双精度(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个元素