?um/p1-90`本节、
读-改-写修改函数是一个数学函数,表示为一个
为帮助验证读-改-写修改函数的算法步骤构成纯粹的数学函数,推荐采用以下编辑约定:
定长 ArrayBuffer 是创建后字节长度不能改变的 ArrayBuffer。
可调整大小的 ArrayBuffer 是创建后字节长度可以通过调用
创建哪种 ArrayBuffer 对象取决于传给
The abstract operation AllocateArrayBuffer takes arguments ctor (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 either a normal completion containing
分离 ArrayBuffer 实例会解除用作其后备存储的
The abstract operation CloneArrayBuffer takes arguments sourceBuffer (an ArrayBuffer or a SharedArrayBuffer), sourceByteOffset (a non-negative
The abstract operation GetArrayBufferMaxByteLengthOption takes argument options (an ECMAScript language value) and returns either a normal completion containing either a non-negative
The host-defined abstract operation HostResizeArrayBuffer takes arguments buffer (an ArrayBuffer) and newByteLength (a non-negative
HostResizeArrayBuffer 的实现必须符合以下要求:
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 子句的值。打算继承指定 ArrayBuffer 行为的子类super 调用,以创建并初始化子类实例,使其具备支持 ArrayBuffer.prototype 的内置方法所必需的内部状态。此函数在被调用时执行以下步骤:
ArrayBuffer 构造器:
此函数在被调用时执行以下步骤:
ArrayBuffer.prototype 的初始值是
此属性具有特性 { [[Writable]]:
ArrayBuffer[%Symbol.species%] 是
此函数的
ArrayBuffer 原型对象:
ArrayBuffer.prototype.byteLength 是
ArrayBuffer.prototype.constructor 的初始值是
ArrayBuffer.prototype.detached 是
ArrayBuffer.prototype.maxByteLength 是
ArrayBuffer.prototype.resizable 是
此方法在被调用时执行以下步骤:
此方法在被调用时执行以下步骤:
此方法在被调用时执行以下步骤:
此方法在被调用时执行以下步骤:
此属性具有特性 { [[Writable]]:
ArrayBuffer 实例继承自
[[ArrayBufferData]] 为
[[ArrayBufferDetachKey]] 被设置为除
以下是面向使用可调整大小 ArrayBuffer 的 ECMAScript 程序员的指南。
我们建议尽可能在程序的部署环境中进行测试。不同硬件设备之间可用物理内存的数量差异很大。同样,虚拟内存子系统在不同硬件设备以及操作系统之间也差异很大。一个在 64 位桌面 Web 浏览器上运行而没有内存不足错误的应用,在 32 位移动 Web 浏览器上可能会耗尽内存。
在为可调整大小 ArrayBuffer 选择
请注意,成功构造具有特定最大大小的可调整大小 ArrayBuffer,并不保证未来调整大小会成功。
以下是面向实现可调整大小 ArrayBuffer 的 ECMAScript 实现者的指南。
可调整大小 ArrayBuffer 可以实现为调整大小时复制、通过预先保留虚拟内存进行原地增长,或根据构造器的
如果
如果
定长 SharedArrayBuffer 是创建后字节长度不能改变的 SharedArrayBuffer。
可增长 SharedArrayBuffer 是创建后字节长度可以通过调用
创建哪种 SharedArrayBuffer 对象取决于传给
The abstract operation AllocateSharedArrayBuffer takes arguments ctor (a constructor) and byteLength (a non-negative
The abstract operation IsSharedArrayBuffer takes argument obj (an ArrayBuffer or a SharedArrayBuffer) and returns a Boolean. 它测试一个对象是否为 SharedArrayBuffer。 It performs the following steps when called:
The abstract operation IsGrowableSharedArrayBuffer takes argument obj (an ArrayBuffer or a SharedArrayBuffer) and returns a Boolean. 它测试一个对象是否为可增长的 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 的实现必须符合以下要求:
上面的第二项要求有意对如何或何时读取 buffer 的当前字节长度保持模糊。由于字节长度必须通过底层硬件上的原子读-改-写操作来更新,使用 load-link/store-conditional 或 load-exclusive/store-exclusive 指令对的架构可能希望让成对指令在指令流中保持接近。因此,
这与
HostGrowSharedArrayBuffer 的默认实现是返回
SharedArrayBuffer 构造器:
extends 子句的值。打算继承指定 SharedArrayBuffer 行为的子类super 调用,以创建并初始化子类实例,使其具备支持 SharedArrayBuffer.prototype 的内置方法所必需的内部状态。每当
不同于 ArrayBuffer,SharedArrayBuffer 不能被分离,其内部 [[ArrayBufferData]] 槽永远不会是
此函数在被调用时执行以下步骤:
SharedArrayBuffer 构造器:
SharedArrayBuffer.prototype 的初始值是
此属性具有特性 { [[Writable]]:
SharedArrayBuffer[%Symbol.species%] 是
此函数的
SharedArrayBuffer 原型对象:
SharedArrayBuffer.prototype.byteLength 是
SharedArrayBuffer.prototype.constructor 的初始值是
此方法在被调用时执行以下步骤:
禁止 compare-exchange 更新长度时出现伪失败。如果新长度的边界检查通过且实现未内存不足,则总会向
对 SharedArrayBuffer.prototype.grow 的并行调用是完全排序的。例如,考虑两个竞态调用:sab.grow(10) 和 sab.grow(20)。这两个调用中保证有一个会赢得竞态。即使 sab.grow(20) 先发生,对 sab.grow(10) 的调用也绝不会缩小 sab;在这种情况下,它会改为抛出 RangeError。
SharedArrayBuffer.prototype.growable 是
SharedArrayBuffer.prototype.maxByteLength 是
此方法在被调用时执行以下步骤:
此属性具有特性 { [[Writable]]:
SharedArrayBuffer 实例继承自
SharedArrayBuffer 实例不同于 ArrayBuffer 实例,它们永远不会被分离。
以下是面向使用
我们建议尽可能在程序的部署环境中进行测试。不同硬件设备之间可用物理内存的数量差异很大。同样,虚拟内存子系统在不同硬件设备以及操作系统之间也差异很大。一个在 64 位桌面 Web 浏览器上运行而没有内存不足错误的应用,在 32 位移动 Web 浏览器上可能会耗尽内存。
在为
请注意,成功构造具有特定最大大小的
并非所有对u8[idx])边界检查的长度加载不是同步性的。通常,在没有显式同步的情况下,一个属性访问在边界内并不意味着同一 length 与 byteLength getter 对长度进行的显式加载是同步性的。由内置方法为检查
以下是面向实现
我们建议将
由于增长操作可以与
增长后的内存必须从其创建的那一刻起表现为零填充,包括对于并行的任何竞态访问也是如此。这可以通过按需零填充的虚拟内存页实现,或者在手动清零内存时通过谨慎同步来实现。
对
实践中,在没有虚拟内存的
DataView With Buffer Witness Record 是一种
DataView With Buffer Witness Record 具有
| 字段名 | 值 | 含义 |
|---|---|---|
| [[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
The abstract operation IsViewOutOfBounds takes argument viewRecord (a
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 是
DataView.prototype.byteLength 是
DataView.prototype.byteOffset 是
DataView.prototype.constructor 的初始值是
此方法在被调用时执行以下步骤:
此方法在被调用时执行以下步骤:
此方法在被调用时执行以下步骤:
此方法在被调用时执行以下步骤:
此方法在被调用时执行以下步骤:
此方法在被调用时执行以下步骤:
此方法在被调用时执行以下步骤:
此方法在被调用时执行以下步骤:
此方法在被调用时执行以下步骤:
此方法在被调用时执行以下步骤:
此方法在被调用时执行以下步骤:
此方法在被调用时执行以下步骤:
此方法在被调用时执行以下步骤:
此方法在被调用时执行以下步骤:
此方法在被调用时执行以下步骤:
此方法在被调用时执行以下步骤:
此方法在被调用时执行以下步骤:
此方法在被调用时执行以下步骤:
此方法在被调用时执行以下步骤:
此方法在被调用时执行以下步骤:
此方法在被调用时执行以下步骤:
此方法在被调用时执行以下步骤:
此属性具有特性 { [[Writable]]:
DataView 实例是
[[DataView]] 内部槽的值在本规范中不被使用。该内部槽的单纯存在用于在规范中识别使用 DataView 构造器创建的对象。
Atomics 对象:
new 操作符一起使用。Atomics 对象提供在共享内存数组单元上不可分割地(原子地)操作的函数,以及让
有关在 ECMAScript 中编程和实现共享内存的信息性指南,请参阅
Waiter Record 是一种 Atomics.wait 或 Atomics.waitAsync 的某次特定调用。
Waiter Record 具有
| 字段名 | 值 | 含义 |
|---|---|---|
| [[AgentSignifier]] |
an |
调用了 Atomics.wait 或 Atomics.waitAsync 的 |
| [[PromiseCapability]] |
a |
如果表示对 Atomics.waitAsync 的调用,则为所得的 promise,否则为 |
| [[TimeoutTime]] |
a non-negative |
可以触发超时的最早时间;使用 |
| [[Result]] |
|
调用的返回值。 |
WaiterList Record 用于解释通过 Atomics.wait、Atomics.waitAsync 和 Atomics.notify 对
WaiterList Record 具有
| 字段名 | 值 | 含义 |
|---|---|---|
| [[Waiters]] |
a |
在与此 WaiterList 关联的位置上等待的 Atomics.wait 或 Atomics.waitAsync 调用。
|
| [[MostRecentLeaveEvent]] |
a |
最近一次离开其 |
WaiterList 中可以有多个具有相同
每个 WaiterList Record 都有一个临界区,用于在求值期间控制对该 WaiterList Record 的独占访问。同一时间只能有一个
The abstract operation ValidateIntegerTypedArray takes arguments ta (an ECMAScript language value) and waitable (a Boolean) and returns either a normal completion containing a
The abstract operation ValidateAtomicAccess takes arguments taRecord (a
The abstract operation ValidateAtomicAccessOnIntegerTypedArray takes arguments ta (an ECMAScript language value) and requestIndex (an ECMAScript language value) and returns either a normal completion containing a non-negative
The abstract operation RevalidateAtomicAccess takes arguments ta (a
The abstract operation GetWaiterList takes arguments block (a
The abstract operation EnterCriticalSection takes argument waiterList (a
当试图进入
The abstract operation LeaveCriticalSection takes argument waiterList (a
The abstract operation AddWaiter takes arguments waiterList (a
The abstract operation RemoveWaiter takes arguments waiterList (a
The abstract operation RemoveWaiters takes arguments waiterList (a
The abstract operation SuspendThisAgent takes arguments waiterList (a
Atomics.notify)而从挂起中唤醒。The abstract operation NotifyWaiter takes arguments waiterList (a
The abstract operation EnqueueResolveInAgentJob takes arguments agentSignifier (an
The abstract operation DoWait takes arguments mode (
additionalTimeout 允许实现根据需要填充超时,例如为了降低功耗或粗化计时器分辨率以缓解定时攻击。此值在不同 DoWait 调用之间可以不同。
The abstract operation EnqueueAtomicsWaitAsyncTimeoutJob takes arguments waiterList (a
The abstract operation AtomicCompareExchangeInSharedBlock takes arguments block (a
The abstract operation AtomicReadModifyWrite takes arguments ta (an ECMAScript language value), index (an ECMAScript language value), value (an ECMAScript language value), and op (a read-modify-write modification function) and returns either a normal completion containing either a Number or a BigInt, or a throw completion. op 接受两个
The abstract operation ByteListBitwiseOp takes arguments op (&, ^, or |), xBytes (a
&,则^,则|。The abstract operation ByteListEqual takes arguments xBytes (a
此函数在被调用时执行以下步骤:
此函数在被调用时执行以下步骤:
&, xBytes, yBytes)。此函数在被调用时执行以下步骤:
此函数在被调用时执行以下步骤:
此函数在被调用时执行以下步骤:
此函数是一种优化原语。直觉是,如果原子原语(compareExchange、load、store、add、sub、and、or、xor 或 exchange)在大小为 n 字节的数据上的原子步骤,会在 surrounding Atomics.isLockFree(n) 将返回
Atomics.isLockFree(4) 总是返回
无论此函数返回的值如何,所有原子操作都保证是原子的。例如,它们绝不会有可见操作发生在该操作中间(例如,“tearing”)。
此函数在被调用时执行以下步骤:
此函数会通知一些正在等待队列中休眠的代理。
调用时,它执行以下步骤:
此函数在调用时执行以下步骤:
|, xBytes, yBytes)。此函数向 CPU 提供一个提示,表明程序正在等待某个值时进行自旋循环。
调用时,它执行以下步骤:
此方法是为实现自旋等待循环的程序设计的,例如互斥锁内部的自旋锁快速路径,用于向 CPU 提供一个提示,表明它正在等待某个值时自旋。除计时外,它没有可观察的行为。
如果底层架构的最佳实践建议在自旋循环中使用 pause 或 yield 指令,则期望实现实现这样的指令。例如,Intel 优化手册建议使用 pause 指令。
鼓励实现对暂停的最长时间设置内部上限,其量级为数十到数百纳秒。
由于函数调用的开销,在优化编译器中对此方法的内联调用等待的时间与非内联调用不同,是合理的。
此函数在调用时执行以下步骤:
此函数在调用时执行以下步骤:
此函数将周围代理放入等待队列并将其挂起,直到收到通知或等待超时为止,返回一个用于区分这些情况的字符串。
调用时,它执行以下步骤:
此函数返回一个 Promise,该 Promise 会在调用代理收到通知或达到超时时解析。
调用时,它执行以下步骤:
此函数在调用时执行以下步骤:
^, xBytes, yBytes)。此属性具有属性特性 { [[Writable]]:
JSON 对象:
parse 和 stringify,用于解析和构造 JSON 文本。new 操作符一起使用。JSON 数据交换格式定义于 ECMA-404。本规范中使用的 JSON 交换格式正是 ECMA-404 所描述的格式。JSON.parse 和 JSON.stringify 的符合实现必须支持 ECMA-404 规范中描述的确切交换格式,不得对该格式进行任何删除或扩展。
此函数在被调用时执行以下步骤:
此函数解析 JSON 文本(JSON 格式的 String)并产生
可选的 reviver 参数是一个可以过滤和转换结果的函数。对于解析产生的每个值,都会以三个实参(关联的
此函数的
The abstract operation ParseJSON takes argument text (a String) and returns either a normal completion containing a
符合实现的 JSON.parse 不允许扩展 JSON 语法。如果实现希望支持修改或扩展的 JSON 交换格式,则必须通过定义不同的解析函数来实现。
有效 JSON 文本是 ECMAScript
不过,由于
在对象中存在重复 name String 的情况下,同一键的词法上在前的值应被覆盖。
JSON Parse Record 是一种
JSON Parse Record 具有
| 字段名 | 值 | 含义 |
|---|---|---|
| [[ParseNode]] | a |
上下文 |
| [[Key]] | a property name | 与 [[Value]] 关联的 |
| [[Value]] | an ECMAScript language value | 由 [[ParseNode]] 求值产生的值。 |
| [[Elements]] | a |
如果 [[Value]] 是 Array,则它 |
| [[Entries]] | a |
如果 [[Value]] 是非 Array Object,则它 |
The abstract operation CreateJSONParseRecord takes arguments parseNode (a
{"a":"lost","a":"kept"})时,所得 ECMAScript 对象对应属性的值由具有该名称的最后一对指定。The abstract operation InternalizeJSONProperty takes arguments holder (an Object), name (a String), reviver (a function object), and parseRecord (a
此算法有意在 [[Delete]] 或
它在被调用时执行以下步骤:
The abstract operation ShallowestContainedJSONValue takes argument root (a
JSON.parse 内置number token 可以表示负值。在 ECMAScript 中,取负表示为一元操作,其中 - 后跟派生的 The syntax-directed operation JSONArrayLiteralContentNodes takes no arguments and returns a
此函数返回一个表示字符串、数字、布尔值或 null 值的原始 JSON 文本的对象。
此函数返回一个以 UTF-16 编码 JSON 格式表示
它在被调用时执行以下步骤:
此函数的
JSON 结构允许嵌套到任意深度,但它们必须是无环的。如果 value 是或
a = [];
a[0] = a;
my_text = JSON.stringify(a); // 这必须抛出 TypeError。
符号性原始值按如下方式渲染:
String 值用 QUOTATION MARK (") 码元包裹。码元 " 和 \ 用 \ 前缀转义。控制字符码元替换为转义序列 \uHHHH,或较短形式 \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]] | a function object or |
可以为对象属性提供替换值的函数(来自 JSON.stringify 的 replacer 参数)。 |
| [[PropertyList]] | either a |
序列化非数组对象时要 |
| [[Gap]] | a String | 缩进单位(来自 JSON.stringify 的 space 参数)。 |
| [[Stack]] | a |
正在序列化过程中的嵌套对象集合。用于检测循环结构。 |
| [[Indent]] | a String | 当前缩进。 |
The abstract operation SerializeJSONProperty takes arguments state (a
The abstract operation QuoteJSONString takes argument value (a String) and returns a String. 它用 0x0022(QUOTATION MARK)码元包裹 value,并转义其中的某些其他码元。此操作将 value 解释为 UTF-16 编码码点的序列,如
| 码点 | 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 codeUnit (a code unit) and returns a String. 它将 codeUnit 表示为 Unicode 转义序列。 It performs the following steps when called:
The abstract operation SerializeJSONObject takes arguments state (a
The abstract operation SerializeJSONArray takes arguments state (a
此属性具有特性 { [[Writable]]: