Объект String — это экзотический объект, который инкапсулирует значение String и предоставляет свойства виртуальных целочисленно-индексируемых данных, соответствующие отдельным элементам «единицы кода» (code unit) значения String. Строковые экзотические объекты всегда имеют свойство данных с именем длина — «length«, значение которого представляет собой количество элементов кодовой единицы в инкапсулированном строковом значении. Оба — свойства данных единицы кода и свойство «length» не допускают запись (non-writable) и настройку (non-configurable).
Объект является «экзотическим объектом String» (String exotic object) (или просто объектом String), если его внутренние методы [[GetOwnProperty]], [[DefineOwnProperty]] и [[OwnPropertyKeys]] используют следующие реализации, а его другие важные внутренние методы используют определения, найденные в разделе 10.1. Эти методы установлены в StringCreate.
Строковые экзотические объекты имеют те же внутренние слоты, что и обычные объекты. У них также есть внутренний слот [[StringData]].
- 10.4.3.1 [[GetOwnProperty]] ( P )
- 10.4.3.2 [[DefineOwnProperty]] ( P, Desc )
- 10.4.3.3 [[OwnPropertyKeys]] ( )
- 10.4.3.4 StringCreate ( value, prototype )
- 10.4.3.5 StringGetOwnProperty ( S, P )
[[GetOwnProperty]] ( P )
Внутренний метод [[GetOwnProperty]] экзотического объекта String — S принимает аргумент P (ключ свойства). При вызове он выполняет следующие шаги:
1. Утверждено: IsPropertyKey(P) является true (истинно). 2. Пусть desc будет OrdinaryGetOwnProperty(S, P). 3. Если desc не является undefined, верните desc. 4. Верните ! StringGetOwnProperty(S, P).
[[DefineOwnProperty]] ( P, Desc )
Внутренний метод [[DefineOwnProperty]] экзотического объекта String — S принимает аргументы 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]] экзотического объекта String — O не принимает аргументов. При вызове он выполняет следующие шаги:
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 ( value, prototype )
Абстрактная операция 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 ( S, P )
Абстрактная операция 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