Базовый CS с нуля
Variables and state: тест с выбором ответа
Шесть вопросов поперёк всего юнита. Каждый — это решение о том, что реально лежит в ячейке: значение или reference, и что меняется при assignment или mutation. Разберись с моделью памяти — и баги aliasing перестанут быть сюрпризом.
Убедись, что связываешь четыре идеи юнита: variable — это имя, привязанное (binding) к ячейке; assignment перезаписывает эту ячейку; mutation меняет состояние на месте; примитивы копируются, а объекты разделяются по reference.
После 'let score = 0' программа выполняет 'score = 42'. Что изменилось в памяти?
Почему читать '=' как «равно» — ловушка, и как читать вместо этого?
Баг-репорт: «Я изменил obj2, а obj1 мутировал сам по себе.» В коде было 'let obj2 = obj1'. Что произошло на самом деле?
'const user = { name: "A" }; user.name = "B";' выполняется без ошибки. Но 'const x = 1; x = 2;' падает. Почему?
'let a = [1,2]; let b = a; b.push(3);' — затем код в другом месте читает a.length, ожидая 2. Почему он видит 3?
В чём разница между «состоянием» программы и «мутациями» (mutation), которые его породили?
Сквозная линия: variable — это имя, привязанное (binding) к ячейке, и имя и значение — разные вещи. Assignment — разрушающая запись, «получает», а не «равно». Mutation меняет ячейку на месте, а состояние — это снимок всех текущих содержимых ячеек. Решающее различие — что лежит в ячейке: примитивное значение (копируется при assignment, поэтому изменения не распространяются) или reference на объект кучи (копируется как адрес, создавая алиасы, где одна mutation видна через каждое имя). const запечатывает, какой reference держит ячейка, но никогда — содержимое за ним.