类型化数组
讲解类型数组必然要联系到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)
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 0 |
2.arr2 = new Uint16Array([10,12,13]);
arr2的第一个元素10在内存中状态
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 0 |
3.arr3 = new Uint8Array([10,12,13]);
arr3的第一个元素10在内存中状态
0 | 0 | 0 | 0 | 1 | 0 | 1 | 0 |
类型数组构造函数表
说明: 位数指构造函数创建的数组存储一个元素需要的内存空间,字节就是位数除以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个元素 |