ECMAScript | Экзотические объекты Строк

Объект String — это экзотический объект, который инкапсулирует значение String и предоставляет свойства виртуальных целочисленно-индексируемых данных, соответствующие отдельным элементам «единицы кода» (code unit) значения String. Строковые экзотические объекты всегда имеют свойство данных с именем длина — «length«, значение которого представляет собой количество элементов кодовой единицы в инкапсулированном строковом значении. Оба — свойства данных единицы кода и свойство «length» не допускают запись (non-writable) и настройку (non-configurable).

Объект является «экзотическим объектом String» (String exotic object) (или просто объектом String), если его внутренние методы [[GetOwnProperty]], [[DefineOwnProperty]] и [[OwnPropertyKeys]] используют следующие реализации, а его другие важные внутренние методы используют определения, найденные в разделе 10.1. Эти методы установлены в StringCreate.

Строковые экзотические объекты имеют те же внутренние слоты, что и обычные объекты. У них также есть внутренний слот [[StringData]].

[[GetOwnProperty]] ( P )

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

1. Утверждено: IsPropertyKey(P) является true (истинно).
2. Пусть desc будет OrdinaryGetOwnProperty(S, P).
3. Если desc не является undefined, верните desc.
4. Верните ! StringGetOwnProperty(S, P).

 

[[DefineOwnProperty]] ( PDesc )

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

1. Утверждено: IsPropertyKey(P) является true (истинно).
2. Пусть stringDesc будет ! StringGetOwnProperty(S, P).
3. Если stringDesc не является undefined, тогда
   a. Пусть расширяемый extensible будет S.[[Extensible]].
   b. Вернуть ! IsCompatiblePropertyDescriptor(extensible, Desc, stringDesc).
4. Вернуть ! OrdinaryDefineOwnProperty(S, P, Desc).

 

[[OwnPropertyKeys]] ( )

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

1. Пусть ключи keys будут новым пустым Списком.
2. Пусть str будет O.[[StringData]].
3. Утверждено: Тип(str) - String.
4. Пусть len будет длиной str.
5. Для каждого целого числа i, начинающегося с 0, такого, что i < len, в порядке возрастания выполните
   a. Добавить ! ToString(𝔽(i)) как последний элемент ключей keys.
6. Для каждого собственного ключа свойства P из O, такого что P является индексом массива и ! ToIntegerOrInfinity(P) ≥ len, в порядке возрастания числового индекса выполните
   а. Добавить P как последний элемент ключей keys.
7. Для каждого собственного ключа свойства P из O, такого что Type(P) является String, а P не является индексом массива, в возрастающем хронологическом порядке создания свойства выполните
   а. Добавить P как последний элемент ключей keys.
8. Для каждого собственного ключа свойства P из O, такого, что Type(P) является Symbol, в возрастающем хронологическом порядке создания свойства выполните
   а. Добавить P как последний элемент ключей keys.
9. Вернуть ключи keys.

 

StringCreate ( valueprototype )

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

1. Пусть S будет ! MakeBasicObject(« [[Prototype]], [[Extensible]], [[StringData]] »).
2. Установите S.[[Prototype]] на prototype.
3. Установите S.[[StringData]] в value.
4. Установите S.[[GetOwnProperty]], как указано в 10.4.3.1.
5. Установите S.[[DefineOwnProperty]], как указано в 10.4.3.2.
6. Установите S.[[OwnPropertyKeys]], как указано в 10.4.3.3.
7. Пусть длина length будет числом элементов кодовой единицы в значении value.
8. Выполнять ! DefinePropertyOrThrow(S, "length", PropertyDescriptor { [[Value]]: 𝔽(length), [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }).
9. Верните S.

 

StringGetOwnProperty ( SP )

Абстрактная операция StringGetOwnProperty (Получить собственное свойство строки) принимает аргументы S и P. При вызове она выполняет следующие шаги:

1. Утверждено: S - это Объект, у которого есть внутренний слот [[StringData]].
2. Утверждено: IsPropertyKey(P) является true (истинно).
3. Если Тип(P) не является String, вернуть undefined.
4. Пусть index будет ! CanonicalNumericIndexString(P).
5. Если index является undefined, вернуть значение undefined.
6. Если IsIntegralNumber(index) имеет значение false, вернуть значение undefined.
7. Если index равен -0𝔽, вернуть undefined.
8. Пусть str будет S.[[StringData]].
9. Утверждено: Тип(str) - это String.
10. Пусть len будет длиной str.
11. Если (index) < 0 или len(index), вернуть undefined.
12. Пусть resultStr будет значением String длиной 1, содержащим одну кодовую единицу из str, в частности кодовую единицу с индексом (index).
13. Верните дескриптор PropertyDescriptor { [[Value]]: resultStr, [[Writable]]: false, [[Enumerable]]: true, [[Configurable]]: false }.

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

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

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

Поделись записью