前端学习(五十一) JavaScript-TypedArray(javaScript)

TypedArray

描述的是二进制缓存区一个类似数组的视图,也叫类型数组

类型 大小(字节单位) 描述
Int8Array 1 8位二进制带符号整数-2^7~2^7-1
Unit8Array 1 8位无符号整数0~(2^8)-1
Unit8ClampedArray 1 8位无符号整数且值固定在0~255之间
Int16Array 2 16位二进制带符号整数-2^15~(2^15)-1
Unit16Array 2 16位无符号整数0~(2^16)-1
Int32Array 4 32位二进制带符号整数-2^31~(2^31)-1
Unit32Array 4 32位无符号整数0~(2^32)-1
Float32Array 4 32位IEEE浮点数
Float64Array 8 64位IEEE浮点数

TypedArray的初始化

new TypedArray(buffer,字节偏移量,长度)

buffer:可以传一个ArrayBuffer实例对象

字节偏移量:(可选)代表这个视图从内存中什么位置开始

长度:(可选)代表开始之后的长度多少,默认是到缓存结尾

示例:

//创建一个ArrayBuffer对象
const ab=new ArrayBuffer(8);

//创建一个指向ab的Int32视图,开始字节0,直到缓冲区末尾
const view1=new Int32Array(ab);

//创建一个指向ab的Int32视图,开始字节2,直到缓冲区末尾
const view1=new Int32Array(ab,2);

//创建一个指向ab的Int32视图,开始字节2,长度为2
const view1=new Int32Array(ab,2,2);

另外,可以只传一个参数,代表数组长度

new TypedArray(数组长度)

当传入数组长度时,一个内部数组缓存区被创建,该缓存区的大小是数组的长度乘以数组中每个元素的字节数,并且每个元素的值都是0;

示例:

var f64a=new Float64Array(8);
f64a.forEach(x => console.log(x));   //输出:0 0 0 0 0 0 0 0

第三种方法是

new TypedArray(类型化数组)

当传入一个类型化数组作为参数时,那么这个类型化数组将被复制到一个新的类型化数组。

const x=new Int8Array([1,1]);
const y=new Int8Array(x);
x[0]=2;
console.log(x[0])  //输出2
console.log(y[0])  //输出1,不会随着X的改变而改变

这边y虽然是x复制过来的,但是y不会随着x修改,如果要求同步,那么,参数x得是x.buffer,意思是代表指向同一段地址

const x=new Int8Array([1,1]);
var z=new Int8Array(x.buffer);
x[0]=4;
console.log(x[0])  //输出4
console.log(z[0])  //输出4

第四种方式是:

new TypedArray(类型化数组),但是直接传入数组 

const  a=new Int8Array([1,2,3,4])

TypedArray方法

TypedArray.form(类数组):使用类数组或迭代对象创建一个新的类型化数组

TypedArray.of(元素0,元素1,元素2....元素n):通过可变数量的参数创建新的类型化数组

TypedArray原型

TypedArray.prototype.constructor:返回创建示例原型的构造函数

TypedArray.prototype.buffer:返回被格式化数组引用的ArrayBuffer,创建时已被固化,因此是只读的

TypedArray.prototype.byteLength:返回从ArrayBuffer读取的字节长度,创建时已被固话,因此是只读的

TypedArray.prototype.byteOffset:返回从ArrayBuffer读取时的字节偏移量,创建时已被固话,因此是只读的

TypedArray.prototype.lenghth:返回在类型化数组中的元素数量,创建时已被固化,因此是只读

TypedArray原型方法

普通数组的原型方法,TypedArray基本都有,例如every(),fill()等等

但是:

TypedArray没有concat()方法

而且下列是独有的: 

TypedArray.prototype.set()代表:用于将数组(普通数组或TypeArray数组)中一段内容完全复制到另一段内存

TypeArray.prototype.subArray()代表:对于TypeArray数组的一部分,在建立一个新的视图

TypedArray和数组的区别

TypedArray 数组
数组成员均为同一个类型 可以是任意类型
数组成员是连续的,不会有空位 非连续
数组的成员默认值均为0 默认为空
视图,不存储数据 存储数据

实际应用

传统意义上服务通过AJAX只能返回文本数据,responseType默认是一个text,但是在xhr中,可以设定为一个二进制数据,只需要将responseType设置成arraybuffer

var xhr=new XMLHttpRequest();
xhr.open("GET","/myfile.png",true);
xhr.responseType="arraybuffer";

xhr.onload=function (oEvent) {
    var arrayBuffer=xhr.response;
    if (arrayBuffer){
        var byteArray=new Uint8Array(arrayBuffer)
        for (var i=0;i<byteArray.byteLength;i++){
            //对数组中每个元素进行操作
        }
    }
}
xhr.send(null)

猜你喜欢

转载自blog.csdn.net/zy21131437/article/details/81254597