添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

它是一个字节数组,通常在其他语言中称为“byte array”。

你不能直接操作 ArrayBuffer 的内容,而是要通过 TypedArray 类型数组 )对象或 DataView 对象来操作,它们会将缓冲区中的数据表示为特定的格式,并通过这些格式来读写缓冲区的内容。

它的含义类似 NodeJs 中的 Buffer 。简单来说,我们可以通过 ArrayBuffer 来开辟一段二进制数据空间,但是它只能通过 TypedArray 或者 DataView 来进行操作。

简单用法:

//创建一个长度为 8 的 ArrayBuffer ,此时开辟一个固定 8 个字节的缓冲区也就是 64 位
const buffer = new ArrayBuffer(8);
console.log(buffer.byteLength); // 8

length 大于 Number.MAX_SAFE_INTEGER(>= 2 \*\* 53) 或为负数,则抛出一个 RangeError 异常。

从 XHR、File API、Canvas, WebGL 等等各种地方,读取了一大串字节流,如果用 JS 里的 Array 去存,又浪费,又低效,

于是为了配合这些新的 API 增强 JS 的二进制处理能力,就有了 ArrayBuffer

创建 ArrayBuffer 的时候,就相当于申请了一块内存, 不能(也不方便)直接用它,

所以也就有了 TypedArray ,比如 Uint32Array, Int16Array, Int8Array, Float32Array 等等。

1.1.TypedArray

一个类型化数组(TypedArray)对象 描述了一个底层的 二进制数据缓冲区 (binary data buffer)的一个类数组视图(view)。

稍微翻译下上边的话,也就是说可以通过 TypedArray 来操作 ArrayBuffer 的实例。

事实上,没有名为 TypedArray 的全局属性,也没有一个名为 TypedArray 的构造函数。相反,有许多不同的全局属性,它们的值是特定元素类型的类型化数组构造函数

这句话简单来讲,你可以将 TypedArray 理解为一种接口的形式。所谓 TypedArray 它并不包含具体的实现而是代表一系列具有相同特性(类数组视图)的集合概念。

也就是说 TypedArray 不可被直接实例化,本身也无法访问。但是它有很多种不同的实现方式。

  • TypedArray 内的成员只能是同一类型,都是数字,Array 可以存储任意元素
  • TypedArray 成员是连续的,不会有空位,Array 可以有空位
  • TypedArray 成员的默认值为 0,Array 的默认值为空
  • TypedArray 定义时长度固定不可动态增加或减小,Array 长度可变
  • TypedArray 只是视图,本身不存储数据,数据都存储在底层的 ArrayBuffer 中,要获取底层对象必须使用 buffer 属性
  • TypedArray Array.isArray() 返回 false
  • TypedArray 可以直接操作内存,不需要进行类型转换,所以比数组快
  • 创建构造函数:

    // 下面代码是语法格式,不能直接运行,
    // TypedArray 关键字需要替换为底部列出的构造函数。
    new TypedArray(); // ES2017中新增
    new TypedArray(length);
    new TypedArray(typedArray);
    new TypedArray(object);
    new TypedArray(buffer [, byteOffset [, length]]);

    TypedArray 指的是以下的其中之一:

    大小(bytes) Web IDL 类型 等价的 C 类型 Int8Array -128 到 127 8 位有符号整型(补码) int8_t Uint8Array 0 到 255 8 位无符号整型 octet uint8_t Uint8ClampedArray 0 到 255 8 位无符号整型(一定在 0 到 255 之间) octet uint8_t Int16Array -32768 到 32767 16 位有符号整型(补码) short int16_t Uint16Array 0 到 65535 16 位无符号整型 unsigned short uint16_t Int32Array -2147483648 到 2147483647 32 位有符号整型(补码) int32_t Uint32Array 0 到 4294967295 32 位无符号整型 unsigned long uint32_t Float32Array -3.4E38 3.4E38 并且 1.2E-38 是最小的正数 32 位 IEEE 浮点数(7 位有效数字,例如 1.234567 ) unrestricted float float Float64Array -1.8E308 1.8E308 并且 5E-324 是最小的正数 64 位 IEEE 浮点数(16 位有效数字,例如 1.23456789012345 ) unrestricted double double BigInt64Array -263 到 263 - 1 64 位有符号整数(补码) bigint int64_t (signed long long) BigUint64Array 0 到 264 - 1 64 位无符号整型 bigint uint64_t (unsigned long long)
  • Unit8Array 指的是,把 ArrayBuffer 的每个 byte(8-bit) 当作一个单独的无符号整型数字 (0 - 255)
  • Unit16Array 表示为使用 16 bits (2 bytes) 表示一个无符号整型 (0 ~ 2^16-1) 的数的数组
  • Int8Array 表示使用 8 bits 表示一个有符号整型 (-128 ~ 127)
  • Float32Array 表示使用 32 bits 表示一个浮点数
  • Unit7ClampedArray 在 0 ~ 255 范围内和 Unit8Array 是一样的,对超出范围的处理有所不同,和图像处理相关(一般像素范围也是 0 ~ 255)
  • // 创建8个字节长度的缓存冲
    const buffer = new ArrayBuffer(8);
    // 将buffer转化为Uint8Array
    // Uint8Array中每一个元素表示一个字节(8位)
    const uint8Array = new Uint8Array(buffer);

    1.2.DataView

    DataView 视图是一个可以从二进制 ArrayBuffer 对象中读写多种数值类型的底层接口,使用它时,不用考虑不同平台的 字节序(endianness) 问题。

    相较于 TypedArray DataView 对于 ArrayBuffer 的操作更加灵活。

    TypedArray 中操作二进制 ArrayBuffer 时每个元素占用的字节大小是固定的,要么每个元素占用 8 位、16 位或者 32 位。

    DataView 对于 ArrayBuffer 的操作就显得更加灵活了,我们可以通过 DataView ArrayBuffer 中自由的读写多种数据类型,从而控制字节顺序。

    简单来讲,想较与 TypedArray 每个元素中固定的字节大小,我们可以通过 DataView 来自由的操作 ArrayBuffer

    创建 DataView:

    new DataView(buffer [, byteOffset [, byteLength]])
    // 创建8个字节长度的缓存冲
    const buffer = new ArrayBuffer(8);
    // 根据传入的buffer 从第一个字节开始,并且字节长度为匹配buffer的长度
    const dataView = new DataView(buffer);
    // 将DataView中偏移量为0个字节的字节,也就是第一个字节设置为十进制的1
    dataView.setUint8(0, 1);
    // 将DataView中偏移量为1个字节的字节,也就是第二个字节设置为十进制的2
    dataView.setUint8(1, 2);

    创建 DataView 支持传入三个参数:

  • buffer :为必填,它支持传入一个 ArrayBuffer 表示 DataView 中的源数据。
  • byteOffset :选填,它表示创建 DataView 时开头从 buffer 的哪个字节开始,可以作为启始偏移量。未指定时,默认从第一个字节开始。
  • btyeLength :选填,它表示创建该 DataView 时的长度,当不传递默认时表示匹配 buffer 的长度。
  • 1.3.TypedArray 和 DataView 的设计目的

    ArrayBuffer 对象的各种 TypedArray 视图,是用来向网卡、声卡之类的本机设备传送数据,所以使用本机的字节序就可以了;

    DataView 视图的设计目的,是用来处理网络设备传来的数据,所以大端字节序或小端字节序是可以自行设定的。

    1.4.ArrayBuffer、TypedArray、DataView 关系图

    2.Blob

    Blob 对象表示一个不可变、原始数据的类文件对象。它的数据可以按文本或二进制的格式进行读取,也可以转换成 ReadableStream 来用于数据操作。

    注意 File 对象是继承与 blob

    创建如下:

    const aBlob = new Blob(array, options);

    Blob() 构造函数返回一个新的 Blob 对象。 blob 的内容由参数数组中给出的值的串联组成。
    通过 new Blob 可以创建一个新的 blob 对象实例,构造函数支持接受两个参数:

  • array : 是一个由 ArrayBuffer , ArrayBufferView , Blob , DOMString 等对象构成的 Array ,或者其他类似对象的混合体,它将会被放进 Blob DOMStrings 会被编码为 UTF-8
  • options : 是一个对象,它拥有如下属性:
  •