Выразительный JavaScript | страница 38



Скоро мы уже и до программирования доберёмся. А пока нам нужно понять последнюю часть теории.

Мы увидели, что значения объекта можно менять. Типы значений, которые мы рассматривали ранее – числа, строки, булевские значения – неизменяемы. Нельзя поменять существующее значение заданного типа. Их можно комбинировать и выводить из них новые значения, но когда вы работаете с некоторым значением строки, это значение остаётся постоянным. Текст внутри строки нельзя поменять. Если у вас есть ссылка на строку >"кошка", в коде нельзя поменять в ней символ, чтобы получилось >"мошка".

А вот у объектов содержимое можно менять, изменяя значения их свойств.

Если у нас есть два числа, 120 и 120, мы можем рассматривать их как одно и то же, независимо от того, хранятся ли они в памяти в одном и том же месте. Но когда мы имеем дело с объектами, есть разница, есть ли у нас две ссылки на один объект или же у нас есть два разных объекта, содержащих одинаковые свойства. Рассмотрим пример:

>var object1 = {value: 10};

>var object2 = object1;

>var object3 = {value: 10};


>console.log(object1 == object2);

>// → true

>console.log(object1 == object3);

>// → false


>object1.value = 15;

>console.log(object2.value);

>// → 15

>console.log(object3.value);

>// → 10

Переменные >object1 и >object2 держатся за один и тот же объект, поэтому изменения >object1 приводят к изменениям в >object2. Переменная >object3 показывает на другой объект, который изначально содержит те же свойства, что и >object1, но живёт своей собственной жизнью.

Оператор >== при сравнении объектов возвращает >true только, если сравниваемые объекты – это одна и та же переменная. Сравнение разных объектов вернёт >false, даже если у них идентичное содержимое. Оператора «глубокого» сравнения, который бы сравнивал содержимое объектов, в JavaScript не предусмотрено, но его возможно сделать самостоятельно (это будет одним из упражнений в конце главы).

Журнал оборотня

Итак, Жак запускает свой любимый интерпретатор JavaScript и создаёт окружение, необходимое для хранения журнала.

>var journal = [];


>function addEntry(events, didITurnIntoASquirrel) {

>  journal.push({

>    events: events,

>    squirrel: didITurnIntoASquirrel

>  });

>}

Каждый вечер, часов в десять – а иногда и назавтра утром, спускаясь с верхней полки шкафа – он записывает свой день.

>addEntry(["работа", "тронул дерево", "пицца", "пробежка", "телевизор"], false);

>addEntry(["работа", "мороженое", "цветная капуста", "лазанья", "тронул дерево", "почистил зубы"], false);