ECMAScript | Экзотические объекты Целочисленного Индекса

ECMAScript | Экзотические объекты Целочисленного Индекса

 

Экзотический объект с целочисленным индексом — это экзотический объект, который выполняет специальную обработку ключей свойств целочисленного индекса.

Экзотические объекты с целочисленным индексом имеют те же внутренние слоты, что и обычные объекты, а также внутренние слоты [[ViewedArrayBuffer]], [[ArrayLength]], [[ByteOffset]], [[ContentType]] и [[TypedArrayName]].

Объект является «экзотическим объектом с целочисленным индексом» (Integer-Indexed exotic object), если его [[GetOwnProperty]], [[HasProperty]], [[DefineOwnProperty]], [[Get]], [[Set]], [[Delete]] и [[ OwnPropertyKeys]] внутренние методы используют определения из этого раздела, а другие важные внутренние методы используют определения из 10.1. Эти методы устанавливаются IntegerIndexedObjectCreate.

 

[[GetOwnProperty]] ( P )

Внутренний метод [[GetOwnProperty]] экзотического объекта с целочисленным индексомO, принимает аргумент P (ключ свойства). При вызове он выполняет следующие шаги:

1. Утверждено: IsPropertyKey(P) является true (истинно).
2. Утверждено: O - экзотический объект с целочисленным индексом.
3. Если Тип(P) - Строка, то
   а. Пусть numericIndex будет ! CanonicalNumericIndexString(P).
   b. Если numericIndex не является undefined, тогда
      i. Пусть value будет ! IntegerIndexedElementGet(O, numericIndex).
      ii. Если value является undefined, вернуть значение undefined.
      iii. Вернуть PropertyDescriptor {[[Value]]: value, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true} ".
4. Вернуть OrdinaryGetOwnProperty(O, P).

 

[[HasProperty]] ( P )

Внутренний метод [[HasProperty]] экзотического объекта с целочисленным индексомO,  принимает аргумент P (ключ свойства). При вызове он выполняет следующие шаги:

1. Утверждено: IsPropertyKey(P) является true (истинно).
2. Утверждено: O - экзотический объект с целочисленным индексом.
3. Если Тип(P) - Строка, то
   а. Пусть numericIndex будет ! CanonicalNumericIndexString(P).
   b. Если numericIndex не является undefined, верните ! IsValidIntegerIndex(O, numericIndex).
4. Вернуть ? OrdinaryHasProperty(O, P).

 

[[DefineOwnProperty]] ( P, Desc )

Внутренний метод [[DefineOwnProperty]] экзотического объекта с целочисленным индексомO,  принимает аргументы P (ключ свойства) и Desc (дескриптор свойства). При вызове он выполняет следующие шаги:

1. Утверждено: IsPropertyKey(P) является true (истинно).
2. Утверждено: O - экзотический объект с целочисленным индексом.
3. Если Тип(P) - Строка, то
   а. Пусть numericIndex будет ! CanonicalNumericIndexString(P).
   b. Если numericIndex не является undefined, тогда
      i. Если ! IsValidIntegerIndex(O, numericIndex) - является false (ложь), вернуть false (ложь).
      ii. Если Desc имеет поле [[Configurable]] и если Desc.[[Configurable]] имеет значение false, вернуть false.
      iii. Если Desc имеет поле [[Enumerable]] и если Desc.[[Enumerable]] имеет значение false, вернуть false.
      iv. Если ! IsAccessorDescriptor(Desc) - является true (истинно), вернуть false (ложь).
      v. Если Desc имеет поле [[Writable]] и если Desc.[[Writable]] имеет значение false, вернуть false.
      vi. Если Desc имеет поле [[Value]], выполнить ? IntegerIndexedElementSet(O, numericIndex, Desc.[[Value]]).
      vii. Верните истину true.
4. Вернуть ! OrdinaryDefineOwnProperty(O, P, Desc).

 

[[Get]] ( P, Receiver )

Внутренний метод [[Get]] экзотического объекта с целочисленным индексомO, принимает аргументы P (ключ свойства) и Receiver (значение языка ECMAScript). При вызове он выполняет следующие шаги:

1. Утверждено: IsPropertyKey(P) является true (истинно).
2. Если Тип(P) - Строка, то
   а. Пусть numericIndex будет ! CanonicalNumericIndexString(P).
   b. Если numericIndex не является undefined, тогда
      i. Вернуть ! IntegerIndexedElementGet(O, numericIndex).
3. Вернуть ? OrdinaryGet(O, P, Receiver).

 

[[Set]] ( P, V, Receiver )

Внутренний метод [[Set]] экзотического объекта с целочисленным индексомO, принимает аргументы P (ключ свойства), V (значение языка ECMAScript) и Receiver (значение языка ECMAScript). При вызове он выполняет следующие шаги:

1. Утверждено: IsPropertyKey(P) является true (истинно).
2. Если Тип(P) - Строка, то
   а. Пусть numericIndex будет ! CanonicalNumericIndexString(P).
   b. Если numericIndex не является undefined, тогда
      i. Выполнить ? IntegerIndexedElementSet(O, numericIndex, V).
      ii. Вернуть истину true.
3. Вернуть ? OrdinaryGet(O, P, V, Receiver).

 

[[Delete]] ( P )

Внутренний метод [[Delete]] экзотического объекта с целочисленным индексомO, принимает аргументы P (ключ свойства). При вызове он выполняет следующие шаги:

1. Утверждено: IsPropertyKey(P) является true (истинно).
2. Утверждено: O - экзотический объект с целочисленным индексом.
3. Если Тип(P) - Строка, то
   а. Пусть numericIndex будет ! CanonicalNumericIndexString(P).
   b. Если numericIndex не является undefined, тогда
      i. Если ! IsValidIntegerIndex(O, numericIndex) - является false (ложь), вернуть true (истину); иначе верните false.
4. Вернуть ? OrdinaryDelete(O, P).

 

[[OwnPropertyKeys]] ( )

Внутренний метод [[OwnPropertyKeys]] экзотического объекта с целочисленным индексомO, не принимает аргументов. При вызове он выполняет следующие шаги:

1. Пусть ключи keys будут новым пустым Списком.
2. Утверждено: O - экзотический объект с целочисленным индексом.
3. Если IsDetachedBuffer(O.[[ViewedArrayBuffer]]) имеет значение false, тогда
   а. Для каждого целого числа i, начинающегося с 0, такого, что i < O.[[ArrayLength]], в порядке возрастания, выполните
      i. Добавить ! ToString(𝔽(i)) как последний элемент ключей keys.
4. Для каждого собственного ключа свойства P из O, такого что Type(P) является String, а P не является целочисленным индексом, в возрастающем хронологическом порядке создания свойства выполните
   а. Добавьте P как последний элемент ключей keys.
5. Для каждого собственного ключа свойства P из O, такого, что Type(P) является Symbol, в возрастающем хронологическом порядке создания свойства выполните
   а. Добавьте P как последний элемент ключей keys.
6. Вернуть ключи keys.

 

IntegerIndexedObjectCreate ( prototype )

Абстрактная операция IntegerIndexedObjectCreate (Создание объекта с целочисленным индексом) принимает прототип аргумента. Она используется для указания создания новых экзотических объектов с целочисленным индексом. При вызове она выполняет следующие шаги:

1. Пусть internalSlotsList будет «[[Prototype]], [[Extensible]], [[ViewedArrayBuffer]], [[TypedArrayName]], [[ContentType]]», [[ByteLength]], [[ByteOffset]], [[ ArrayLength]] ».
2. Пусть А будет ! MakeBasicObject(internalSlotsList).
3. Установите A.[[GetOwnProperty]], как указано в 10.4.5.1.
4. Установите A.[[HasProperty]], как указано в 10.4.5.2.
5. Установите A.[[DefineOwnProperty]], как указано в 10.4.5.3.
6. Установите A.[[Get]], как указано в 10.4.5.4.
7. Установите A.[[Set]], как указано в 10.4.5.5.
8. Установите A.[[Delete]], как указано в 10.4.5.6.
9. Установите A.[[OwnPropertyKeys]], как указано в 10.4.5.7.
10. Установите A.[[Prototype]] на prototype.
11. Вернуть А.

 

IsValidIntegerIndex ( O, index )

Абстрактная операция IsValidIntegerIndex (Является ли целочисленным индексом) принимает аргументы O и index (Number). При вызове она выполняет следующие шаги:

1. Утверждено: O - экзотический объект с целочисленным индексом.
2. Если IsDetachedBuffer(O.[[ViewedArrayBuffer]]) является true (истинно), вернуть false (ложь).
3. Если ! IsIntegralNumber(index) - false, вернуть false.
4. Если индекс index равен -0𝔽, вернуть false.
5. Если (index) < 0 или (index) ≥ O.[[ArrayLength]], вернуть false.
6. Верните истину true.

 

IntegerIndexedElementGet ( O, index )

Абстрактная операция IntegerIndexedElementGet (Получение целочисленного индексированного элемента) принимает аргументы O и index (Number). При вызове она выполняет следующие шаги:

1. Утверждено: O - экзотический объект с целочисленным индексом.
2. Если ! IsValidIntegerIndex(O, index) имеет значение false, вернуть значение undefined.
3. Пусть смещение offset будет O.[[ByteOffset]].
4. Пусть arrayTypeName будет строковым значением O.[[TypedArrayName]].
5. Пусть elementSize будет значением Размера Элемента (Element Size), указанным в таблице 61 для arrayTypeName.
6. Пусть indexedPosition будет ((index) × elementSize) + offset.
7. Пусть elementType будет значением Типа Элемента (Element Type) в таблице 61 для arrayTypeName.
8. Верните GetValueFromBuffer(O.[[ViewedArrayBuffer]], indexedPosition, elementType, true, Unordered).

 

IntegerIndexedElementSet ( O, index, value )

Абстрактная операция IntegerIndexedElementSet (Установка целочисленного индексированного элемента) принимает аргументы Oindex (Number) и value (значение). При вызове она выполняет следующие шаги:

1. Утверждено: O - экзотический объект с целочисленным индексом.
2. Если O.[[ContentType]] является BigInt, пусть numValue будет ? ToBigInt(value).
3. В противном случае пусть numValue будет ? ToNumber(value).
4. Если ! IsValidIntegerIndex(O, index) является true (истинно), тогда
   а. Пусть смещение offset будет O.[[ByteOffset]].
   b. Пусть arrayTypeName будет строковым значением O.[[TypedArrayName]].
   c. Пусть elementSize будет значением Размера Элемента (Element Size), указанным в таблице 61 для arrayTypeName.
   d. Пусть indexedPosition будет ((index) × elementSize) + offset.
   е. Пусть elementType будет значением Типа Элемента (Element Type) в таблице 61 для arrayTypeName.
   f. Выполните SetValueInBuffer(O.[[ViewedArrayBuffer]], indexedPosition, elementType, numValue, true, Unordered).
5. Вернуть NormalCompletion(undefined).
Примечание

Эта операция всегда кажется успешной, но она не влияет на попытку записи за конец TypedArray или в TypedArray, который поддерживается отсоединенным ArrayBuffer.

 

Информационные ссылки

Предыдущий раздел — Экзотические объекты Аргументов

Стандарт ECMAScript — Раздел «Integer-Indexed Exotic Objects» — https://tc39.es/ecma262/#sec-integer-indexed-exotic-objects