18

JavaScript类型化数组

 3 years ago
source link: https://www.joynop.com/p/334.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

JavaScript 类型化数组

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

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

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

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

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

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

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

zaQBziU.png!mobile

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

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

2ayemef.png!mobile

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

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

7NnQR3q.png!mobile

类型数组构造函数表

说明: 位数指构造函数创建的数组存储一个元素需要的内存空间,字节就是位数除以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个元素

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK