1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
|
---
title: ArrayBuffer
slug: Web/JavaScript/Reference/Global_Objects/ArrayBuffer
tags:
- ArrayBuffer
- JavaScript
- 构造函数
- 类型数组
translation_of: Web/JavaScript/Reference/Global_Objects/ArrayBuffer
---
<div>
<p>{{JSRef}}</p>
<p><strong><code>ArrayBuffer</code></strong> 对象用来表示通用的、固定长度的原始二进制数据缓冲区。</p>
<p>它是一个字节数组,通常在其他语言中称为“byte array”。</p>
<p>你不能直接操作 <code>ArrayBuffer</code> 的内容,而是要通过<a href="https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/TypedArray">类型数组对象</a>或 {{jsxref("DataView")}} 对象来操作,它们会将缓冲区中的数据表示为特定的格式,并通过这些格式来读写缓冲区的内容。</p>
</div>
<div>{{EmbedInteractiveExample("pages/js/arraybuffer-constructor.html")}}</div>
<h2 id="语法">语法</h2>
<pre class="syntaxbox">new ArrayBuffer(length)
</pre>
<h3 id="参数">参数</h3>
<dl>
<dt><code>length</code></dt>
<dd>要创建的 <code>ArrayBuffer</code> 的大小,单位为字节。</dd>
</dl>
<h3 id="返回值">返回值</h3>
<p>一个指定大小的 <code>ArrayBuffer</code> 对象,其内容被初始化为 0。</p>
<h3 id="异常">异常</h3>
<p>如果 <code>length</code> 大于 {{jsxref("Number.MAX_SAFE_INTEGER")}}(>= 2 ** 53)或为负数,则抛出一个 {{jsxref("RangeError")}} 异常。</p>
<h2 id="描述">描述</h2>
<p><code>ArrayBuffer</code> 构造函数用来创建一个指定字节长度的 <code>ArrayBuffer</code> 对象。</p>
<h3 id="以现有数据获取_ArrayBuffer">以现有数据获取 ArrayBuffer</h3>
<ul>
<li><a href="https://developer.mozilla.org/zh-CN/docs/Web/API/WindowBase64/Base64_encoding_and_decoding#Appendix.3A_Decode_a_Base64_string_to_Uint8Array_or_ArrayBuffer">从 Base64 字符串</a></li>
<li><a href="https://developer.mozilla.org/zh-CN/docs/Web/API/FileReader#readAsArrayBuffer()">从本地文件</a></li>
</ul>
<h2 id="属性">属性</h2>
<dl>
<dt><code>ArrayBuffer.length</code></dt>
<dd>ArrayBuffer 构造函数的 length 属性,其值为1。</dd>
<dt>{{jsxref("ArrayBuffer.prototype.byteLength")}}</dt>
<dd>只读属性,表示 <code>ArrayBuffer</code> 的byte的大小,在ArrayBuffer构造完成时生成,不可改变。</dd>
<dt>{{jsxref("ArrayBuffer.@@species", "get ArrayBuffer[@@species]")}}</dt>
<dd>返回 ArrayBuffer 的构造函数。</dd>
<dt>{{jsxref("ArrayBuffer.prototype")}}</dt>
<dd>通过 ArrayBuffer 的原型对象可以为所有 ArrayBuffer 对象添加属性。</dd>
</dl>
<h2 id="方法">方法</h2>
<dl>
<dt>{{jsxref("ArrayBuffer.isView", "ArrayBuffer.isView(arg)")}}</dt>
<dd>如果参数是 ArrayBuffer 的视图实例则返回 <code>true</code>,例如 <a href="https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/TypedArray">类型数组对象</a> 或 {{jsxref("DataView")}} 对象;否则返回 <code>false</code>。</dd>
<dt>{{jsxref("ArrayBuffer.transfer", "ArrayBuffer.transfer(oldBuffer [, newByteLength])")}} {{experimental_inline}}</dt>
<dd>
<p>返回一个新的 ArrayBuffer 对象,其内容取自 <code>oldBuffer</code> 中的数据,并且根据 <code>newByteLength</code> 的大小对数据进行截取或补 0。</p>
</dd>
</dl>
<h2 id="ArrayBuffer_实例">ArrayBuffer 实例</h2>
<p>所有 <code>ArrayBuffer</code> 实例都会从 {{jsxref("ArrayBuffer.prototype")}} 继承属性和方法。</p>
<h3 id="属性_2">属性</h3>
<p>{{page('zh-CN/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer/prototype','属性')}}</p>
<h3 id="方法_2">方法</h3>
<p>{{page('zh-CN/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer/prototype','方法')}}</p>
<dl>
<dt>{{jsxref("ArrayBuffer.slice()")}} {{non-standard_inline}}</dt>
<dd>和 {{jsxref("ArrayBuffer.prototype.slice()")}} 功能相同。</dd>
</dl>
<h2 id="示例">示例</h2>
<p>下面的例子创建了一个 8 字节的缓冲区,并使用一个 {{jsxref("Global_Objects/Int32Array", "Int32Array")}} 来引用它:</p>
<pre><code>var buffer = new ArrayBuffer(8);
var view = new Int32Array(buffer);</code>
</pre>
<h2 id="规范">规范</h2>
<table class="standard-table">
<tbody>
<tr>
<th scope="col">Specification</th>
<th scope="col">Status</th>
<th scope="col">Comment</th>
</tr>
<tr>
<td>{{SpecName('Typed Array')}}</td>
<td>{{Spec2('Typed Array')}}</td>
<td>已被 ECMAScript 6 中的 ArrayBuffer 取代</td>
</tr>
<tr>
<td>{{SpecName('ES6', '#sec-arraybuffer-constructor', 'ArrayBuffer')}}</td>
<td>{{Spec2('ES6')}}</td>
<td>在 ECMA 标准中的初始定义。规定了必须通过 <code>new</code> 来调用构造函数</td>
</tr>
<tr>
<td>{{SpecName('ESDraft', '#sec-arraybuffer-constructor', 'ArrayBuffer')}}</td>
<td>{{Spec2('ESDraft')}}</td>
<td></td>
</tr>
</tbody>
</table>
<h2 id="浏览器兼容性">浏览器兼容性</h2>
<p>{{Compat("javascript.builtins.ArrayBuffer")}}</p>
<h2 id="兼容性提醒">兼容性提醒</h2>
<p>从 ECMAScript 2015 开始,<code>ArrayBuffer</code> 对象需要用 {{jsxref("Operators/new", "new")}} 运算符创建。如果调用构造函数时没有使用 <code>new</code>,将会抛出 {{jsxref("TypeError")}} 异常。</p>
<pre class="brush: js example-bad">var dv = ArrayBuffer(10);
// TypeError: calling a builtin ArrayBuffer constructor
// without new is forbidden</pre>
<pre class="brush: js example-good">var dv = new ArrayBuffer(10);</pre>
<h2 id="相关链接">相关链接</h2>
<ul>
<li><a href="https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Typed_arrays">JavaScript 类型数组</a></li>
<li><a href="zh-CN/docs/Web/JavaScript/Typed_arrays" title="zh-CN/JavaScript typed arrays">{{jsxref("SharedArrayBuffer")}}</a></li>
</ul>
|