它是一个字节数组,通常在其他语言中称为“byte array”。
你不能直接操作
ArrayBuffer
的内容,而是要通过
TypedArray
(
类型数组
)对象或
DataView
对象来操作,它们会将缓冲区中的数据表示为特定的格式,并通过这些格式来读写缓冲区的内容。
它的含义类似 NodeJs 中的
Buffer
。简单来说,我们可以通过
ArrayBuffer
来开辟一段二进制数据空间,但是它只能通过
TypedArray
或者
DataView
来进行操作。
简单用法:
const buffer = new ArrayBuffer(8);
console.log(buffer.byteLength);
length 大于
Number.MAX_SAFE_INTEGER(>= 2 \*\* 53)
或为负数,则抛出一个
RangeError
异常。
从 XHR、File API、Canvas, WebGL 等等各种地方,读取了一大串字节流,如果用 JS 里的 Array 去存,又浪费,又低效,
于是为了配合这些新的 API 增强 JS 的二进制处理能力,就有了
ArrayBuffer
。
创建
ArrayBuffer
的时候,就相当于申请了一块内存, 不能(也不方便)直接用它,
所以也就有了
TypedArray
,比如
Uint32Array, Int16Array, Int8Array, Float32Array
等等。
字节序(endianness)
问题。
相较于
TypedArray
,
DataView
对于
ArrayBuffer
的操作更加灵活。
在
TypedArray
中操作二进制
ArrayBuffer
时每个元素占用的字节大小是固定的,要么每个元素占用 8 位、16 位或者 32 位。
而
DataView
对于
ArrayBuffer
的操作就显得更加灵活了,我们可以通过
DataView
从
ArrayBuffer
中自由的读写多种数据类型,从而控制字节顺序。
简单来讲,想较与
TypedArray
每个元素中固定的字节大小,我们可以通过
DataView
来自由的操作
ArrayBuffer
。
创建 DataView:
new DataView(buffer [, byteOffset [, byteLength]])
const buffer = new ArrayBuffer(8);
const dataView = new DataView(buffer);
dataView.setUint8(0, 1);
dataView.setUint8(1, 2);
创建
DataView
支持传入三个参数:
buffer
:为必填,它支持传入一个
ArrayBuffer
表示
DataView
中的源数据。
byteOffset
:选填,它表示创建
DataView
时开头从
buffer
的哪个字节开始,可以作为启始偏移量。未指定时,默认从第一个字节开始。
btyeLength
:选填,它表示创建该
DataView
时的长度,当不传递默认时表示匹配
buffer
的长度。
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
: 是一个对象,它拥有如下属性:
-
type
:默认值为
""
,它代表了将会被放入到 blob 中的数组内容的 MIME 类型。
-
endings
:默认值为
"transparent"
,用于指定包含行结束符
\n
的字符串如何被写入。 它是以下两个值中的一个:
"native"
,代表行结束符会被更改为适合宿主操作系统文件系统的换行符,或者
"transparent"
,代表会保持 blob 中保存的结束符不变
常见的 MIME 类型:
MIME 类型
text/plain
纯文本文档
text/html
HTML 文档
text/javascript
JavaScript 文件
text/css
CSS 文件
application/json
JSON 文件
application/pdf
PDF 文件
application/xml
XML 文件
image/jpeg
JPEG 图像
image/png
PNG 图像
image/gif
GIF 图像
image/svg+xml
SVG 图像
audio
MP3 文件
video
MP4 文件
创建一个 blob 对象:
const name = JSON.stringify({ name: "tianyichuxin" });
const blob = new Blob([name], {
type: "application/json",
});
console.log(blob.size);
const buffer = new ArrayBuffer(8);
const bufferToBlob = new Blob([buffer]);
console.log(bufferToBlob.size);
部分方法:
slice()
从 Blob 中截取一部分并返回一个新的 Blob(用法同数组的 slice)
arrayBuffer()
返回一个以二进制形式展现的 promise
stream()
返回一个 ReadableStream 对象
text()
返回一个文本形式的 promise
Blob
,且可以用在任意的 Blob 类型的 context 中。比如说,
FileReader
,
URL.createObjectURL()
,
createImageBitmap()
, 及
XMLHttpRequest.send()
都能处理
Blob
和
File
。
创建如下:
const file = new File(array, name[, options])
array
:是一个由
ArrayBuffer
,
ArrayBufferView
,
Blob
,
DOMString
等对象构成,DOMStrings
会被编码为 UTF-8。
name
:表示文件名称,或者文件路径。
options
:是一个可选,它可能会指定如下两个属性:
-
type
:默认值为
""
,内容的 MIME 类型。
-
lastModified
:数值,表示文件最后修改时间的 Unix 时间戳(毫秒)。默认值为
Date.now()
。
audiobuffer-to-wav
JS 纯前端实现 audio 音频剪裁剪切复制播放与上传
浅析 JavaScript 类型化数组
Blob、File、ArrayBuffer、TypedArray、DataView 究竟应该如何应用
JS 二进制文件转换:File、Blob、Base64、ArrayBuffer