?
u
m
/
p
1-9
0
`
本小节、
读-改-写 修改函数 是一种数学函数,以抽象闭包形式表示,接受两个
为帮助验证读-改-写 修改函数的算法步骤构成一个纯粹的数学函数,建议遵循以下编辑约定:
固定长度 ArrayBuffer(fixed-length ArrayBuffer) 是创建后其字节长度不可改变的 ArrayBuffer。
可调整大小 ArrayBuffer(resizable ArrayBuffer) 是创建后其字节长度可通过调用
创建何种 ArrayBuffer 对象取决于传递给
The abstract operation AllocateArrayBuffer takes arguments constructor (a constructor) and byteLength (a non-negative
The abstract operation ArrayBufferByteLength takes arguments arrayBuffer (an ArrayBuffer or SharedArrayBuffer) and order (
The abstract operation ArrayBufferCopyAndDetach takes arguments arrayBuffer (an ECMAScript language value), newLength (an ECMAScript language value), and preserveResizability (
realloc
。The abstract operation IsDetachedBuffer takes argument arrayBuffer (an ArrayBuffer or a SharedArrayBuffer) and returns a Boolean. It performs the following steps when called:
The abstract operation DetachArrayBuffer takes argument arrayBuffer (an ArrayBuffer) and optional argument key (anything) and returns 要么是包含
分离一个 ArrayBuffer 实例会将其用作后备存储的
The abstract operation CloneArrayBuffer takes arguments srcBuffer (an ArrayBuffer or a SharedArrayBuffer), srcByteOffset (a non-negative
The abstract operation GetArrayBufferMaxByteLengthOption takes argument options (an ECMAScript language value) and returns 要么是包含非负整数或
The host-defined abstract operation HostResizeArrayBuffer takes arguments buffer (an ArrayBuffer) and newByteLength (a non-negative
HostResizeArrayBuffer 的实现必须符合以下要求:
默认实现返回
The abstract operation IsFixedLengthArrayBuffer takes argument arrayBuffer (an ArrayBuffer or a SharedArrayBuffer) and returns a Boolean. It performs the following steps when called:
The abstract operation IsUnsignedElementType takes argument type (a
The abstract operation IsUnclampedIntegerElementType takes argument type (a
The abstract operation IsBigIntElementType takes argument type (a
The abstract operation IsNoTearConfiguration takes arguments type (a
The abstract operation RawBytesToNumeric takes arguments type (a
The abstract operation GetRawBytesFromSharedBlock takes arguments block (a
The abstract operation GetValueFromBuffer takes arguments arrayBuffer (an ArrayBuffer or SharedArrayBuffer), byteIndex (a non-negative
The abstract operation NumericToRawBytes takes arguments type (a
The abstract operation SetValueInBuffer takes arguments arrayBuffer (an ArrayBuffer or SharedArrayBuffer), byteIndex (a non-negative
The abstract operation GetModifySetValueInBuffer takes arguments arrayBuffer (an ArrayBuffer or a SharedArrayBuffer), byteIndex (a non-negative
ArrayBuffer
extends
子句的值。继承该指定行为的子类super
调用,以创建并初始化具有支持 ArrayBuffer.prototype
内置方法所需内部状态的子类实例。该函数被调用时执行以下步骤:
ArrayBuffer
该函数被调用时执行以下步骤:
ArrayBuffer.prototype
的初始值是
该属性的特性为 { [[Writable]]:
ArrayBuffer[%Symbol.species%]
是一个存取器属性,其 set 访问器为
该函数
ArrayBuffer 原型对象:
ArrayBuffer.prototype.byteLength
是一个存取器属性,其 set 访问器为
ArrayBuffer.prototype.constructor
的初始值是
ArrayBuffer.prototype.detached
是一个存取器属性,其 set 访问器为
ArrayBuffer.prototype.maxByteLength
是一个存取器属性,其 set 访问器为
ArrayBuffer.prototype.resizable
是一个存取器属性,其 set 访问器为
该方法被调用时执行以下步骤:
该方法被调用时执行以下步骤:
该方法被调用时执行以下步骤:
该方法被调用时执行以下步骤:
该属性特性为 { [[Writable]]:
ArrayBuffer 实例从
[[ArrayBufferData]] 为
[[ArrayBufferDetachKey]] 设为非
以下是供 ECMAScript 程序员在使用可调整大小 ArrayBuffer 时的指南。
建议在部署环境中(如果可能)对程序进行测试。不同硬件设备的可用物理内存差异很大;虚拟内存子系统也因硬件设备与操作系统不同而差异明显。一个在 64 位桌面浏览器中无内存不足错误的应用,可能在 32 位移动浏览器中耗尽内存。
为可调整大小 ArrayBuffer 选择
请注意:成功构造一个指定最大值的可调整大小 ArrayBuffer 并不保证未来的扩展一定成功。
以下是供实现可调整大小 ArrayBuffer 的 ECMAScript 实现者的指南。
Resizable ArrayBuffer 可实现为在调整时复制、通过预留虚拟内存的原地增长、或针对
若
若
固定长度 SharedArrayBuffer 是创建后其字节长度不可改变的 SharedArrayBuffer。
可增长 SharedArrayBuffer 是创建后其字节长度可通过调用
创建哪种 SharedArrayBuffer 对象取决于传递给
The abstract operation AllocateSharedArrayBuffer takes arguments constructor (a constructor) and byteLength (a non-negative
The abstract operation IsSharedArrayBuffer takes argument obj (an ArrayBuffer or a SharedArrayBuffer) and returns a Boolean. 测试一个对象是否是 ArrayBuffer、SharedArrayBuffer,或它们的子类型。 It performs the following steps when called:
The host-defined abstract operation HostGrowSharedArrayBuffer takes arguments buffer (a SharedArrayBuffer) and newByteLength (a non-negative
HostGrowSharedArrayBuffer 的实现必须符合以下要求:
SharedArrayBuffer.prototype.grow
调用不会“丢失”(即静默不做任何事)。上面第二个要求有意未明确说明如何或何时读取 buffer 的当前字节长度。由于字节长度必须通过底层硬件的原子读-改-写操作更新,使用 load-link/store-conditional 或 load-exclusive/store-exclusive 指令对的体系结构可能希望将该指令对在指令流中保持紧邻。因此,SharedArrayBuffer.prototype.grow 自身不会在调用 HostGrowSharedArrayBuffer 前对 newByteLength 做边界检查,也不要求何时读取当前字节长度。
这与
HostGrowSharedArrayBuffer 的默认实现是返回
SharedArrayBuffer
extends
子句的值。欲继承指定 SharedArrayBuffer 行为的子类super
调用,以创建并初始化具有支持 SharedArrayBuffer.prototype
内置方法所需内部状态的子类实例。当
不同于 ArrayBuffer
,SharedArrayBuffer
不会被分离,其内部 [[ArrayBufferData]] 槽永不为
该函数被调用时执行以下步骤:
SharedArrayBuffer
SharedArrayBuffer.prototype
的初始值是
该属性特性为 { [[Writable]]:
SharedArrayBuffer[%Symbol.species%]
是一个存取器属性,其 set 访问器函数为
该函数
SharedArrayBuffer 原型对象:
SharedArrayBuffer.prototype.byteLength
是一个存取器属性,其 set 访问器函数为
SharedArrayBuffer.prototype.constructor
的初始值是
该方法被调用时执行以下步骤:
禁止比较交换更新长度的虚假失败。若新长度的边界检查通过且实现未耗尽内存,则总会向候选执行添加一个
对 SharedArrayBuffer.prototype.grow 的并行调用是全序的。例如并发的 sab.grow(10)
与 sab.grow(20)
,二者之一必定赢得竞争。sab.grow(10)
不会在 sab.grow(20)
先发生时收缩 sab
;在那种情况下它将抛出 RangeError。
SharedArrayBuffer.prototype.growable
是一个存取器属性,其 set 访问器函数为
SharedArrayBuffer.prototype.maxByteLength
是一个存取器属性,其 set 访问器函数为
该方法被调用时执行以下步骤:
该属性特性为 { [[Writable]]:
SharedArrayBuffer 实例从
SharedArrayBuffer 实例与 ArrayBuffer 实例不同,永远不会被分离。
以下是供使用
建议在部署环境中(若可行)对程序进行测试。不同硬件设备的可用物理内存差异巨大;虚拟内存子系统同样因硬件与操作系统不同而显著差异。一个在 64 位桌面浏览器中无内存耗尽错误的应用,可能在 32 位移动浏览器中耗尽内存。
为
请注意:成功构造一个指定最大值的
对u8[idx]
)的边界检查中的长度读取不是同步的。一般而言,在缺乏显式同步的情况下,一个属性访问在边界内并不意味着同一 agent 中后续的另一个属性访问也在边界内。相比之下,通过 SharedArrayBuffer、length
与 byteLength
getter 对长度的显式读取是同步的。内置方法为检查
以下是实现
建议将
由于增长操作可与对
被增长的内存在创建时必须表现为已归零,包括对任何并行的竞争访问。这可通过按需零填充的虚拟内存页实现,或在手动清零内存时使用谨慎的同步。
针对
在没有虚拟内存的
具有缓冲区见证记录的 DataView 是一个
具有缓冲区见证记录的 DataView 拥有
字段名 | 值 | 含义 |
---|---|---|
[[Object]] | a DataView | 其缓冲区字节长度被加载的 DataView 对象。 |
[[CachedBufferByteLength]] |
a non-negative |
|
The abstract operation MakeDataViewWithBufferWitnessRecord takes arguments obj (a DataView) and order (
The abstract operation GetViewByteLength takes argument viewRecord (a DataView With Buffer Witness
The abstract operation IsViewOutOfBounds takes argument viewRecord (a DataView With Buffer Witness
The abstract operation GetViewValue takes arguments view (an ECMAScript language value), requestIndex (an ECMAScript language value), isLittleEndian (an ECMAScript language value), and type (a
The abstract operation SetViewValue takes arguments view (an ECMAScript language value), requestIndex (an ECMAScript language value), isLittleEndian (an ECMAScript language value), type (a
DataView
extends
子句的值。欲继承指定 DataView 行为的子类super
调用,以创建并初始化具有支持 DataView.prototype
内置方法所需内部状态的子类实例。该函数被调用时执行以下步骤:
DataView
DataView.prototype
的初始值是
该属性特性为 { [[Writable]]:
DataView 原型对象:
DataView.prototype.buffer
是一个存取器属性,其 set 访问器函数为
DataView.prototype.byteLength
是一个存取器属性,其 set 访问器函数为
DataView.prototype.byteOffset
是一个存取器属性,其 set 访问器函数为
DataView.prototype.constructor
的初始值是
该方法被调用时执行以下步骤:
该方法被调用时执行以下步骤:
该方法被调用时执行以下步骤:
该方法被调用时执行以下步骤:
该方法被调用时执行以下步骤:
该方法被调用时执行以下步骤:
该方法被调用时执行以下步骤:
该方法被调用时执行以下步骤:
该方法被调用时执行以下步骤:
该方法被调用时执行以下步骤:
该方法被调用时执行以下步骤:
该方法被调用时执行以下步骤:
该方法被调用时执行以下步骤:
该方法被调用时执行以下步骤:
该方法被调用时执行以下步骤:
该方法被调用时执行以下步骤:
该方法被调用时执行以下步骤:
该方法被调用时执行以下步骤:
该方法被调用时执行以下步骤:
该方法被调用时执行以下步骤:
该方法被调用时执行以下步骤:
该方法被调用时执行以下步骤:
该属性特性为 { [[Writable]]:
DataView 实例是从
[[DataView]] 内部槽的值不在本规范中使用。该内部槽的简单存在用于在规范中识别由 DataView
Atomics 对象:
new
运算符一起作为Atomics 对象提供在共享内存数组单元上不可分割(原子)操作的函数,以及让 agent 等待和派发原始事件(primitive events)的函数。正确使用 Atomics 函数,可以让通过共享内存通信的多 agent 程序即便在并行 CPU 上也按照可理解的顺序执行。共享内存通信的规则由下文定义的
关于在 ECMAScript 中编程与实现共享内存的说明性指南,请参见
Waiter Record 是一个 Atomics.wait
或 Atomics.waitAsync
的特定调用。
Waiter Record 拥有
字段名 | 取值 | 含义 |
---|---|---|
[[AgentSignifier]] | 一个 agent 标识符 |
调用 Atomics.wait 或 Atomics.waitAsync 的 agent。
|
[[PromiseCapability]] |
一个 |
若表示一次对 Atomics.waitAsync 的调用,则为生成的 promise,否则为 |
[[TimeoutTime]] |
一个非负 |
可能触发超时的最早时间;使用 |
[[Result]] |
|
调用的返回值。 |
WaiterList Record 用于解释通过 Atomics.wait
、Atomics.waitAsync
与 Atomics.notify
进行的等待与通知。
WaiterList Record 拥有
字段名 | 取值 | 含义 |
---|---|---|
[[Waiters]] |
一个 |
等待与该 WaiterList 关联的位置的 Atomics.wait 或 Atomics.waitAsync 调用。
|
[[MostRecentLeaveEvent]] |
一个 |
最近一次离开其临界区的事件;若从未进入过其临界区则为 |
在一个 WaiterList 中可以有多个具有相同 agent 标识符的
agent 集群拥有一个 WaiterList Record 的存储;该存储由 (block, i) 索引,其中 block 是一个
每个 WaiterList Record 有一个 临界区(critical section),控制在求值期间对该 WaiterList Record 的独占访问。一次只能有一个 agent 进入该临界区。进入和离开临界区由
The abstract operation ValidateIntegerTypedArray takes arguments typedArray (an ECMAScript language value) and waitable (a Boolean) and returns 要么是包含一个
The abstract operation ValidateAtomicAccess takes arguments taRecord (a
The abstract operation ValidateAtomicAccessOnIntegerTypedArray takes arguments typedArray (an ECMAScript language value) and requestIndex (an ECMAScript language value) and returns 要么是包含一个整数的
The abstract operation RevalidateAtomicAccess takes arguments typedArray (a
The abstract operation GetWaiterList takes arguments block (a
The abstract operation EnterCriticalSection takes argument WL (a
当尝试进入临界区的 agent 必须等待另一个 agent 离开时,EnterCriticalSection 存在 争用(contention)。无争用时,EnterCriticalSection 调用的 FIFO 顺序是可观察的;有争用时,实现可选择任意顺序,但不能导致某个 agent 无限期等待。
The abstract operation LeaveCriticalSection takes argument WL (a
The abstract operation AddWaiter takes arguments WL (a
The abstract operation RemoveWaiter takes arguments WL (a
The abstract operation RemoveWaiters takes arguments WL (a
The abstract operation SuspendThisAgent takes arguments WL (a
Atomics.notify
)而被唤醒。The abstract operation NotifyWaiter takes arguments WL (a
一个 agent 不得以除传递给
The abstract operation EnqueueResolveInAgentJob takes arguments agentSignifier (an agent signifier), promiseCapability (a
The abstract operation DoWait takes arguments mode (
additionalTimeout 允许实现按需填充超时,例如用于降低能耗或粗化计时器分辨率以缓解计时攻击。该值在不同 DoWait 调用间可能不同。
The abstract operation EnqueueAtomicsWaitAsyncTimeoutJob takes arguments WL (a
The abstract operation AtomicCompareExchangeInSharedBlock takes arguments block (a
The abstract operation AtomicReadModifyWrite takes arguments typedArray (an ECMAScript language value), index (an ECMAScript language value), value (an ECMAScript language value), and op (a read-modify-write modification function) and returns 要么是包含 Number 或 BigInt 的
The abstract operation ByteListBitwiseOp takes arguments op (&
, ^
, or |
), xBytes (a
&
,则^
,则|
。The abstract operation ByteListEqual takes arguments xBytes (a
该函数被调用时执行以下步骤:
该函数被调用时执行以下步骤:
&
, xBytes, yBytes)。该函数被调用时执行以下步骤:
该函数被调用时执行以下步骤:
该函数被调用时执行以下步骤:
此函数是一个优化原语。直觉是:如果大小为 n 字节的数据上的原子原语(compareExchange
、load
、store
、add
、sub
、and
、or
、xor
或 exchange
)的原子步骤会在不获取该数据之外的锁的情况下执行,则 Atomics.isLockFree
(n) 返回
Atomics.isLockFree
(4) 总是返回
无论此函数返回何值,所有原子操作都保证原子性。例如,它们不会在操作中间出现可见操作(如“撕裂”)。
该函数被调用时执行以下步骤:
该函数被调用时执行以下步骤:
|
, xBytes, yBytes)。该函数被调用时执行以下步骤:
该函数被调用时执行以下步骤:
该函数将外层 agent 置于等待队列并挂起,直到被通知或等待超时,返回区分这些情形的字符串。
调用时执行以下步骤:
该函数返回一个 Promise,当调用者 agent 被通知或超时到达时 resolve。
调用时执行以下步骤:
该函数通知一些在等待队列中休眠的 agent。
调用时执行以下步骤:
该函数被调用时执行以下步骤:
^
, xBytes, yBytes)。该属性具有特性 { [[Writable]]:
JSON 对象:
parse
与 stringify
,用于解析与构造 JSON 文本。new
运算符一起作为JSON 数据交换格式在 ECMA-404 中定义。本规范使用的 JSON 交换格式完全与 ECMA-404 所描述一致。JSON.parse
与 JSON.stringify
的一致实现必须支持 ECMA-404 规范所描述的精确交换格式,不得删除或扩展该格式。
该函数解析一个 JSON 文本(JSON 格式的字符串)并生成一个
可选参数 reviver 是一个带两个参数 key 与 value 的函数。它可以过滤并转换结果。解析产生的每个 key/value 对都会调用它,其返回值将替代原始值。若返回收到的值,结构不变;若返回
该函数的
The abstract operation ParseJSON takes argument text (a String) and returns 要么是包含一个
一致实现的 JSON.parse
不允许扩展 JSON 语法。若实现希望支持修改或扩展的 JSON 交换格式,必须定义不同的解析函数。
有效 JSON 文本是 ECMAScript
然而,由于
当对象中存在重复名称字符串时,词法上先出现的同键值将被
The abstract operation InternalizeJSONProperty takes arguments holder (an Object), name (a String), and reviver (a function object) and returns 要么是包含一个
该算法故意不在 [[Delete]] 或
调用时执行以下步骤:
该函数返回一个 UTF-16 编码的 JSON 格式字符串表示一个
调用时执行以下步骤:
该函数的
JSON 结构允许任意深度嵌套,但必须非循环。若 value 是或包含循环结构,则该函数必须抛出
a = [];
a[0] = a;
my_text = JSON.stringify(a); // 必须抛出 TypeError。
符号化的原始值呈现如下:
字符串值以 QUOTATION MARK ("
) 代码单元包裹。代码单元 "
与 \
以 \
前缀转义。控制字符代码单元替换为 \u
HHHH 转义序列,或更短形式 \b
(BACKSPACE)、\f
(FORM FEED)、\n
(LINE FEED)、\r
(CARRIAGE RETURN)、\t
(CHARACTER TABULATION)。
没有 JSON 表示的值(如
对象呈现为 U+007B (LEFT CURLY BRACKET) 后跟零个或多个属性,以 U+002C (COMMA) 分隔,以 U+007D (RIGHT CURLY BRACKET) 结束。属性由表示
JSON Serialization Record 是一个
JSON Serialization Record 拥有
字段名 | 取值 | 含义 |
---|---|---|
[[ReplacerFunction]] | 一个 |
可为对象属性提供替换值的函数(来自 JSON.stringify 的 replacer 参数)。 |
[[PropertyList]] | 一个 String 的 |
序列化非数组对象时包含的 |
[[Gap]] | 一个 String | 缩进单元(来自 space 参数)。 |
[[Stack]] | 一个对象的 |
正在序列化的嵌套对象集合,用于检测循环结构。 |
[[Indent]] | 一个 String | 当前缩进。 |
The abstract operation SerializeJSONProperty takes arguments state (a
The abstract operation QuoteJSONString takes argument value (a String) and returns a String. 将 value 用 0x0022 (QUOTATION MARK) 代码单元包裹并对其中某些代码单元转义。该操作将 value 视作 UTF-16 编码的代码点序列,详见
Code Point | Unicode 字符名称 | 转义序列 |
---|---|---|
U+0008 | BACKSPACE |
\b
|
U+0009 | CHARACTER TABULATION |
\t
|
U+000A | LINE FEED (LF) |
\n
|
U+000C | FORM FEED (FF) |
\f
|
U+000D | CARRIAGE RETURN (CR) |
\r
|
U+0022 | QUOTATION MARK |
\"
|
U+005C | REVERSE SOLIDUS |
\\
|
The abstract operation UnicodeEscape takes argument C (a code unit) and returns a String. 以 Unicode 转义序列表示 C。 It performs the following steps when called:
The abstract operation SerializeJSONObject takes arguments state (a
The abstract operation SerializeJSONArray takes arguments state (a
数组表示仅包含从 array.length
(不含)的元素。键不是
该属性具有特性 { [[Writable]]: