Поведение vs данные в JavaScript

Ключевая идея авторского курса AsForJS: в JavaScript нет «данных» в привычном смысле. Каждый литерал, оператор и идентификатор — это команда, запускающая алгоритм из спецификации ECMAScript. Объект — это поведение, а не структура.

«Язык JavaScript описывает поведение — алгоритм выполнения какой-либо задачи. Я раньше использовал термин «интерпретация», но отказался: лучший термин — поведение» — автор, JavaScript Part 4.

Литерал — это команда, а не данные

'ABC';

Это не определение строки. Это команда, вызывающая внутренний алгоритм спецификации, который возвращает ссылку на структуру 'ABC'.

'ABC'[2]; // 'C'

Это не доступ к памяти по смещению 2. Это последовательность операций:

  1. Команда 'ABC' запускает алгоритм, возвращает ссылку.
  2. Оператор [2] запускает другой алгоритм ([[Get]] по ключу '2').
  3. Алгоритм идёт по цепочке делегирования: сначала собственные свойства, потом 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 контекстом исполнения. Это неправильно. В Java this — действительно execution context. В JavaScript this — нечто другое, а execution context описан в спецификации отдельно.»

В JS execution context — это запись с LexicalEnvironment, VariableEnvironment, Realm, Function и т.д. this — лишь одно из его полей.

Statement vs Expression vs Operator

В терминологии спецификации:

  • Expression — подмножество множества Statement. Возвращает значение.
  • Statement — всё множество операций языка (if, for, try, объявление...).
  • Operator — отдельная категория, но НЕ синоним statement в спецификации.

Перевод statement = «оператор» в учебниках некорректен.

Что это значит на практике

  1. Прототипы — не магия, а алгоритм. Каждое обращение к свойству — OrdinaryGet с обходом цепочки.
  2. Производительность = сколько шагов алгоритма выполнил движок. Inline-кэш сокращает алгоритм, deopt — удлиняет.
  3. Proxy — единственный честный способ изменить поведение, потому что он переопределяет именно эти алгоритмы.
  4. for-in, Object.keys(), Reflect.ownKeys ведут себя по-разному, потому что используют разные internal methods.

Связь с три кита курса AsForJS

  1. Встраиваемость — JS не запускается сам, всегда нужна host-среда (HTML5, Node.js, Deno).
  2. Delegation chain — все цепочки в языке устроены одинаково (см. Delegation Chain).
  3. Поведение — нет данных, только алгоритмы; каждый литерал — команда.

«Понимая эти три темы, можно понять весь язык» — автор.

Источники

Связанные темы