Экзотический объект с целочисленным индексом — это экзотический объект, который выполняет специальную обработку ключей свойств целочисленного индекса.
Экзотические объекты с целочисленным индексом имеют те же внутренние слоты, что и обычные объекты, а также внутренние слоты [[ViewedArrayBuffer]], [[ArrayLength]], [[ByteOffset]], [[ContentType]] и [[TypedArrayName]].
Объект является «экзотическим объектом с целочисленным индексом» (Integer-Indexed exotic object), если его [[GetOwnProperty]], [[HasProperty]], [[DefineOwnProperty]], [[Get]], [[Set]], [[Delete]] и [[ OwnPropertyKeys]] внутренние методы используют определения из этого раздела, а другие важные внутренние методы используют определения из 10.1. Эти методы устанавливаются IntegerIndexedObjectCreate.
- 10.4.5.1 [[GetOwnProperty]] ( P )
- 10.4.5.2 [[HasProperty]] ( P )
- 10.4.5.3 [[DefineOwnProperty]] ( P, Desc )
- 10.4.5.4 [[Get]] ( P, Receiver )
- 10.4.5.5 [[Set]] ( P, V, Receiver )
- 10.4.5.6 [[Delete]] ( P )
- 10.4.5.7 [[OwnPropertyKeys]] ( )
- 10.4.5.8 IntegerIndexedObjectCreate ( prototype )
- 10.4.5.9 IsValidIntegerIndex ( O, index )
- 10.4.5.10 IntegerIndexedElementGet ( O, index )
- 10.4.5.11 IntegerIndexedElementSet ( O, index, value )
[[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 (Установка целочисленного индексированного элемента) принимает аргументы O, index (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