LearningRecord icon indicating copy to clipboard operation
LearningRecord copied to clipboard

你熟悉 Typed Arrays 吗? 如果熟悉,请解释他们与 JavaScript 中的传统数组相比的异同?

Open Rashomon511 opened this issue 5 years ago • 0 comments

一个TypedArray 对象描述一个底层的二进制数据缓存区的一个类似数组(array-like)视图 JavaScript的TypedArray分为两个部分:缓冲区和视图

  • 缓 冲区由ArrayBuffer实现,一个缓冲区是一个代表某个数据块的对象。它没有格式,而且没有提供一个机制来访问或操纵其中的内容。为了存取缓冲区中 的内容,你需要创建一个视图。视图提供了一个环境(context),包括数据类型、起始偏移量以及元素数量。它把数据转化为实际上的类型化数组。
  • 视图由 ArrayBufferView和它的一些子类实现

ArrayBufferView的子类: 下面的子类提供了特定的缓冲区视图,用来处理不同类型的数据。要注意的是,如果要处理的数据类型超过一字节,将使用平台对应的端序。如果需要操作端序,可以使用DataView来代替ArrayBufferView。 Int8Array 、Uint8Array、Int16Array、Uint16Array、Int32Array、Uint32Array、Float32Array、Float64Array

ArrayBufferView的父类:

  • DataView:DataView提供了一个底层接口来从ArrayBuffer中存取数据
  • StringView:​StringView提供了一个构建于ArrayBuffer之上的C语言风格的字符串操作接口(比如说字符编码的数组,类似JavaScript中的ArrayBufferView)

操作更复杂的数据结构

var buffer = new ArrayBuffer(24);
var idView = new Uint32Array(buffer, 0, 1);
var usernameView = new Uint8Array(buffer, 4, 16);
var amountDueView = new Float32Array(buffer, 20, 1);

转换成普通的数组

var typedArray = new Uint8Array( [ 1, 2, 3, 4 ] ),
normalArray = Array.apply( [], typedArray );
normalArray.length === 4;
normalArray.constructor === Array;

Rashomon511 avatar Jul 15 '19 03:07 Rashomon511