TGViewer
As For JS As For JS @asforjavascript · 3.08K subscribers
Post #929 2.41K
Это ответ вот на эту "загадку" про Object String или задача с двумя подводными камнями.

1. Object String согласно спецификации - это экзотический обьект. Что означает, что поведение этого обьекта, хотя-бы в одном из 12 стандартных поведений обьекта переопределено.

Одно из таких поведений как раз касается поведения в случае поиска данных которых связаны с ключами из множества indexed property. (Если не до конца корректно и максимально доходчиво то это множество числовыми ключей из диапазона 0 - 2^32 - 1. Некорректно потому - что в JS не существует числовых ключей у Object. Только ключи типа String и Symbol)

Это поведение, возвращает substring string.

Что это означает:
Если отвечать на вопрос строго формально, то с точки зрения спецификации, при создании Object String под каждый ключ, не создается отдальная строка. Геттер это делает только тогда, когда произошел запрос по конкретному индексу.

При этом, тот самый геттер, возвращает именно строку - то есть формально ее создает.

В результате первый подводный камень - до тех пор пока, не было обращения по конкретному индексу, спецификация не требует создания отдельной строки на каждый символ (Code Unit)

В то же время при обращении по индексу, такая строка должна быть создана.
Как следствие, попытка вызова любого console.dir, так как он показывает все что связано с каждым индексом, формально обязан создать все строки - так как должен обратиться к каждому геттеру.

То есть создать три строки: 'a', 'b', 'c'


Это все еще не все
Все что сказано Выше касается спецификации. А что в реальности V8?
В реальности V8, уже существуют описания для символов из диапазона US ASCII .
То есть при обращению к строке вида:
var theStr = `abc`;
var theFirst = theStr[0];

ничего страшного не случится, потому что обьект описывающий US ASCII - "a" уже заранее создан. И мы всего лишь свяжем идентификатор с ссылкой окторая давно создана.

То есть даже в случае
var theStr = `abc`;
console.dir( theStr );

ничего страшного не будет, так как для US ASCII a, b, c - все обьекты созданы еще на старте V8.

И проблемы могут начаться только там, где внутри V8, на момент старта не создано заранее готовых обьектов для Code Unitov используемых в строке.

Например кирилицы.
Telegram As For JS Задача для тех кому нечем заняться. Object String или задача с двумя подводными камнями. Оценим обьект, который создан при помощи конструктора String. Воспользуемся для этого любым доступным инструментом: console.dir( new String("abc") ); развернув сформированный…
  • ❤ 12
  • 👍 1
More from @asforjavascript
  1. Oct 9, 2026Какие несоответствия тексту песни, вы видите в клипе? Я нашел пока три. https://www.youtub…
  2. Oct 9, 2026Пусть повисит до утра. Потом удалю https://www.youtube.com/watch?v=qVs4a7K42eE&
  3. Oct 9, 2026Первое видео, где автор пытался седелать его так, чтобы все подумали на ИИ
  4. Oct 9, 2026ErrorHorror снова, пусть и не навсегда, но с нами. Єто особенно приятно констатировать в п…
  5. Oct 9, 2026(c) Деми Мурывович Мяковскый Послушайте! Ведь, если using добавляют - значит - это кому-ни…
  6. Oct 8, 2026https://www.youtube.com/watch?v=ItxfZCmdaSI&list=OLAK5uy_lVqIIi_ibuhCtw6SMTo6bUpeJ6iyVXGuM…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →