Поведение vs данные в JavaScript
Ключевая идея авторского курса AsForJS: в JavaScript нет «данных» в привычном смысле. Каждый литерал, оператор и идентификатор — это команда, запускающая алгоритм из спецификации ECMAScript. Объект — это поведение, а не структура.
«Язык JavaScript описывает поведение — алгоритм выполнения какой-либо задачи. Я раньше использовал термин «интерпретация», но отказался: лучший термин — поведение» — автор, JavaScript Part 4.
Литерал — это команда, а не данные
'ABC';
Это не определение строки. Это команда, вызывающая внутренний алгоритм спецификации, который возвращает ссылку на структуру 'ABC'.
'ABC'[2]; // 'C'
Это не доступ к памяти по смещению 2. Это последовательность операций:
- Команда
'ABC'запускает алгоритм, возвращает ссылку. - Оператор
[2]запускает другой алгоритм ([[Get]]по ключу'2'). - Алгоритм идёт по цепочке делегирования: сначала собственные свойства, потом
String.prototype.
Доказательство: переопределение цепочки
String.prototype[3] = 'Hello World';
console.log('ABC'[3]); // 'Hello World' — не undefined!
- У строки
'ABC'нет свойства'3' [[Get]]идёт вString.prototype- Там мы только что положили
'Hello World'
Это было бы невозможно, если бы 'ABC'[3] было прямым доступом к памяти. Но это алгоритм поведения, и алгоритм дошёл до прототипа.
Аналогия Васи с записной книжкой
«Удаление Васи из контактов смартфона не уничтожило самого Васю. Изменилось только наше поведение. Весь JS — набор таких паттернов поведения. Данные где-то существуют сами по себе.»
В JS «данные» — это иллюзия, формируемая поведением. На каждое чтение и запись агент (V8) выполняет внутренний алгоритм.
Это не контекст исполнения
«Люди из других языков часто называют
thisконтекстом исполнения. Это неправильно. В Javathis— действительно execution context. В JavaScriptthis— нечто другое, а execution context описан в спецификации отдельно.»
В JS execution context — это запись с LexicalEnvironment, VariableEnvironment, Realm, Function и т.д. this — лишь одно из его полей.
Statement vs Expression vs Operator
В терминологии спецификации:
- Expression — подмножество множества Statement. Возвращает значение.
- Statement — всё множество операций языка (
if,for,try, объявление...). - Operator — отдельная категория, но НЕ синоним statement в спецификации.
Перевод statement = «оператор» в учебниках некорректен.
Что это значит на практике
- Прототипы — не магия, а алгоритм. Каждое обращение к свойству —
OrdinaryGetс обходом цепочки. - Производительность = сколько шагов алгоритма выполнил движок. Inline-кэш сокращает алгоритм, deopt — удлиняет.
- Proxy — единственный честный способ изменить поведение, потому что он переопределяет именно эти алгоритмы.
for-in,Object.keys(),Reflect.ownKeysведут себя по-разному, потому что используют разные internal methods.
Связь с три кита курса AsForJS
- Встраиваемость — JS не запускается сам, всегда нужна host-среда (HTML5, Node.js, Deno).
- Delegation chain — все цепочки в языке устроены одинаково (см. Delegation Chain).
- Поведение — нет данных, только алгоритмы; каждый литерал — команда.
«Понимая эти три темы, можно понять весь язык» — автор.
Источники
- AsForJS · JavaScript курс. Part 1 Hello World (2026-03-02) — встраиваемость
- AsForJS · JavaScript курс. Part 2 Встраиваемость (2026-04-16)
- AsForJS · JavaScript курс. Part 3 Delegation Chain (2026-04-19)
- AsForJS · JavaScript курс. Part 4: Поведение (2026-05-18, 323 мин) — основной
- AsForJS · Что такое Object в JavaScript согласно официальной спецификации (2025-02-03)