Выразительный JavaScript (Хавербеке) - страница 35

Переменные типа object (объект) – коллекции произвольных свойств, и мы можем добавлять и удалять свойства объекта по желанию. Один из способов создать объект – использовать фигурные скобки:

>var day1 = {

>  squirrel: false,

>  events: ["работа", "тронул дерево", "пицца", "пробежка", "телевизор"]

>};

>console.log(day1.squirrel);

>// → false

>console.log(day1.wolf);

>// → undefined

>day1.wolf = false;

>console.log(day1.wolf);

>// → false

В скобках мы можем задать список свойств, разделённых запятыми. Записывается каждое свойство как имя, после которого идёт двоеточие, затем идёт выражение, которое и является значением свойства. Пробелы и переносы строк не учитываются. Разбивая запись свойств объекта на несколько строк, вы улучшаете читаемость кода. Если имя свойства не является допустимым именем переменной, его нужно заключать в кавычки:

>var descriptions = {

>  work: "Пошёл на работу",

>  "тронул дерево": "Дотронулся до дерева"

>};

Получается, у фигурных скобок в JavaScript два значения. Употреблённые в начале инструкции, они начинают новый блок инструкций. В любом другом месте они описывают объект. Обычно нет смысла начинать инструкцию с описания объекта, и поэтому в программах обычно нет двусмысленностей по поводу этих двух применений фигурных скобок.

Если вы попытаетесь прочесть значение несуществующего свойства, вы получите >undefined – как в примере, когда мы первый раз попробовали прочесть свойство >wolf.

Свойству можно назначать значение через оператор >=. Если у него ранее было значение, оно будет заменено. Если свойство отсутствовало, оно будет создано.

Возвращаясь к нашей модели со щупальцами и переменными, мы видим, что свойства тоже похожи на них. Они хватают значения, но на эти же значения могут ссылаться другие переменные и свойства. Объекты – это осьминоги с произвольным количеством щупалец, на каждом из которых написано имя свойства.



Оператор >delete отрезает щупальце. Это унарный оператор, применяемый к выражению доступа к свойству. Это делается редко, но вполне возможно.

>var anObject = {left: 1, right: 2};

>console.log(anObject.left);

>// → 1

>delete anObject.left;

>console.log(anObject.left);

>// → undefined

>console.log("left" in anObject);

>// → false

>console.log("right" in anObject);

>// → true

Бинарный оператор >in принимает строку и имя объекта, и возвращает булевское значение, показывающее, есть ли у объекта свойство с таким именем. Есть разница между установкой значения свойства в >undefined и удалением свойства. В первом случае свойство сохраняется у объекта, просто оно пустое. Во втором – свойства больше нет, и тогда