возвращает
>false
.
Получается, что массивы – это разновидность объектов, которые специализируются на хранении последовательностей. Выражение >typeof [1, 2]
вернёт >“object”
. Их можно рассматривать как длинных плоских осьминогов, у которых все щупальца расположены ровным рядом и размечены номерами.
Поэтому журнал Жака можно представить в виде массива объектов:
>var journal = [
> {events: ["работа", "тронул дерево", "пицца", "пробежка", "телевизор"],
> squirrel: false},
> {events: ["работа", "мороженое", "цветная капуста", "лазанья", "тронул дерево", "почистил зубы"],
> squirrel: false},
> {events: ["выходной", "велик", "перерыв", "арахис", "пивасик"],
> squirrel: true},
> /* и так далее... */
>];
Изменчивость (Mutability)
Скоро мы уже и до программирования доберёмся. А пока нам нужно понять последнюю часть теории.
Мы увидели, что значения объекта можно менять. Типы значений, которые мы рассматривали ранее – числа, строки, булевские значения – неизменяемы. Нельзя поменять существующее значение заданного типа. Их можно комбинировать и выводить из них новые значения, но когда вы работаете с некоторым значением строки, это значение остаётся постоянным. Текст внутри строки нельзя поменять. Если у вас есть ссылка на строку >"кошка"
, в коде нельзя поменять в ней символ, чтобы получилось >"мошка"
.
А вот у объектов содержимое можно менять, изменяя значения их свойств.
Если у нас есть два числа, 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 не предусмотрено, но его возможно сделать самостоятельно (это будет одним из упражнений в конце главы).