awesome-everything EN
↑ Обратно к восхождению

Базовый CS с нуля

Variables and state: чтение кода

Суть Читай короткие сниппеты TypeScript — aliasing, копирование vs reference, scope shadowing и swap — и предсказывай, какое значение держит каждая переменная и почему.
Высота — путь к senior
НольJuniorMiddleSenior
Ты на middle-высоте — в небе
◷ 14 min

Быстрее всего проверить, уложилась ли модель памяти, — протрассировать реальный код вручную. Для каждого сниппета следи за ячейками: где значение, где reference, к какому binding разрешается имя и какие записи — это mutation общего объекта. Предскажи вывод, прежде чем смотреть варианты.

Цель

Потренируйся трассировать, что держит каждая переменная после каждой строки — отличая скопированный примитив от разделяемого reference, внутренний binding от внешнего и mutation на месте от свежего выделения памяти.

Сниппет 1 — общий объект

const original = { count: 0 };
const copy = original;       // присваивает reference, а не объект
copy.count = 5;              // mutation через copy
console.log(original.count); // ?
Викторина

Что выведет последняя строка и почему?

Сниппет 2 — примитив и объект рядом

let n = 10;
let m = n;          // копирует значение 10
m = m + 1;          // меняет собственную ячейку m

let p = { v: 10 };
let q = p;          // копирует reference
q.v = q.v + 1;      // мутирует общий объект

console.log(n, q === p, p.v); // ?
Викторина

Что будет выведено?

Сниппет 3 — scope shadowing

let x = 1;
{
  let x = 2;        // новый binding во внутреннем блоке
  x = x + 10;       // пишет в ячейку внутреннего x
  console.log(x);   // внутренний
}
console.log(x);     // внешний
Викторина

Что выведут две строки console.log, по порядку?

Сниппет 4 — swap

let a = 1;
let b = 2;
a = b;
b = a;
console.log(a, b);  // ?
Викторина

Что будет выведено и какой фикс, если задумывался обмен a и b?

Итог

Трассировка вручную — это и есть навык: скопированный примитив (m, n) живёт в своей ячейке и игнорирует изменения другого; скопированный reference (p, q) делает оба имени алиасами одного объекта, поэтому mutation распространяется и === — true; внутренний ‘let’ создаёт новый binding, который затеняет внешнее имя, не трогая его ячейку; а наивный ‘a = b; b = a’ проваливается, потому что каждый assignment — разрушающая перезапись, поэтому реальный swap требует временную. Следи за ячейками — и ответ никогда не будет сюрпризом.

Продолжить восхождение ↑Variables and state: построй state-контейнер
хоткеи развернуть
поиск
K
пред. пьеса
k
след. пьеса
j
тиры
t
это меню
?
sources2
expand
  1. 01
  2. 02

Trademarks belong to their respective owners. Editorial reference only.