このページはECMAScript® 2020 Language Specification24 Structured Data章をJavaScriptの学習目的で私的に日本語訳したものであり、直訳と意訳および推測が混在しています。そのため内容については正確ではない可能性があります。正確な情報を知りたい場合は、原文をご覧ください。また一部訳者によるコメントが含まれていることがあります。※このサイトの内容で損害や不利益を受けたとしても当方は一切の責任を負いません。

24.1 ArrayBufferオブジェクト(ArrayBuffer Objects)

24.1.1 ArrayBufferオブジェクトの抽象演算(Abstract Operations For ArrayBuffer Objects)

24.1.1.1 AllocateArrayBuffer ( constructor, byteLength )

引数constructorbyteLengthを使用した抽象操作AllocateArrayBufferは、ArrayBufferオブジェクトを作成します。 次の手順を実行します。

  1. ? OrdinaryCreateFromConstructor(constructor, "%ArrayBuffer.prototype%", « [[ArrayBufferData]], [[ArrayBufferByteLength]], [[ArrayBufferDetachKey]] ») を obj とする
  2. Assert: ! IsNonNegativeInteger(byteLength) は true
  3. ? CreateByteDataBlock(byteLength) を block とする
  4. blockobj.[[ArrayBufferData]] にセットする
  5. byteLengthobj.[[ArrayBufferByteLength]] にセットする
  6. obj を返す

24.1.1.2 IsDetachedBuffer ( arrayBuffer )

引数arrayBufferを使用した抽象操作IsDetachedBuffer は、次の手順を実行します。

  1. Assert: Type(arrayBuffer) は Object型で [[ArrayBufferData]] 内部スロットがある
  2. arrayBuffer.[[ArrayBufferData]] が null なら、 true を返す
  3. false を返す

24.1.1.3 DetachArrayBuffer ( arrayBuffer [ , key ] )

引数arrayBuffer と オプション keyを使用した抽象操作DetachArrayBuffer は、次の手順を実行します。

  1. Assert: Type(arrayBuffer) は Object型で 内部スロット [[ArrayBufferData]]、 [[ArrayBufferByteLength]]、 [[ArrayBufferDetachKey]] がある
  2. Assert: IsSharedArrayBuffer(arrayBuffer) は false
  3. key が 存在しないなら、 undefinedkey にセットする
  4. SameValue(arrayBuffer.[[ArrayBufferDetachKey]], key) が false なら、TypeError例外をスローする
  5. nullarrayBuffer.[[ArrayBufferData]] にセットする
  6. 0 を arrayBuffer.[[ArrayBufferByteLength]] にセットする
  7. NormalCompletion(null) を返す
ArrayBufferインスタンスを切り離すと、バッキングストアとして使用されているデータブロックとインスタンスの関連付けが解除され、バッファーのバイト長が0に設定されます。この仕様で定義されている操作では、DetachArrayBuffer抽象操作は使用されません。 ただし、ECMAScript実装またはホスト環境でそのような操作を定義できます。

24.1.1.4 CloneArrayBuffer ( srcBuffer, srcByteOffset, srcLength, cloneConstructor )

抽象操作CloneArrayBufferは、ArrayBuffer srcBuffer、整数オフセットsrcByteOffset、整数長srcLength、およびコンストラクター関数cloneConstructorの4つの引数を取ります。 srcBufferのsrcByteOffsetから、srcLengthバイトのデータをコピーし新しいArrayBufferを作成します。 この操作は、次の手順を実行します。

  1. Assert: Type(srcBuffer) は Object型で [[ArrayBufferData]] 内部スロットがある
  2. Assert: IsConstructor(cloneConstructor) は true
  3. ? AllocateArrayBuffer(cloneConstructor, srcLength) を targetBuffer とする
  4. IsDetachedBuffer(srcBuffer) が true なら、TypeError例外をスローする
  5. srcBuffer.[[ArrayBufferData]] を srcBlock とする
  6. targetBuffer.[[ArrayBufferData]] を targetBlock とする
  7. CopyDataBlockBytes(targetBlock, 0, srcBlock, srcByteOffset, srcLength) を実行する
  8. targetBuffer を返す

24.1.1.5 IsUnsignedElementType ( type )

抽象演算IsUnsignedElementTypeは、引数のtypeが符号なしのTypedArray要素型であるかどうかを確認します。 この操作は、次の手順を実行します。

  1. typeUint8Uint8CUint16Uint32BigUint64 のどれかなら、 true を返す
  2. false を返す

24.1.1.6 IsUnclampedIntegerElementType ( type )

抽象演算IsUnclampedIntegerElementTypeは、引数typeがUint8C以外の整数TypedArray要素タイプであるかどうかを確認します。 この操作は、次の手順を実行します。

  1. typeInt8Uint8Int16Uint16Int32Uint32 のどれかなら、 true を返す
  2. false を返す

24.1.1.7 IsBigIntElementType ( type )

抽象操作IsBigIntElementTypeは、引数のtypeがBigInt TypedArray要素型であるかどうかを確認します。 この操作は、次の手順を実行します。

  1. typeBigUint64 または BigInt64 なら、 true を返す
  2. false を返す

24.1.1.8 IsNoTearConfiguration ( type, order )

引数typeorderを指定した抽象操作IsNoTearConfigurationは、次の手順を実行します。

  1. ! IsUnclampedIntegerElementType(type) が true なら、 true を返す
  2. ! IsBigIntElementType(type) が trueorderInit または Unordered でないなら、 true を返す
  3. false を返す

24.1.1.9 RawBytesToNumeric ( type, rawBytes, isLittleEndian )

抽象操作RawBytesToNumericは、TypedArray要素タイプtype、リストrawBytes、およびブールisLittleEndianの3つのパラメーターを取ります。 この操作は、次の手順を実行します。

  1. 表61で、typeに対応する要素サイズを elementSize とする
  2. isLittleEndianfalse なら rawBytes の要素の順序を逆にする
  3. typeFloat32 なら、
    1. IEEE 754-2019 binary32値のリトルエンディアンビット文字列エンコーディングとして解釈し連結した rawBytesのバイト要素を value とする
    2. valueIEEE 754-2019 binary32 NaN値 なら、 NaN 数値 を返す
    3. value に対応する数値を返す
  4. typeFloat64 なら、
    1. IEEE 754-2019 binary64値のリトルエンディアンビット文字列エンコーディングとして解釈し連結した rawBytesのバイト要素を value とする
    2. valueIEEE 754-2019 binary64 NaN値 なら、 NaN 数値 を返す
    3. value に対応する数値を返す
  5. ! IsUnsignedElementType(type) が true なら、
    1. 符号なしリトルエンディアン2進数のビット文字列エンコーディングとして解釈し連結したrawBytesのバイト要素を intValue とする
  6. 5. と異なるなら、
    1. ビット長elementSize×8のバイナリリトルエンディアン2の補数のビット文字列エンコーディングとして解釈し連結したrawBytesのバイト要素を intValue とする
  7. ! IsBigIntElementType(type) が true なら、intValue に対応するBigInt値を返す
  8. intValue に対応する 数値 を返す

24.1.1.10 GetValueFromBuffer ( arrayBuffer, byteIndex, type, isTypedArray, order [ , isLittleEndian ] )

抽象演算GetValueFromBufferは、ArrayBufferまたはSharedArrayBuffer arrayBuffer、整数byteIndex、TypedArray要素タイプtype、ブールisTypedArray、(SeqCstUnordered)のいずれかであるorder、およびオプションでブールisLittleEndianの6つのパラメーターを取ります。 この操作は、次の手順を実行します。

  1. Assert: IsDetachedBuffer(arrayBuffer) は false
  2. Assert: typeの値を格納するのに十分なバイトがbyteIndexで始まるarrayBufferにある
  3. Assert: ! IsNonNegativeInteger(byteIndex) は true
  4. arrayBuffer.[[ArrayBufferData]] を block とする
  5. 表61で、typeに対応する要素サイズを elementSize とする
  6. IsSharedArrayBuffer(arrayBuffer) が true なら、
    1. 周囲のエージェントエージェントレコード の [[CandidateExecution]] フィールドを execution とする
    2. [[AgentSignifier]]AgentSignifier() が同値であるexecution.[[EventsRecords]]の要素の[[EventList]]フィールドを eventList とする
    3. isTypedArraytrueIsNoTearConfiguration(type, order) が true なら true を、異なるなら falsenoTear とする
    4. 非決定論的に選択されたバイト値の長さelementSizeのリストを rawValue とする
    5. NOTE: 実装では、rawValueは、基盤となるハードウェアでの非アトミックまたはアトミック読み取り命令の結果です。 非決定性は、一貫性の弱いハードウェアの観察可能な動作を記述するためのメモリモデルのセマンティックです。
    6. ReadSharedMemory { [[Order]]: order, [[NoTear]]: noTear, [[Block]]: block, [[ByteIndex]]: byteIndex, [[ElementSize]]: elementSize } を readEvent とする
    7. eventListreadEvent を追加する
    8. execution.[[ChosenValues]] に Chosen Value Records { [[Event]]: readEvent, [[ChosenValue]]: rawValue } を追加する
  7. 6. と異なるなら、block[byteIndex]で始まるバイトのelementSizeシーケンスを順番に含むelementSizeのリストを rawValue とする
  8. isLittleEndian が 存在しないなら、 周囲のエージェントエージェントレコード の[[LittleEndian]] フィールドの値を isLittleEndian にセットする
  9. RawBytesToNumeric(type, rawValue, isLittleEndian) を返す

24.1.1.11 NumericToRawBytes ( type, value, isLittleEndian )

抽象演算NumericToRawBytesは、TypedArray要素タイプtype、BigIntまたはNumbervalue、およびブールisLittleEndianの3つのパラメーターを取ります。 この操作は、次の手順を実行します。

  1. typeFloat32 なら、
    1. roundTiesToEvenモードを使用してvalueIEEE 754-2019 binary32形式に変換した結果である4バイトを含むリストを rawBytes とする。 isLittleEndianfalseなら、バイトはビッグエンディアンの順序で、 それ以外なら、リトルエンディアンの順序で配置する。 valueNaNなら、rawBytesは、IEEE 754-2019 binary32形式のNot-a-Numberエンコーディングで選択された任意の実装に設定できる。 実装は、実装ごとに識別可能なNaN値に対して常に同じエンコーディングを選択する必要がある
  2. 1. と異なり、 typeFloat64 なら、
    1. valueIEEE 754-2019 binary64形式のエンコーディングである8バイトを含むリストを rawBytes とする。 isLittleEndianfalseなら、バイトはビッグエンディアンの順序で、 それ以外ならバイトはリトルエンディアンの順序で配置される。 valueNaNなら、rawBytesは、IEEE 754-2019 binary64形式のNot-a-Numberエンコーディングで選択された任意の実装に設定できる。 実装は、実装ごとに識別可能なNaN値に対して常に同じエンコーディングを選択する必要がある。
  3. 2. と異なるなら、
    1. 表61で、typeに対応する要素サイズを n とする
    2. 表61で、typeに対応する変換操作の抽象操作を convOp とする
    3. 結果がBigIntであるか数値であるかに関係なく、数学的数値として扱われるconvOp(value) を intValueとする
    4. intValue ≧ 0 なら、
      1. intValuenバイトのバイナリエンコーディングを含むリストをrawBytesとする。 isLittleEndianfalseなら、バイトはビッグエンディアンの順序で、 それ以外なら、バイトはリトルエンディアンの順序で並べる
    5. d. と異なるなら、
      1. intValuenバイトのバイナリ2の補数エンコーディングを含むリストをrawBytesとする。 isLittleEndianfalseなら、バイトはビッグエンディアンの順序で、 それ以外なら、バイトはリトルエンディアンの順序で並べる
  4. rawBytes を返す

24.1.1.12 SetValueInBuffer ( arrayBuffer, byteIndex, type, value, isTypedArray, order [ , isLittleEndian ] )

抽象演算SetValueInBufferは、7つの引数、ArrayBufferまたはSharedArrayBuffer arrayBuffer、整数byteIndex、TypedArray要素タイプtype、NumberまたはBigInt value、ブールisTypedArray、(SeqCstUnorderedInit)のいずれかであるorder、およびオプション ブールisLittleEndian をとります。 この操作は、次の手順を実行します。

  1. Assert: IsDetachedBuffer(arrayBuffer) は false
  2. Assert: typeの値を格納するのに十分なバイトがbyteIndexで始まるarrayBufferにある
  3. Assert: ! IsNonNegativeInteger(byteIndex) は true
  4. Assert: ! IsBigIntElementType(type) が true なら、Type(value) は BigInt型 。 異なるなら Type(value) は Number型
  5. arrayBuffer.[[ArrayBufferData]] を block とする
  6. 表61で、typeに対応する要素サイズを elementSize とする
  7. isLittleEndian が 存在しないなら、 周囲のエージェントエージェントレコード の [[LittleEndian]] フィールド の値を isLittleEndian にセットする
  8. NumericToRawBytes(type, value, isLittleEndian) を rawBytes とする
  9. IsSharedArrayBuffer(arrayBuffer) が true なら、
    1. 周囲のエージェントエージェントレコード の [[CandidateExecution]] フィールドを execution とする
    2. [[AgentSignifier]]AgentSignifier() が同値である execution.[[EventsRecords]] の要素の [[EventList]] フィールドを eventList とする
    3. isTypedArraytrueIsNoTearConfiguration(type, order) が true なら、 true を、異なるなら falsenoTear とする
    4. eventListWriteSharedMemory { [[Order]]: order, [[NoTear]]: noTear, [[Block]]: block, [[ByteIndex]]: byteIndex, [[ElementSize]]: elementSize, [[Payload]]: rawBytes } を追加する
  10. 9. と異なるなら、 rawBytesの個々のバイトをblock [byteIndex]から順番にblockに格納します。
  11. NormalCompletion(undefined) を返す

24.1.1.13 GetModifySetValueInBuffer ( arrayBuffer, byteIndex, type, value, op [ , isLittleEndian ] )

抽象演算GetModifySetValueInBufferは、SharedArrayBuffer arrayBuffer、非負の整数byteIndex、TypedArray要素タイプtype、NumberまたはBigIntvalue、セマンティック関数op、およびオプション ブールisLittleEndianの6つのパラメーターを取ります。 この操作は、次の手順を実行します。

  1. Assert: IsSharedArrayBuffer(arrayBuffer) は true
  2. Assert: typeの値を格納するのに十分なバイトがbyteIndexで始まるarrayBufferにある
  3. Assert: ! IsNonNegativeInteger(byteIndex) は true
  4. Assert: ! IsBigIntElementType(type) が true なら Type(value) は BigInt型。 異なるなら Type(value) は Number型
  5. arrayBuffer.[[ArrayBufferData]] を block とする
  6. 表61で、typeに対応する要素サイズを elementSize とする
  7. isLittleEndian が 存在しないなら、 周囲のエージェントエージェントレコード の [[LittleEndian]] フィールドを isLittleEndian にセットする
  8. NumericToRawBytes(type, value, isLittleEndian) を rawBytes とする
  9. 周囲のエージェントエージェントレコード の [[CandidateExecution]] フィールドを execution とする
  10. [[AgentSignifier]]AgentSignifier() が同値である execution.[[EventsRecords]] の要素の [[EventList]] フィールドを eventList とする
  11. 非決定論的に選択されたバイト値の長さelementSizeのリストを rawBytesRead とする
  12. NOTE: 実装では、rawBytesReadは、ロードリンク、ロード排他、または基盤となるハードウェアの読み取り-変更-書き込み命令のオペランドの結果です。 非決定性は、一貫性の弱いハードウェアの観察可能な動作を記述するためのメモリモデルのセマンティックです。
  13. ReadModifyWriteSharedMemory { [[Order]]: SeqCst, [[NoTear]]: true, [[Block]]: block, [[ByteIndex]]: byteIndex, [[ElementSize]]: elementSize, [[Payload]]: rawBytes, [[ModifyOp]]: op } を rmwEvent とする
  14. eventListrmwEvent を追加する
  15. executionChosen Value Record { [[Event]]: rmwEvent, [[ChosenValue]]: rawBytesRead } を追加する[[ChosenValues]]
  16. RawBytesToNumeric(type, rawBytesRead, isLittleEndian) を返す

24.1.2 ArrayBufferコンストラクター(The ArrayBuffer Constructor)

ArrayBufferコンストラクターは、次の特徴があります。

  • 組み込みオブジェクト%ArrayBuffer%です。
  • グローバルオブジェクト"ArrayBuffer"プロパティの初期値です。
  • コンストラクターとして呼び出されると、新しいArrayBufferオブジェクトを作成して初期化します。
  • 関数として呼び出されると例外がスローされます。
  • サブクラス化できるように設計されています。 クラス定義のextends句の値として使用できます。 サブクラスコンストラクターは、ArrayBuffer.prototype組み込みメソッドをサポートし、サブクラスインスタンスを作成および初期化するためにsuperコールを含める必要があります。

24.1.2.1 ArrayBuffer ( length )

ArrayBuffer 関数が引数 length で呼び出されると、次の手順が実行されます。

  1. NewTargetundefined なら、TypeError例外をスローする
  2. ? ToIndex(length) を byteLength とする
  3. ? AllocateArrayBuffer(NewTarget, byteLength) を返す

24.1.3 ArrayBufferコンストラクターのプロパティ(Properties of the ArrayBuffer Constructor)

ArrayBufferコンストラクターは、次の特徴があります。

  • [[Prototype]]内部スロットがあり、値は%Function.prototype%です。
  • 以下のプロパティがあります。

24.1.3.1 ArrayBuffer.isView ( arg )

isView関数は1つの引数argを取り、次の手順を実行します。

  1. Type(arg) が Object型 でないなら、 false を返す
  2. arg が[[ViewedArrayBuffer]] 内部スロットを持っているなら true を返す
  3. false を返す

24.1.3.2 ArrayBuffer.prototype

ArrayBuffer.prototypeの初期値は%ArrayBuffer.prototype%です。

このプロパティの属性は{ [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }です。

24.1.3.3 get ArrayBuffer [ @@species ]

ArrayBuffer[@@species]はsetアクセス関数がundefinedアクセサプロパティ です。 getアクセス関数は、次の手順を実行します。

  1. this値 を返す

この関数の"name"プロパティの値は"get [Symbol.species]"です。

ArrayBufferプロトタイプメソッドは通常、thisオブジェクトのコンストラクターを使用して派生オブジェクトを作成します。 ただし、サブクラスコンストラクターは、@@speciesプロパティを再定義することでそのデフォルトの動作をオーバーライドできます。

24.1.4 ArrayBufferプロトタイプオブジェクトのプロパティ(Properties of the ArrayBuffer Prototype Object)

ArrayBufferプロトタイプオブジェクトは、次の特徴があります。

  • 組み込みオブジェクト%ArrayBufferPrototype%です。
  • [[Prototype]]内部スロットがあり、値は%Object.prototype%です。
  • 通常のオブジェクトです。
  • 内部スロット[[ArrayBufferData]]または[[ArrayBufferByteLength]]がありません。

24.1.4.1 get ArrayBuffer.prototype.byteLength

ArrayBuffer.prototype.byteLengthはsetアクセス関数がundefinedアクセサプロパティ です。 getアクセス関数は、次の手順を実行します。

  1. this値 を O とする
  2. ? RequireInternalSlot(O, [[ArrayBufferData]]) を実行する
  3. IsSharedArrayBuffer(O) が true なら、TypeError例外をスローする
  4. IsDetachedBuffer(O) が true なら、TypeError例外をスローする
  5. O.[[ArrayBufferByteLength]] を length とする
  6. length を返す

24.1.4.2 ArrayBuffer.prototype.constructor

ArrayBuffer.prototype.constructorの初期値は%ArrayBuffer%です。

24.1.4.3 ArrayBuffer.prototype.slice ( start, end )

次の手順が実行されます。

  1. this値 を O とする
  2. ? RequireInternalSlot(O, [[ArrayBufferData]]) を実行する
  3. IsSharedArrayBuffer(O) が true なら、TypeError例外をスローする
  4. IsDetachedBuffer(O) が true なら、TypeError例外をスローする
  5. O.[[ArrayBufferByteLength]] を len とする
  6. ? ToInteger(start) を relativeStart とする
  7. IrelativeStart < 0 なら max((len + relativeStart), 0) を、異なるなら min(relativeStart, len) を first とする
  8. endundefined なら、 len を、異なるなら ? ToInteger(end) を relativeEnd とする
  9. relativeEnd < 0 なら max((len + relativeEnd), 0) を、異なるなら min(relativeEnd, len) を final とする
  10. max(final - first, 0) を newLen とする
  11. ? SpeciesConstructor(O, %ArrayBuffer%) を ctor とする
  12. ? Construct(ctor, « newLen ») を new とする
  13. ? RequireInternalSlot(new, [[ArrayBufferData]]) を実行する
  14. IsSharedArrayBuffer(new) が true なら、TypeError例外をスローする
  15. IsDetachedBuffer(new) が true なら、TypeError例外をスローする
  16. SameValue(new, O) が true なら、TypeError例外をスローする
  17. new.[[ArrayBufferByteLength]] < newLen なら TypeError例外をスローする
  18. NOTE: 上記の手順の副作用により、Oが切り離された可能性がある
  19. IsDetachedBuffer(O) が true なら、TypeError例外をスローする
  20. O.[[ArrayBufferData]] を fromBuf とする
  21. new.[[ArrayBufferData]] を toBuf とする
  22. CopyDataBlockBytes(toBuf, 0, fromBuf, first, newLen) を実行する
  23. new を返す

24.1.4.4 ArrayBuffer.prototype [ @@toStringTag ]

@@toStringTagプロパティの初期値は、文字列値"ArrayBuffer"です。

このプロパティの属性は{ [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }です。

24.1.5 ArrayBufferインスタンスのプロパティ(Properties of ArrayBuffer Instances)

ArrayBufferインスタンスは、ArrayBufferプロトタイプオブジェクトからプロパティを継承します。 ArrayBufferインスタンスには、それぞれ[[ArrayBufferData]]内部スロット、[[ArrayBufferByteLength]]内部スロット、および[[ArrayBufferDetachKey]]内部スロットがあります。

[[ArrayBufferData]]がnullのArrayBufferインスタンスは切り離されていると見なされます。このときArrayBufferインスタンスに含まれるデータにアクセスまたは変更するすべての演算子は失敗します。

[[ArrayBufferDetachKey]]がundefined以外の値に設定されているArrayBufferインスタンスでは、すべてのDetachArrayBuffer呼び出しで、同じ「デタッチキー」を引数として渡す必要があります。そうしないと、TypeErrorが発生します。 この内部スロットは、この仕様のアルゴリズムではなく、特定の埋め込み環境によってのみ設定されます。

24.2 SharedArrayBufferオブジェクト(SharedArrayBuffer Objects)

24.2.1 SharedArrayBufferオブジェクトの抽象演算(Abstract Operations for SharedArrayBuffer Objects)

24.2.1.1 AllocateSharedArrayBuffer ( constructor, byteLength )

引数constructorbyteLengthを使用した抽象操作AllocateSharedArrayBufferは、をSharedArrayBufferオブジェクトを作成します。 次の手順を実行します。

  1. ? OrdinaryCreateFromConstructor(constructor, "%SharedArrayBuffer.prototype%", « [[ArrayBufferData]], [[ArrayBufferByteLength]] ») を obj とする
  2. Assert: ! IsNonNegativeInteger(byteLength) は true
  3. ? CreateSharedByteDataBlock(byteLength) を block とする
  4. blockobj.[[ArrayBufferData]] にセットする
  5. byteLengthobj.[[ArrayBufferByteLength]] にセットする
  6. obj を返す

24.2.1.2 IsSharedArrayBuffer ( obj )

IsSharedArrayBufferは、オブジェクトがArrayBuffer、SharedArrayBuffer、またはいずれかのサブタイプであるかどうかをテストします。 次の手順を実行します。

  1. Assert: Type(obj) は Object型で [[ArrayBufferData]] 内部スロットがある
  2. obj.[[ArrayBufferData]] を bufferData とする
  3. bufferDatanull なら、 false を返す
  4. bufferDataデータブロック なら、 false を返す
  5. Assert: bufferData共有データブロック
  6. true を返す

24.2.2 SharedArrayBufferコンストラクター(The SharedArrayBuffer Constructor)

SharedArrayBufferコンストラクターは、次の特徴があります。

  • 組み込みオブジェクト%SharedArrayBuffer%です。
  • グローバルオブジェクト"SharedArrayBuffer"プロパティの初期値です。
  • コンストラクターとして呼び出されると、新しいSharedArrayBufferオブジェクトを作成して初期化します。
  • 関数として呼び出されると例外がスローされます。
  • サブクラス化できるように設計されています。 クラス定義のextends句の値として使用できます。 サブクラスコンストラクターには、SharedArrayBuffer.prototype組み込みメソッドをサポートし、サブクラスインスタンスを作成および初期化するためにsuperコールを含める必要があります。
ArrayBufferとは異なり、SharedArrayBufferは切り離せません。SharedArrayBufferの内部[[ArrayBufferData]]スロットはnullになることはありません。

24.2.2.1 SharedArrayBuffer ( [ length ] )

SharedArrayBuffer関数がオプションの引数lengthで呼び出されると、次の手順が実行されます。

  1. NewTargetundefined なら、TypeError例外をスローする
  2. ? ToIndex(length) を byteLength とする
  3. ? AllocateSharedArrayBuffer(NewTarget, byteLength) を返す

24.2.3 SharedArrayBufferコンストラクターのプロパティ(Properties of the SharedArrayBuffer Constructor)

SharedArrayBufferコンストラクターは、次の特徴があります。

  • [[Prototype]]内部スロットがあり、値は%Function.prototype%です。
  • 以下のプロパティがあります。

24.2.3.1 SharedArrayBuffer.prototype

SharedArrayBuffer.prototypeの初期値は%SharedArrayBuffer.prototype%です。

このプロパティの属性は { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }です。

24.2.3.2 get SharedArrayBuffer [ @@species ]

SharedArrayBuffer[@@species]はsetアクセス関数がundefinedアクセサプロパティ です。 getアクセス関数は、次の手順を実行します。

  1. this値 を返す

この関数の"name"プロパティの値は"get [Symbol.species]"です。

24.2.4 SharedArrayBufferプロトタイプオブジェクトのプロパティ(Properties of the SharedArrayBuffer Prototype Object)

SharedArrayBufferプロトタイプオブジェクトは、次の特徴があります。

  • 組み込みオブジェクト%SharedArrayBufferPrototype%です。
  • [[Prototype]]内部スロットがあり、値が%Object.prototype%です。
  • 通常のオブジェクトです。
  • [[ArrayBufferData]]または[[ArrayBufferByteLength]]内部スロットがありません。

24.2.4.1 get SharedArrayBuffer.prototype.byteLength

SharedArrayBuffer.prototype.byteLengthはsetアクセス関数がundefinedアクセサプロパティ です。 getアクセス関数は、次の手順を実行します。

  1. this値 を O とする
  2. ? RequireInternalSlot(O, [[ArrayBufferData]]) を実行する
  3. IsSharedArrayBuffer(O) が false なら、TypeError例外をスローする
  4. O.[[ArrayBufferByteLength]] を length とする
  5. length を返す

24.2.4.2 SharedArrayBuffer.prototype.constructor

SharedArrayBuffer.prototype.constructorの初期値は%SharedArrayBuffer%です。

24.2.4.3 SharedArrayBuffer.prototype.slice ( start, end )

次の手順が実行されます。

  1. this値 を O とする
  2. ? RequireInternalSlot(O, [[ArrayBufferData]]) を実行する
  3. IsSharedArrayBuffer(O) が false なら、TypeError例外をスローする
  4. O.[[ArrayBufferByteLength]] を len とする
  5. ? ToInteger(start) を relativeStart とする
  6. relativeStart < 0 なら max((len + relativeStart), 0) を、異なるなら min(relativeStart, len) を first とする
  7. endundefined なら、 len を、異なるなら ? ToInteger(end) を relativeEnd とする
  8. relativeEnd < 0 なら max((len + relativeEnd), 0) を、異なるなら min(relativeEnd, len) を final とする
  9. max(final - first, 0) を newLen とする
  10. ? SpeciesConstructor(O, %SharedArrayBuffer%) を ctor とする
  11. ? Construct(ctor, « newLen ») を new とする
  12. ? RequireInternalSlot(new, [[ArrayBufferData]]) を実行する
  13. IsSharedArrayBuffer(new) が false なら、TypeError例外をスローする
  14. new.[[ArrayBufferData]] と O.[[ArrayBufferData]] が同じ 共有データブロック 値なら TypeError例外をスローする
  15. new.[[ArrayBufferByteLength]] < newLen なら TypeError例外をスローする
  16. O.[[ArrayBufferData]] を fromBuf とする
  17. new.[[ArrayBufferData]] を toBuf とする
  18. CopyDataBlockBytes(toBuf, 0, fromBuf, first, newLen) を実行する
  19. new を返す

24.2.4.4 SharedArrayBuffer.prototype [ @@toStringTag ]

@@toStringTagプロパティの初期値は、文字列値"SharedArrayBuffer"です。

このプロパティの属性は { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }です。

24.2.5 SharedArrayBufferインスタンスのプロパティ(Properties of SharedArrayBuffer Instances)

SharedArrayBufferインスタンスは、SharedArrayBufferプロトタイプオブジェクトからプロパティを継承します。 SharedArrayBufferインスタンスには、それぞれ[[ArrayBufferData]]内部スロットと[[ArrayBufferByteLength]]内部スロットがあります。

SharedArrayBufferインスタンスは、ArrayBufferインスタンスとは異なり、切り離されることはありません。

24.3 DataViewオブジェクト(DataView Objects)

24.3.1 DataViewオブジェクトの抽象操作(Abstract Operations For DataView Objects)

24.3.1.1 GetViewValue ( view, requestIndex, isLittleEndian, type )

引数viewrequestIndexisLittleEndian、およびtypeを指定した抽象操作GetViewValueは、ビューバッファーから値を取得するためにDataViewインスタンスの関数によって使用されます。 次の手順を実行します。

す。

  1. ? RequireInternalSlot(view, [[DataView]]) を実行する
  2. Assert: view は [[ViewedArrayBuffer]] 内部スロットがある
  3. ? ToIndex(requestIndex) を getIndex とする
  4. ! ToBoolean(isLittleEndian) を isLittleEndian にセットする
  5. view.[[ViewedArrayBuffer]] を buffer とする
  6. IsDetachedBuffer(buffer) が true なら、TypeError例外をスローする
  7. view.[[ByteOffset]] を viewOffset とする
  8. view.[[ByteLength]] を viewSize とする
  9. 表61で、typeに対応する要素サイズを elementSize とする
  10. getIndex + elementSizeviewSize なら RangeError例外をスローする
  11. getIndex + viewOffsetbufferIndex とする
  12. GetValueFromBuffer(buffer, bufferIndex, type, false, Unordered, isLittleEndian) を返す

24.3.1.2 SetViewValue ( view, requestIndex, isLittleEndian, type, value )

引数viewrequestIndexisLittleEndiantype、およびvalueを持つ抽象操作SetViewValueは、値をビューバッファーに格納するためにDataViewインスタンスの関数によって使用されます。 次の手順を実行します。

  1. ? RequireInternalSlot(view, [[DataView]]) を実行する
  2. Assert: view は [[ViewedArrayBuffer]] 内部スロットがある
  3. ? ToIndex(requestIndex) を getIndex とする
  4. ! IsBigIntElementType(type) が true なら、 ? ToBigInt(value) を numberValue とする
  5. 上と異なるなら ? ToNumber(value) を numberValue とする
  6. ! ToBoolean(isLittleEndian) を isLittleEndian にセットする
  7. view.[[ViewedArrayBuffer]] を buffer とする
  8. IsDetachedBuffer(buffer) が true なら、TypeError例外をスローする
  9. view.[[ByteOffset]] を viewOffset とする
  10. view.[[ByteLength]] を viewSize とする
  11. 表61で、typeに対応する要素サイズを elementSize とする
  12. getIndex + elementSizeviewSize なら RangeError例外をスローする
  13. getIndex + viewOffsetbufferIndex とする
  14. SetValueInBuffer(buffer, bufferIndex, type, numberValue, false, Unordered, isLittleEndian) を返す

24.3.2 DataViewコンストラクター(The DataView Constructor)

DataViewコンストラクターは、次の特徴があります。

  • 組み込みオブジェクト%DataView%です。
  • グローバルオブジェクト"DataView"プロパティの初期値です。
  • コンストラクターとして呼び出されると、新しいDataViewオブジェクトを作成して初期化します。
  • 関数として呼び出されると例外がスローされます。
  • サブクラス化できるように設計されています。 クラス定義のextends句の値として使用できます。 サブクラスコンストラクターは、DataView.prototype組み込みメソッドをサポートし、サブクラスインスタンスを作成および初期化するためにsuperコールを含める必要があります。

24.3.2.1 DataView ( buffer [ , byteOffset [ , byteLength ] ] )

DataView関数が1つ以上の引数バッファーを使用して呼び出されると、以下のステップが実行されます。

  1. NewTargetundefined なら、TypeError例外をスローする
  2. ? RequireInternalSlot(buffer, [[ArrayBufferData]]) を実行する
  3. ? ToIndex(byteOffset) を offset とする
  4. IsDetachedBuffer(buffer) が true なら、TypeError例外をスローする
  5. buffer.[[ArrayBufferByteLength]] を bufferByteLength とする
  6. offsetbufferByteLength なら RangeError例外をスローする
  7. byteLengthundefined なら、
    1. bufferByteLength - offsetviewByteLength とする
  8. 7. と異なるなら、
    1. ? ToIndex(byteLength) を viewByteLength とする
    2. Ioffset + viewByteLengthbufferByteLength なら RangeError例外をスローする
  9. ? OrdinaryCreateFromConstructor(NewTarget, "%DataView.prototype%", « [[DataView]], [[ViewedArrayBuffer]], [[ByteLength]], [[ByteOffset]] ») を O とする
  10. IsDetachedBuffer(buffer) が true なら、TypeError例外をスローする
  11. bufferO.[[ViewedArrayBuffer]] にセットする
  12. viewByteLengthO.[[ByteLength]] にセットする
  13. offsetO.[[ByteOffset]] にセットする
  14. O を返す

24.3.3 DataViewコンストラクターのプロパティ(Properties of the DataView Constructor)

DataViewコンストラクターは、次の特徴があります。

  • [[Prototype]]内部スロットがあり、値は%Function.prototype%です。
  • 以下のプロパティがあります。

24.3.3.1 DataView.prototype

DataView.prototypeの初期値は%DataView.prototype%です。

このプロパティの属性は { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }です。

24.3.4 DataViewプロトタイプオブジェクトのプロパティ(Properties of the DataView Prototype Object)

DataViewプロトタイプオブジェクトは、次の特徴があります。

  • 組み込みオブジェクト%DataViewPrototype%です。
  • [[Prototype]]内部スロットがあり、値は%Object.prototype%です。
  • 通常のオブジェクトです。
  • [[DataView]]、[[ViewedArrayBuffer]]、[[ByteLength]]、または[[ByteOffset]]の内部スロットがありません。

24.3.4.1 get DataView.prototype.buffer

DataView.prototype.bufferはsetアクセス関数がundefinedアクセサプロパティ です。 getアクセス関数は、次の手順を実行します。

  1. this値 を O とする
  2. ? RequireInternalSlot(O, [[DataView]]) を実行する
  3. Assert: O は [[ViewedArrayBuffer]] 内部スロットがある
  4. O.[[ViewedArrayBuffer]] を buffer とする
  5. buffer を返す

24.3.4.2 get DataView.prototype.byteLength

DataView.prototype.byteLengthはsetアクセス関数がundefinedアクセサプロパティ です。 getアクセス関数は、次の手順を実行します。

  1. this値 を O とする
  2. ? RequireInternalSlot(O, [[DataView]]) を実行する
  3. Assert: O は [[ViewedArrayBuffer]] 内部スロットがある
  4. O.[[ViewedArrayBuffer]] を buffer とする
  5. IsDetachedBuffer(buffer) が true なら、TypeError例外をスローする
  6. O.[[ByteLength]] を size とする
  7. size を返す

24.3.4.3 get DataView.prototype.byteOffset

DataView.prototype.byteOffsetはsetアクセス関数がundefinedアクセサプロパティ です。 getアクセス関数は、次の手順を実行します。

  1. this値 を O とする
  2. ? RequireInternalSlot(O, [[DataView]]) を実行する
  3. Assert: O は [[ViewedArrayBuffer]] 内部スロットがある
  4. O.[[ViewedArrayBuffer]] を buffer とする
  5. IsDetachedBuffer(buffer) が true なら、TypeError例外をスローする
  6. O.[[ByteOffset]] を offset とする
  7. offset を返す

24.3.4.4 DataView.prototype.constructor

DataView.prototype.constructorの初期値は%DataView%です。

24.3.4.5 DataView.prototype.getBigInt64 ( byteOffset [ , littleEndian ] )

getBigInt64 が引数 byteOffset と optional argument littleEndian で呼び出されると、次の手順が実行されます。

  1. this値 を v とする
  2. littleEndian が 存在しないなら、 undefinedlittleEndian にセットする
  3. ? GetViewValue(v, byteOffset, littleEndian, BigInt64) を返す

24.3.4.6 DataView.prototype.getBigUint64 ( byteOffset [ , littleEndian ] )

the getBigUint64 method が引数 byteOffset と optional argument littleEndian で呼び出されると、次の手順が実行されます。

  1. this値 を v とする
  2. littleEndian が 存在しないなら、 undefinedlittleEndian にセットする
  3. ? GetViewValue(v, byteOffset, littleEndian, BigUint64) を返す

24.3.4.7 DataView.prototype.getFloat32 ( byteOffset [ , littleEndian ] )

getFloat32 が引数 byteOffset と オプション littleEndian で呼び出されると、次の手順が実行されます。

  1. this値 を v とする
  2. littleEndian が 存在しないなら、 falselittleEndian にセットする
  3. ? GetViewValue(v, byteOffset, littleEndian, Float32) を返す

24.3.4.8 DataView.prototype.getFloat64 ( byteOffset [ , littleEndian ] )

getFloat64 が引数 byteOffset と オプション littleEndian で呼び出されると、次の手順が実行されます。

  1. this値 を v とする
  2. littleEndian が 存在しないなら、 falselittleEndian にセットする
  3. ? GetViewValue(v, byteOffset, littleEndian, Float64) を返す

24.3.4.9 DataView.prototype.getInt8 ( byteOffset )

getInt8 が引数 byteOffset で呼び出されると、次の手順が実行されます。

  1. this値 を v とする
  2. ? GetViewValue(v, byteOffset, true, Int8) を返す

24.3.4.10 DataView.prototype.getInt16 ( byteOffset [ , littleEndian ] )

getInt16 が引数 byteOffset と オプション littleEndian で呼び出されると、次の手順が実行されます。

  1. this値 を v とする
  2. littleEndian が 存在しないなら、 falselittleEndian にセットする
  3. ? GetViewValue(v, byteOffset, littleEndian, Int16) を返す

24.3.4.11 DataView.prototype.getInt32 ( byteOffset [ , littleEndian ] )

getInt32 が引数 byteOffset と オプション littleEndian で呼び出されると、次の手順が実行されます。

  1. this値 を v とする
  2. littleEndian が 存在しないなら、 falselittleEndian にセットする
  3. ? GetViewValue(v, byteOffset, littleEndian, Int32) を返す

24.3.4.12 DataView.prototype.getUint8 ( byteOffset )

getUint8 が引数 byteOffset で呼び出されると、次の手順が実行されます。

  1. this値 を v とする
  2. ? GetViewValue(v, byteOffset, true, Uint8) を返す

24.3.4.13 DataView.prototype.getUint16 ( byteOffset [ , littleEndian ] )

getUint16 が引数 byteOffset とオプション littleEndian で呼び出されると、次の手順が実行されます。

  1. this値 を v とする
  2. littleEndian が 存在しないなら、 falselittleEndian にセットする
  3. ? GetViewValue(v, byteOffset, littleEndian, Uint16) を返す

24.3.4.14 DataView.prototype.getUint32 ( byteOffset [ , littleEndian ] )

getUint32 が引数 byteOffset とオプション littleEndian で呼び出されると、次の手順が実行されます。

  1. this値 を v とする
  2. littleEndian が 存在しないなら、 falselittleEndian にセットする
  3. ? GetViewValue(v, byteOffset, littleEndian, Uint32) を返す

24.3.4.15 DataView.prototype.setBigInt64 ( byteOffset, value [ , littleEndian ] )

setBigInt64メソッドが引数byteOffsetvalueおよびオプションの引数littleEndianを使用して呼び出されると、次の手順が実行されます。

  1. this値 を v とする
  2. littleEndian が 存在しないなら、 undefinedlittleEndian にセットする
  3. ? SetViewValue(v, byteOffset, littleEndian, BigInt64, value) を返す

24.3.4.16 DataView.prototype.setBigUint64 ( byteOffset, value [ , littleEndian ] )

setBigUint64メソッドが引数byteOffsetvalue、およびオプションの引数littleEndianを使用して呼び出されると、次の手順が実行されます。

  1. this値 を v とする
  2. littleEndian が 存在しないなら、 undefinedlittleEndian にセットする
  3. ? SetViewValue(v, byteOffset, littleEndian, BigUint64, value) を返す

24.3.4.17 DataView.prototype.setFloat32 ( byteOffset, value [ , littleEndian ] )

setFloat32メソッドが引数byteOffsetvalue、およびオプションの引数littleEndianを使用して呼び出されると、次の手順が実行されます。

  1. this値 を v とする
  2. littleEndian が 存在しないなら、 falselittleEndian にセットする
  3. ? SetViewValue(v, byteOffset, littleEndian, Float32, value) を返す

24.3.4.18 DataView.prototype.setFloat64 ( byteOffset, value [ , littleEndian ] )

setFloat64メソッドが引数byteOffsetvalue、およびオプションの引数littleEndianを使用して呼び出されると、次の手順が実行されます。

  1. this値 を v とする
  2. littleEndian が 存在しないなら、 falselittleEndian にセットする
  3. ? SetViewValue(v, byteOffset, littleEndian, Float64, value) を返す

24.3.4.19 DataView.prototype.setInt8 ( byteOffset, value )

setInt8メソッドが引数byteOffsetおよびvalueを指定して呼び出されると、次の手順が実行されます。

  1. this値 を v とする
  2. ? SetViewValue(v, byteOffset, true, Int8, value) を返す

24.3.4.20 DataView.prototype.setInt16 ( byteOffset, value [ , littleEndian ] )

setInt16メソッドが引数byteOffsetvalueおよびオプションの引数littleEndianを使用して呼び出されると、次の手順が実行されます。

  1. this値 を v とする
  2. littleEndian が 存在しないなら、 falselittleEndian にセットする
  3. ? SetViewValue(v, byteOffset, littleEndian, Int16, value) を返す

24.3.4.21 DataView.prototype.setInt32 ( byteOffset, value [ , littleEndian ] )

setInt32メソッドが引数byteOffsetvalueおよびオプションの引数littleEndianを使用して呼び出されると、次の手順が実行されます。

  1. this値 を v とする
  2. littleEndian が 存在しないなら、 falselittleEndian にセットする
  3. ? SetViewValue(v, byteOffset, littleEndian, Int32, value) を返す

24.3.4.22 DataView.prototype.setUint8 ( byteOffset, value )

setUint8メソッドが引数byteOffsetおよびvalueを指定して呼び出されると、次の手順が実行されます。

  1. this値 を v とする
  2. ? SetViewValue(v, byteOffset, true, Uint8, value) を返す

24.3.4.23 DataView.prototype.setUint16 ( byteOffset, value [ , littleEndian ] )

setUint16メソッドが引数byteOffsetvalueおよびオプションの引数littleEndianを使用して呼び出されると、次の手順が実行されます。

  1. this値 を v とする
  2. littleEndian が 存在しないなら、 falselittleEndian にセットする
  3. ? SetViewValue(v, byteOffset, littleEndian, Uint16, value) を返す

24.3.4.24 DataView.prototype.setUint32 ( byteOffset, value [ , littleEndian ] )

setUint32メソッドが引数byteOffsetvalueおよびオプションの引数littleEndianを使用して呼び出されると、次の手順が実行されます。

  1. this値 を v とする
  2. littleEndian が 存在しないなら、 falselittleEndian にセットする
  3. ? SetViewValue(v, byteOffset, littleEndian, Uint32, value) を返す

24.3.4.25 DataView.prototype [ @@toStringTag ]

@@toStringTagプロパティの初期値は、文字列値"DataView"です。

このプロパティの属性は { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }です。

24.3.5 DataViewインスタンスのプロパティ(Properties of DataView Instances)

DataViewインスタンスは、DataViewプロトタイプオブジェクトからプロパティを継承する通常のオブジェクトです。 DataViewインスタンスには、それぞれ[[DataView]]、[[ViewedArrayBuffer]]、[[ByteLength]]、および[[ByteOffset]]の内部スロットがあります。

[[DataView]]内部スロットの値は、この仕様では使用されていません。 この内部スロットは、オブジェクトがDataViewコンストラクターを使用して作成されたかどうかを識別するために使用されます。

24.4 Atomicsオブジェクト(The Atomics Object)

Atomicsオブジェクトは、次の特徴があります。

  • 組み込みオブジェクト%Atomics%です。
  • グローバルオブジェクトの"Atomics"プロパティの初期値です。
  • 普通の物です。
  • [[Prototype]]内部スロットがあり、値は%Object.prototype%です。
  • [[Construct]]内部メソッドはありません。 new演算子のコンストラクターとして使用することはできません。
  • [[Call]]内部メソッドはありません。 関数として呼び出すことはできません。

Atomicsオブジェクトは、共有メモリ配列セル上で分割不可能に(原子的に)動作する関数と、エージェントがプリミティブイベントを待機してディスパッチできるようにする関数を提供します。 Atomics関数を規律とともに使用すると、共有メモリを介して通信するマルチエージェントプログラムを、並列CPUでも十分に理解した順序で実行できます。 共有メモリ通信の管理ルールは、以下に定義されているメモリモデルによって提供されます。

ECMAScriptで共有メモリをプログラミングおよび実装するための有益なガイドラインについては、メモリモデル章の最後にある注記を参照してください。

24.4.1 Atomicsの抽象演算(Abstract Operations for Atomics)

24.4.1.1 ValidateSharedIntegerTypedArray ( typedArray [ , waitable ] )

抽象操作ValidateSharedIntegerTypedArrayは、1つの引数typedArrayとオプションのブール waitableを取ります。 次の手順を実行します。

  1. waitable が 存在しないなら、 falsewaitable にセットする
  2. ? RequireInternalSlot(typedArray, [[TypedArrayName]]) を実行する
  3. typedArray.[[TypedArrayName]] を typeName とする
  4. 表61で、 typeNameに対応する要素タイプを type とする
  5. waitabletrue なら、
    1. typeName"Int32Array" または "BigInt64Array" でないなら、TypeError例外をスローする
  6. 5. と異なるなら、
    1. ! IsUnclampedIntegerElementType(type) が false! IsBigIntElementType(type) が false なら、TypeError例外をスローする
  7. Assert: typedArray は [[ViewedArrayBuffer]] 内部スロットがある
  8. typedArray.[[ViewedArrayBuffer]] を buffer とする
  9. IsSharedArrayBuffer(buffer) が false なら、TypeError例外をスローする
  10. buffer を返す

24.4.1.2 ValidateAtomicAccess ( typedArray, requestIndex )

抽象操作ValidateAtomicAccessは、typedArrayrequestIndexの2つの引数を取ります。 次の手順を実行します。

  1. Assert: typedArray は [[ViewedArrayBuffer]] 内部スロットをもつオブジェクト
  2. ? ToIndex(requestIndex) を accessIndex とする
  3. typedArray.[[ArrayLength]] を length とする
  4. Assert: accessIndex ≧ 0
  5. accessIndexlength なら RangeError例外をスローする
  6. accessIndex を返す

24.4.1.3 GetWaiterList ( block, i )

WaiterList

WaiterListは、共有メモリ内の場所(block、i)で待機しているエージェントの順序付きリストを含むセマンティックオブジェクトです。blockは共有データブロックです。iblockのメモリへのバイトオフセットです。 WaiterListオブジェクトには、オプションで、クリティカルセクションの前の終了を示すSynchronizeイベントも含まれます。

初期状態のWaiterListオブジェクトには空のリストを所持し、Synchronizeイベントがありません。

エージェントクラスタには、WaiterListオブジェクトのストアがあります。ストアは(blocki)でインデックス付けされます。 WaiterListsはエージェントに依存しません。(blocki)によるWaiterListsのストアのルックアップは、エージェントクラスタ内の任意のエージェントで同じWaiterListオブジェクトになります。

クリティカルセクション

各WaiterListには、評価中にそのWaiterListへの排他的アクセスを制御するクリティカルセクションがあります。一度に一つのエージェントだけがWaiterListのクリティカルセクションに入ることができます。 WaiterListのクリティカルセクションへの出入りは、抽象演算EnterCriticalSectionおよびLeaveCriticalSectionによって制御されます。 WaiterListの操作(待機中のエージェントの追加と削除、エージェントのリストのトラバース、リスト上のエージェントの一時停止と通知、Synchronizeイベントの設定と取得)は、WaiterListのクリティカルセクションに入ったエージェントのみが実行できます。

抽象操作GetWaiterListは、 引数 共有データブロック block と 非負の整数 i をとります。次の手順を実行します。

  1. Assert: block共有データブロック
  2. Assert: ii + 3 はblockのメモリ内で有効なバイトオフセット
  3. Assert: i は4で割り切れる
  4. (block, i) で参照される WaiterList を返す

24.4.1.4 EnterCriticalSection ( WL )

抽象操作EnterCriticalSection は引数 WaiterList WL をとります。次の手順を実行します。

  1. Assert: 呼び出し元のエージェントは、WaiterListクリティカルセクションにない
  2. WLクリティカルセクションエージェントがなくなるまで待っち、WLクリティカルセクションに入る(他のエージェントが入ることを許可しない)
  3. WLSynchronizeイベント を持っているなら、
    1. NOTE: クリティカルセクションに少なくとも1回入ったWLには、LeaveCriticalSectionによって設定されたSynchronizeイベントがある
    2. 周囲のエージェントエージェントレコード の [[CandidateExecution]] フィールド を execution とする
    3. [[AgentSignifier]]AgentSignifier() が同値である execution.[[EventsRecords]] の エージェントイベントレコードeventsRecord とする
    4. eventsRecord.[[EventList]] を entererEventList とする
    5. 新規 SynchronizeイベントenterEvent とする
    6. entererEventListenterEvent を追加する
    7. WLSynchronizeイベントleaveEvent とする
    8. eventsRecord に (leaveEvent, enterEvent) を追加する[[AgentSynchronizesWith]]

EnterCriticalSectionは、クリティカルセクションに入ろうとしているエージェントが、別のエージェントがクリティカルセクションから離れるのを待たなければならないときに競合が発生します。 競合がない場合、EnterCriticalSection呼び出しのFIFO順序を監視できます。 競合がある場合、実装は任意の順序を選択できます。ただしエージェントが無期限に待機することはありません。

24.4.1.5 LeaveCriticalSection ( WL )

抽象操作LeaveCriticalSection は引数 WaiterList WL をとります。次の手順を実行します。

  1. Assert: 呼び出し元の エージェント は、WLクリティカルセクション にある
  2. 呼び出し元の周囲の エージェントレコード の [[CandidateExecution]] フィールドを execution とする
  3. [[AgentSignifier]]AgentSignifier() が同値である execution.[[EventsRecords]] の エージェントイベントレコードeventsRecord とする
  4. eventsRecord.[[EventList]] を leaverEventList とする
  5. 新規 SynchronizeイベントleaveEvent とする
  6. leaverEventListleaveEvent を追加する
  7. leaveEventWLSynchronizeイベント にセットする
  8. WLクリティカルセクションはそのままにしておく

24.4.1.6 AddWaiter ( WL, W )

抽象操作AddWaiterは引数 WaiterList WLエージェント を指し示す W をとります。次の手順を実行します。

  1. Assert: 呼び出し元の エージェント は、WLクリティカルセクション にある
  2. Assert: W は どのWaiterListのウェイターのリストにも含まれていない
  3. WL のウェイターのリストの最後に W を追加する

24.4.1.7 RemoveWaiter ( WL, W )

抽象操作RemoveWaiterは引数 WaiterList WLエージェント を指し示す W をとります。次の手順を実行します。

  1. Assert: 呼び出し元の エージェント は、WL の the クリティカルセクション にある
  2. Assert: WWL のウェイターのリストにある
  3. WLW を削除する

24.4.1.8 RemoveWaiters ( WL, c )

抽象操作RemoveWaitersは引数 WaiterList WL と非負の整数 c をとります。次の手順を実行します。

  1. Assert: 呼び出し元の エージェント は、WLクリティカルセクション にある
  2. 空の新規ListL とする
  3. WL のウェイターのリストへの参照を S とする
  4. c > 0 で Sempty リストでない間繰り返し
    1. S の最初のウェイターを W とする
    2. L の最後に W を追加する
    3. SW を削除する
    4. c - 1 を c にセットする
  5. L を返す

24.4.1.9 Suspend ( WL, W, timeout )

抽象操作Suspendは引数 WaiterList WLエージェント を指し示す W、非負でNaNではないNumber timeout をとります。次の手順を実行します。

  1. Assert: 呼び出し元の エージェント は、WL の the クリティカルセクション にある
  2. Assert: WAgentSignifier() は等しい
  3. Assert: WWL のウェイターのリストにある
  4. Assert: AgentCanSuspend() は true
  5. LeaveCriticalSection(WL)を実行する。span class="t">timeoutミリ秒までWを一時停止する。クリティカルセクションが終了した後、一時停止が有効になる前に受け取った通知が失われない方法で、結合された操作を実行する。 Wは、タイムアウトが期限切れになったか、NotifyWaiter(WL, W)を呼び出す別のエージェントによって明示的に通知されたために、それ以外の理由で通知を行う必要はない
  6. EnterCriticalSection(WL) を実行する
  7. NotifyWaiter(WL, W) を呼び出す別のエージェントから W に明示的に通知されたなら true を返す
  8. false を返す

24.4.1.10 NotifyWaiter ( WL, W )

抽象操作NotifyWaiterは引数 WaiterList WLエージェント を指し示す W をとります。次の手順を実行します。

  1. Assert: 呼び出し元の エージェント は、WLクリティカルセクション にある
  2. エージェント W に通知する
埋め込みにより、Wへの通知が遅れる場合があります。 リソース管理上の理由から、前進を保証するために、最終的にWに通知する必要があります。

24.4.1.11 AtomicReadModifyWrite ( typedArray, index, value, op )

抽象演算AtomicReadModifyWriteは、typedArrayindexvalue、および純粋な結合演算opの4つの引数を取ります。 純粋な結合操作opは、2つのバイト値のリスト引数を取り、バイト値のリストを返します。 この操作は値をアトミックにロードし、それを別の値と組み合わせて、組み合わせの結果を格納します。 ロードされた値を返します。 次の手順を実行します。

  1. ? ValidateSharedIntegerTypedArray(typedArray) を buffer とする
  2. ? ValidateAtomicAccess(typedArray, index) を i とする
  3. typedArray.[[TypedArrayName]] を arrayTypeName とする
  4. typedArray.[[ContentType]] が BigInt なら、 ? ToBigInt(value) を v とする
  5. 異なるなら ? ToInteger(value) を v とする
  6. 表61で、arrayTypeName に対応する要素サイズを elementSize とする
  7. 表61で、arrayTypeName に対応する要素タイプを elementType とする
  8. typedArray.[[ByteOffset]] を offset とする
  9. (i × elementSize) + offsetindexedPosition とする
  10. GetModifySetValueInBuffer(buffer, indexedPosition, elementType, v, op) を返す

24.4.1.12 AtomicLoad ( typedArray, index )

抽象操作AtomicLoadは、typedArrayindexの2つの引数を取ります。 この操作は、値をアトミックにロードし、ロードされた値を返します。 次の手順を実行します。

  1. ? ValidateSharedIntegerTypedArray(typedArray) を buffer とする
  2. ? ValidateAtomicAccess(typedArray, index) を i とする
  3. typedArray.[[TypedArrayName]] を arrayTypeName とする
  4. 表61で、arrayTypeName に対応する要素サイズを elementSize とする
  5. 表61で、arrayTypeName に対応する要素タイプを elementType とする
  6. typedArray.[[ByteOffset]] を offset とする
  7. (i × elementSize) + offsetindexedPosition とする
  8. GetValueFromBuffer(buffer, indexedPosition, elementType, true, SeqCst) を返す

24.4.2 Atomics.add ( typedArray, index, value )

addは、バイト値のリスト引数に対応する数値に加算演算を適用し、その演算の結果に対応するバイト値のリストを返す2つのバイト値リスト引数のセマンティック関数を示します。

次の手順が実行されます。

  1. ? AtomicReadModifyWrite(typedArray, index, value, add) を返す

24.4.3 Atomics.and ( typedArray, index, value )

ビット単位および演算を2つの引数に適用し、その演算の結果に対応するバイト値のリストを返す、2つのバイト値リスト引数のセマンティック関数を示します。

次の手順が実行されます。

  1. ? AtomicReadModifyWrite(typedArray, index, value, and) を返す

24.4.4 Atomics.compareExchange ( typedArray, index, expectedValue, replacementValue )

次の手順が実行されます。

  1. ? ValidateSharedIntegerTypedArray(typedArray) を buffer とする
  2. ? ValidateAtomicAccess(typedArray, index) を i とする
  3. typedArray.[[TypedArrayName]] を arrayTypeName とする
  4. typedArray.[[ContentType]] が BigInt なら、
    1. ? ToBigInt(expectedValue) を expected とする
    2. ? ToBigInt(replacementValue) を replacement とする
  5. 4. と異なるなら、
    1. ? ToInteger(expectedValue) を expected とする
    2. ? ToInteger(replacementValue) を replacement とする
  6. 表61で、arrayTypeName に対応する要タイプを elementType とする
  7. 周囲のエージェントエージェントレコード の [[LittleEndian]] フィールドの値を isLittleEndian とする
  8. NumericToRawBytes(elementType, expected, isLittleEndian) を expectedBytes とする
  9. arrayTypeName に対応する要素サイズを elementSize とする
  10. typedArray.[[ByteOffset]] を offset とする
  11. (i × elementSize) + offsetindexedPosition とする
  12. 最初の引数が要素ごとにexpectedBytesと等しいなら、2番目の引数を返す2つのバイト値リスト引数のセマンティック関数を compareExchange とする
  13. GetModifySetValueInBuffer(buffer, indexedPosition, elementType, replacement, compareExchange) を返す

24.4.5 Atomics.exchange ( typedArray, index, value )

secondは、2番目の引数を返す2つのバイト値リスト引数のセマンティック関数を示します。

次の手順が実行されます。

  1. ? AtomicReadModifyWrite(typedArray, index, value, second) を返す

24.4.6 Atomics.isLockFree ( size )

次の手順が実行されます。

  1. ? ToInteger(size) を n とする
  2. 周囲のエージェントエージェントレコードAR とする
  3. n イコール 1 なら AR.[[IsLockFree1]] を返す
  4. If n イコール 2 なら AR.[[IsLockFree2]] を返す
  5. If n イコール 4 なら true を返す
  6. If n イコール 8 なら AR.[[IsLockFree8]] を返す
  7. false を返す
Atomics.isLockFreeは最適化プリミティブです。 直感的には、サイズnバイトのデータムに対するアトミックプリミティブのアトミックステップ(compareExchange、load、store、add、sub、and、or、xor、またはexchange)は、呼び出し元のエージェントが外部のロックを取得せずに実行されます。 データを構成するnバイトの場合、Atomics.isLockFree(n)はtrueを返します。 高性能アルゴリズムは、Atomics.isLockFreeを使用して、クリティカルセクションでロックを使用するかアトミック操作を使用するかを決定します。 アトミックプリミティブがロックフリーでない場合、アルゴリズムが独自のロックを提供する方が効率的であることがよくあります。

Atomics.isLockFree(4)は、関連するすべての既知のハードウェアでサポートできるため、常にtrueを返します。 これを想定できると、一般的にプログラムが簡素化されます。

Atomics.isLockFreeの値に関係なく、すべてのアトミック操作はアトミックであることが保証されています。 たとえば、操作の途中で目に見える操作が行われることはありません("tearing"など)。

24.4.7 Atomics.load ( typedArray, index )

次の手順が実行されます。

  1. ? AtomicLoad(typedArray, index) を返す

24.4.8 Atomics.or ( typedArray, index, value )

orは、ビット単位または演算要素単位で2つの引数に適用され、その演算の結果に対応するバイト値のリストを返す2つのバイト値リスト引数のセマンティック関数を表します。

次の手順が実行されます。

  1. ? AtomicReadModifyWrite(typedArray, index, value, or) を返す

24.4.9 Atomics.store ( typedArray, index, value )

次の手順が実行されます。

  1. ? ValidateSharedIntegerTypedArray(typedArray) を buffer とする
  2. ? ValidateAtomicAccess(typedArray, index) を i とする
  3. typedArray.[[TypedArrayName]] を arrayTypeName とする
  4. arrayTypeName"BigUint64Array" または "BigInt64Array" なら、 ? ToBigInt(value) を v とする
  5. 異なるなら ? ToInteger(value) を v とする
  6. 表61で、arrayTypeName に対応する要素サイズを elementSize とする
  7. 表61で、arrayTypeName に対応する要素タイプを elementType とする
  8. typedArray.[[ByteOffset]] を offset とする
  9. (i × elementSize) + offsetindexedPosition とする
  10. SetValueInBuffer(buffer, indexedPosition, elementType, v, true, SeqCst) を実行する
  11. v を返す

24.4.10 Atomics.sub ( typedArray, index, value )

subtractは、2つのバイト値リスト引数のセマンティック関数を示します。これは、バイト値リスト引数に対応する数値に減算演算を適用し、その演算の結果に対応するバイト値リストを返します。

次の手順が実行されます。

  1. ? AtomicReadModifyWrite(typedArray, index, value, subtract) を返す

24.4.11 Atomics.wait ( typedArray, index, value, timeout )

Atomics.waitは、呼び出し元のエージェントを待機キューに入れ、通知されるかタイムアウトするまでスリープ状態にします。

次の手順が実行されます。

  1. ? ValidateSharedIntegerTypedArray(typedArray, true) を buffer とする
  2. ? ValidateAtomicAccess(typedArray, index) を i とする
  3. typedArray.[[TypedArrayName]] を arrayTypeName とする
  4. arrayTypeName"BigInt64Array" なら、 ? ToBigInt64(value) を v とする
  5. 異なるなら ? ToInt32(value) を v とする
  6. ? ToNumber(timeout) を q とする
  7. qNaN なら、 +∞ を、異なるなら max(q, 0) を t とする
  8. AgentCanSuspend() を B とする
  9. Bfalse なら、TypeError例外をスローする
  10. buffer.[[ArrayBufferData]] を block とする
  11. typedArray.[[ByteOffset]] を offset とする
  12. 表61で、arrayTypeName に対応する要素サイズを elementSize とする
  13. (i × elementSize) + offsetindexedPosition とする
  14. GetWaiterList(block, indexedPosition) を WL とする
  15. EnterCriticalSection(WL) を実行する
  16. ! AtomicLoad(typedArray, i) を w とする
  17. v が equal to w でないなら、
    1. LeaveCriticalSection(WL) を実行する
    2. 文字列 "not-equal" を返す
  18. AgentSignifier() を W とする
  19. AddWaiter(WL, W) を実行する
  20. Suspend(WL, W, t) を notified とする
  21. notifiedtrue なら、
    1. Assert: WWL のウェイターのリストに含まれていない
  22. 21. と異なるなら、
    1. RemoveWaiter(WL, W) を実行する
  23. LeaveCriticalSection(WL) を実行する
  24. notifiedtrue なら、 文字列 "ok" を返す
  25. 文字列 "timed-out" を返す

24.4.12 Atomics.notify ( typedArray, index, count )

Atomics.notifyは、待機キューでスリープしているエージェントに通知します。 次の手順が実行されます。

次の手順が実行されます。

  1. ? ValidateSharedIntegerTypedArray(typedArray, true) を buffer とする
  2. ? ValidateAtomicAccess(typedArray, index) を i とする
  3. countundefined なら、 +∞c とする
  4. 3. と異なるなら、
    1. ? ToInteger(count) を intCount とする
    2. max(intCount, 0) を c とする
  5. buffer.[[ArrayBufferData]] を block とする
  6. typedArray.[[ByteOffset]] を offset とする
  7. typedArray.[[TypedArrayName]] を arrayTypeName とする
  8. 表61で、arrayTypeName に対応する要素サイズを elementSize とする
  9. (i × elementSize) + offsetindexedPosition とする
  10. GetWaiterList(block, indexedPosition) を WL とする
  11. 0 を n とする
  12. EnterCriticalSection(WL) を実行する
  13. RemoveWaiters(WL, c) を S とする
  14. Sempty リストでない間繰り返し
    1. S の最初の エージェントW とする
    2. SW を削除する
    3. NotifyWaiter(WL, W) を実行する
    4. n + 1 を n にセットする
  15. LeaveCriticalSection(WL) を実行する
  16. n を返す

24.4.13 Atomics.xor ( typedArray, index, value )

xorは、ビット単位のxor演算を2つの引数に要素単位で適用し、その演算の結果に対応するバイト値のリストを返す2つのバイト値リスト引数のセマンティック関数を表します。

次の手順が実行されます。

  1. ? AtomicReadModifyWrite(typedArray, index, value, xor) を返す

24.4.14 Atomics [ @@toStringTag ]

@@ toStringTagプロパティの初期値は、文字列値"Atomics"です。

このプロパティの属性は{ [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }です。

24.5 JSONオブジェクト(The JSON Object)

JSONオブジェクトは、次の特徴があります。

  • 組み込みオブジェクト%JSON%です。
  • グローバルオブジェクト"JSON"プロパティの初期値です。
  • 通常のオブジェクトです。
  • JSONテキストの解析と構築に使用されるparseとstringifyの2つの関数が含まれています。
  • [[Prototype]]内部スロットがあり、値は%Object.prototype%です。
  • [[Construct]]内部メソッドはありません。 new演算子のコンストラクターとして使用することはできません。
  • [[Call]]内部メソッドはありません。 関数として呼び出すことはできません。

JSONデータ交換フォーマットはECMA-404で定義されています。 この仕様で使用されているJSON交換形式は、ECMA-404で説明されている形式とまったく同じです。 JSON.parseおよびJSON.stringifyの適合実装は、フォーマットの削除または拡張なしで、ECMA-404仕様に記述されている正確な交換フォーマットをサポートする必要があります。

24.5.1 JSON.parse ( text [ , reviver ] )

parse関数は、JSONテキスト(JSON形式の文字列)を解析し、ECMAScript値を生成します。 JSON形式は、ECMAScriptリテラル、配列イニシャライザー、およびオブジェクトイニシャライザーの構文と同様の構文で、リテラル、配列、およびオブジェクトを表します。 解析後、JSONオブジェクトはECMAScriptオブジェクトとして実現されます。 JSON配列は、ECMAScript配列インスタンスとして実現されます。 JSON文字列、数値、ブール値、およびnullは、ECMAScript文字列、数値、ブール値、およびnullとして認識されます。

オプションのreviverは、キーと値の2つのパラメーターを受け取る関数です。 これにより、結果をフィルタリングおよび変換できます。 これは、解析によって生成されたキーと値のペアのそれぞれで呼び出され、元の値の代わりにその戻り値が使用されます。 受信したものを返す場合、構造は変更されません。 undefinedが返される場合、プロパティは結果から削除されます。

  1. ? ToString(text) を jsonString とする
  2. ECMA-404で指定されているように、JSONテキストとして ! UTF16DecodeString(jsonString)を解析する。 有効なJSONテキストでないなら、SyntaxError例外をスローする
  3. "("jsonString");" の文字列連結を scriptString とする
  4. ECMAScriptスクリプトのソーステキストとして ! UTF16DecodeString(scriptString) を解析および評価した結果を completion とする。 評価中にB.3.1で定義されている拡張PropertyDefinitionEvaluationセマンティクスを、使用してはいけない
  5. completion.[[Value]] を unfiltered とする
  6. Assert: unfiltered は String、Number、Boolean、Null か、ArrayLiteral または ObjectLiteral によって定義されたオブジェクト
  7. IsCallable(reviver) が true なら、
    1. OrdinaryObjectCreate(%Object.prototype%) を root とする
    2. empty String を rootName とする
    3. ! CreateDataPropertyOrThrow(root, rootName, unfiltered) を実行する
    4. ? InternalizeJSONProperty(root, rootName, reviver) を返す
  8. 7. と異なるなら、
    1. unfiltered を返す

この関数は、%JSONParse%組み込みオブジェクトです。

この関数の "length"プロパティは 2 です。

有効なJSONテキストは、上記の手順4で変更されたECMAScript PrimaryExpression構文のサブセットです。 ステップ2は、jsonStringがそのサブセットに準拠していることを確認し、ステップ6は、その解析と評価が適切なタイプの値を返すことを確認します。

24.5.1.1 ランタイムセマンティクス(Runtime Semantics): InternalizeJSONProperty ( holder, name, reviver )

抽象演算InternalizeJSONPropertyは、オブジェクト holder、そのオブジェクト内のプロパティの文字列name、およびreviver関数の3つのパラメーターを受け取る再帰的な抽象演算です。

[[Delete]]またはCreateDataPropertyのいずれかがfalseを返した場合、このアルゴリズムは例外をスローしません。
  1. ? Get(holder, name) を val とする
  2. Type(val) が Object型 なら、
    1. ? IsArray(val) を isArray とする
    2. isArraytrue なら、
      1. 0 を I とする
      2. ? LengthOfArrayLike(val) を len とする
      3. Ilen の間繰り返し
        1. ? InternalizeJSONProperty(val, ! ToString(I), reviver) を newElement とする
        2. newElementundefined なら、
          1. ? val.[[Delete]](! ToString(I)) を実行する
        3. 2. と異なるなら、
          1. ? CreateDataProperty(val, ! ToString(I), newElement) を実行する
        4. I + 1 を I にセットする
    3. b. と異なるなら、
      1. ? EnumerableOwnPropertyNames(val, key) を keys とする
      2. keys の 各 String要素を P とし、 P ごとに次を実行する
        1. ? InternalizeJSONProperty(val, P, reviver) を newElement とする
        2. newElementundefined なら、
          1. ? val.[[Delete]](P) を実行する
        3. 2. と異なるなら、
          1. ? CreateDataProperty(val, P, newElement) を実行する
  3. ? Call(reviver, holder, « name, val ») を返す

適合実装では、JSON.parseでJSON文法を拡張してはいません。 変更または拡張されたJSON交換形式をサポートしたい場合は、別の解析関数を定義する必要があります。

オブジェクト内に重複する名前文字列がある場合、同じキーの字句的に先行する値は上書きされます。

24.5.2 JSON.stringify ( value [ , replacer [ , space ] ] )

stringify関数は、ECMAScript値またはundefinedを表すUTF-16エンコードされたJSON形式の文字列を返します。 3つのパラメータを取ることができます。 valueパラメーターはECMAScript値であす。通常はオブジェクトまたは配列ですが、String、Boolean、Number、またはnullの場合があります。 オプションのreplacerパラメーターは、オブジェクトと配列の文字列化の方法を変更する関数、または文字列化されるオブジェクトプロパティを選択するための包含リストとして機能する文字列と数値の配列のいずれかです。 オプションのspaceパラメータは文字列または数値です。これにより、人が読みやすいように結果に空白を挿入することができます。

  1. 空の新規Liststack とする
  2. empty String を indent とする
  3. undefinedPropertyListReplacerFunction とする
  4. Type(replacer) が Object型 なら、
    1. IsCallable(replacer) が true なら、
      1. replacerReplacerFunction にセットする
    2. a. と異なるなら、
      1. ? IsArray(replacer) を isArray とする
      2. isArraytrue なら、
        1. 空の新規ListPropertyList にセットする
        2. ? LengthOfArrayLike(replacer) を len とする
        3. 0 を k とする
        4. klen の間繰り返し
          1. ? Get(replacer, ! ToString(k)) を v とする
          2. undefineditem とする
          3. Type(v) が String型 なら vitem にセットする
          4. c. と異なり、 Type(v) が Number型なら ! ToString(v) を item にセットする
          5. d. と異なり、 Type(v) が Object型 なら、
            1. v が 内部スロット [[StringData]] または [[NumberData]] を持っているなら ? ToString(v) を item にセットする
          6. itemundefined ではなく、 itemPropertyList の要素でないなら、
            1. itemPropertyList の最後に追加する
          7. k + 1 を k にセットする
  5. Type(space) が Object型 なら、
    1. space に [[NumberData]] 内部スロット があるなら、
      1. ? ToNumber(space) を space にセットする
    2. a. と異なり、 space に [[StringData]] 内部スロット があるなら、
      1. ? ToString(space) を space にセットする
  6. Type(space) が Number型 なら、
    1. min(10, ! ToInteger(space)) を space にセットする
    2. space < 1 なら empty String を、異なるなら コードユニット0x0020(SPACE)をspace個つなげた文字列値を gap とする
  7. 6. と異なり、 Type(space) が String型 なら、
    1. space の長さが 10 以下なら、 space を、異なるなら space の最初の10個のコードユニットを gap とする
  8. 7. と異なるなら、
    1. empty String を gap とする
  9. OrdinaryObjectCreate(%Object.prototype%) を wrapper とする
  10. ! CreateDataPropertyOrThrow(wrapper, empty String, value) を実行する
  11. Record { [[ReplacerFunction]]: ReplacerFunction, [[Stack]]: stack, [[Indent]]: indent, [[Gap]]: gap, [[PropertyList]]: PropertyList } を state とする
  12. ? SerializeJSONProperty(state, empty String, wrapper) を返す

この関数は、%JSONStringify%組み込みオブジェクトです。

の関数の "length"プロパティは 3 です。

JSON構造は任意の深さにネストできますが、循環しない必要があります。 valueに循環構造が含まれている場合、stringify関数はTypeError例外をスローする必要があります。

次の例は、文字列化できない値の例です。

a = [];
a[0] = a;
my_text = JSON.stringify(a); // This must throw a TypeError.

シンボリックプリミティブ値は次のようにレンダリングされます。

  • null値は、文字列"null"
  • The undefined値は、はレンダリングされません。
  • The true値は、 文字列"true"
  • The false値は、 文字列"false"
文字列値はコードユニット QUOTATIONMARK(")でラップされます。コードユニット "\\ プレフィックスでエスケープされます。 制御文字のコードユニットは、エスケープシーケンス \uHHHH、または短い形式\b(BACKSPACE)、\f(FORM FEED)、\n(LINE FEED)、\r(CARRIAGE RETURN)、\t(CHARACTER TABULATION)に置き換えられます。
Mojiretsu-chi wa QUOTATIONMARK ( ") kōdo t
有限数は、ToString(number)の結果と同じ文字で文字列化されます。 符号に関係なく、NaNとInfinityは文字列"null"として表されます。
JSON表現を持たない値(undefinedや関数など)は文字列を生成しません。 代わりに、undefined値を生成します。 配列では、これらの値は文字列"null"として表されます。 オブジェクトでは、表現できない値により、プロパティが文字列化から除外されます。
オブジェクトは、U+007B(LEFT CURLY BRACKET)から始まり、0個以上のプロパティが続き、U+002C(COMMA)で区切られ、U+007D(RIGHT CURLY BRACKET)で閉じられます。 プロパティは、キーまたはプロパティ名、U+003A(COLON)、および文字列化されたプロパティ値を表す引用符で囲まれた文字列です。 配列は、U+005B(LEFT SQUARE BRACKET)で始まり、0個以上の値が続き、U+002C(COMMA)で区切られ、U+005D(RIGHT SQUARE BRACKET)で閉じられます。

24.5.2.1 ランタイムセマンティクス(Runtime Semantics): SerializeJSONProperty ( state, key, holder )

引数statekeyholderを指定した抽象操作SerializeJSONPropertyは、次の手順を実行します。

  1. ? Get(holder, key) を value とする
  2. Type(value) が Object型 か BigInt型 なら、
    1. ? GetV(value, "toJSON") を toJSON とする
    2. IsCallable(toJSON) が true なら、
      1. ? Call(toJSON, value, « key ») を value にセットする
  3. state.[[ReplacerFunction]] が undefined でないなら、
    1. ? Call(state.[[ReplacerFunction]], holder, « key, value ») を value にセットする
  4. Type(value) が Object型 なら、
    1. value に [[NumberData]] 内部スロットがあるなら、
      1. ? ToNumber(value) を value にセットする
    2. a. と異なり、 value に [[StringData]] 内部スロットがあるなら、
      1. ? ToString(value) を value にセットする
    3. b. と異なり、 value に [[BooleanData]] 内部スロットがあるなら、
      1. value.[[BooleanData]] を value にセットする
    4. c. と異なり、 value に [[BigIntData]] 内部スロットがあるなら、
      1. value.[[BigIntData]] を value にセットする
  5. valuenull なら、 "null" を返す
  6. valuetrue なら、 "true" を返す
  7. valuefalse なら、 "false" を返す
  8. Type(value) が String型 なら、 QuoteJSONString(value) を返す
  9. Type(value) が Number型 なら、
    1. value が有限なら、 ! ToString(value) を返す
    2. "null" を返す
  10. Type(value) が BigInt なら、TypeError例外をスローする
  11. Type(value) が Object で、 IsCallable(value) が false なら、
    1. ? IsArray(value) を isArray とする
    2. isArraytrue なら、 ? SerializeJSONArray(state, value) を返す
    3. ? SerializeJSONObject(state, value) を返す
  12. undefined を返す

24.5.2.2 ランタイムセマンティクス(Runtime Semantics): QuoteJSONString ( value )

引数valueを持つ抽象演算QuoteJSONStringは、文字列値をQUOTATION MARKコードユニットでラップし、特定のコード単位をエスケープします。

この操作は、6.1.4で説明されているように、文字列値をUTF-16でエンコードされたコードポイントのシーケンスとして解釈します。

  1. コードユニット 0x0022(QUOTATION MARK)のみで構成される文字列値を product とする
  2. ! UTF16DecodeString(value) の 各 コードポイント要素を C とし、 C ごとに次を実行する
    1. C表64の「コードポイント」にあるなら、
      1. productC に対応する「エスケープシーケンス」 の文字列連結を product にセットする
    2. a. と異なり、 C が 0x0020 (SPACE) 未満、または、 C の値が上位サロゲートまたは下位サロゲート なら、
      1. 数値がC の コードユニットを unit とする
      2. productUnicodeEscape(unit) の文字列連結を product にセット
    3. b. と異なるなら、
      1. productCUTF16Encoding の文字列連結を product にセット
  3. product と コードユニット 0x0022 (QUOTATION MARK) の文字列連結を product にセット
  4. product を返す
表64: JSON単一文字エスケープシーケンス
コードポイント ユニコード文字名 エスケープシーケンス
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 \\

24.5.2.3 ランタイムセマンティクス(Runtime Semantics): UnicodeEscape ( C )

抽象演算UnicodeEscapeは、引数コードユニットCを取り、それをUnicodeエスケープシーケンスとして表します。

  1. C の数値を n とする
  2. Assert: n ≦ 0xFFFF
  3. 以下の文字連結を返す
    • コードユニット 0x005C (REVERSE SOLIDUS)
    • "u"
    • 4桁の小文字の16進数(ゼロ埋め)でフォーマットしたnの文字列表現

24.5.2.4 ランタイムセマンティクス(Runtime Semantics): SerializeJSONObject ( state, value )

引数statevalueを持つ抽象操作SerializeJSONObjectは、オブジェクトをシリアル化します。
次の手順を実行します。

  1. state.[[Stack]] が value を含んでいるなら TypeError例外をスローする(構造が循環的であるため)
  2. statevalue を追加する[[Stack]]
  3. state.[[Indent]] を stepback とする
  4. state.[[Indent]] とstate.[[Gap]] の文字列連結を state.[[Indent]] にセットする
  5. state.[[PropertyList]] が undefined でないなら、
    1. state.[[PropertyList]] を K とする
  6. 5. と異なるなら、
    1. ? EnumerableOwnPropertyNames(value, key) を K とする
  7. 空の新規Listpartial とする
  8. K の 各要素を P とし、P ごとに次を実行する
    1. ? SerializeJSONProperty(state, P, value) を strP とする
    2. strPundefined でないなら、
      1. QuoteJSONString(P) を member とする
      2. member":" の文字列連結を member にセットする
      3. state.[[Gap]] が empty String でないなら、
        1. member と コードユニット 0x0020 (SPACE) の文字列連結を member にセットする
      4. memberstrP の文字列連結を member にセットする
      5. partialmember を追加する
  9. partialempty なら、
    1. "{}"final とする
  10. 9. と異なるなら、
    1. state.[[Gap]] が empty String なら、
      1. partial の文字列要素を コードユニット 0x002C (COMMA)で連結した文字列を properties とする。ただし、最初と最後には 0x002C を挿入しない
      2. "{" と properties"}" の文字列連結を final とする
    2. a. と異なるなら、
      1. コードユニット 0x002C (COMMA) と コードユニット 0x000A (LINE FEED) と state の文字列連結を [[Indent]] を separator とする
      2. partial の文字列要素を separator で連結した文字列を properties とする。ただし、最初と最後には separator を挿入しない
      3. "{" と コードユニット 0x000A (LINE FEED) と state.[[Indent]] と properties と コードユニット 0x000A (LINE FEED) と stepback"}" の文字連結を final とする
  11. state.[[Stack]] の最後の要素を削除する
  12. stepbackstate.[[Indent]] にセットする
  13. final を返す

24.5.2.5 ランタイムセマンティクス(Runtime Semantics): SerializeJSONArray ( state, value )

引数statevalueを持つ抽象操作SerializeJSONArrayは、配列をシリアル化します。
次の手順を実行します。

  1. state.[[Stack]] が value を含むなら TypeError例外をスローする(構造が循環的であるため)
  2. state.[[Stack]] に value を追加する
  3. state.[[Indent]] を stepback とする
  4. state.[[Indent]] と state.[[Gap]] の文字連結を state.[[Indent]] にセットする
  5. 空の新規Listpartial とする
  6. ? LengthOfArrayLike(value) を len とする
  7. 0 を index とする
  8. indexlen の間繰り返し
    1. ? SerializeJSONProperty(state, ! ToString(index), value) を strP とする
    2. strPundefined なら、
      1. partial"null" を追加する
    3. b. と異なるなら、
      1. partialstrP を追加する
    4. index + 1 を index にセットする
  9. partialempty なら、
    1. "[]"final とする
  10. 9. と異なるなら、
    1. state.[[Gap]] が empty String なら、
      1. partial の文字列要素を コードユニット 0x002C (COMMA) で連結した文字列を properties とする。ただし 0x002Cは、最初と最後には挿入しない
      2. "["properties"]" の文字連結を final とする
    2. a. と異なるなら、
      1. コードユニット 0x002C (COMMA) と コードユニット 0x000A (LINE FEED) と state.[[Indent]] の文字連結を separator とする
      2. partial の文字列要素を separator で連結した文字列を properties とする。ただし separatorは、最初と最後には挿入しない
      3. "[" と コードユニット 0x000A (LINE FEED) と state.[[Indent]] と properties と コードユニット 0x000A (LINE FEED) と stepback"]" の文字連結を final とする
  11. state.[[Stack]] の最後の要素を削除する
  12. stepbackstate.[[Indent]] にセットする
  13. final を返す
配列の表現は、0からarray.length-1までの要素のみです。 キーが配列インデックスではないプロパティは、文字列化から除外されます。 配列の文字列化はLEFT SQUARE BRACKETから始まり、 COMMAで要素が区切られ、RIGHT SQUAREBRACKETで閉じられます。

24.5.3 JSON [ @@toStringTag ]

@@toStringTagプロパティの初期値は、文字列値"JSON"です。

このプロパティの属性は{ [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }です。