JavaScript. Подробное руководство, 6-е издание, стр. 63
<b>var title = book["main title"] // Получить свойство "main title" объекта book.</b>Чтобы создать новое свойство или изменить значение существующего свойства, также используются операторы точки и квадратные скобки, как в операциях чтения значений свойств, но само выражение помещается уже слева от оператора присваивания:
<b>book.edition = 6; // Создать свойство "edition" объекта book.</b><b>book["main title"] = "ECMAScript"; // Изменить значение свойства "main title".</b>В ECMAScript 3 идентификатор, следующий за точкой, не может быть зарезервированным словом: нельзя записать обращение к свойству
<b>о.for</b><b>о.class</b><b>for</b><b>class</b><b>o["for"]</b><b>o["class"].</b>Выше уже говорилось, что при использовании формы записи с квадратными скобками выражение в скобках должно возвращать строку. Если быть более точными, это выражение должно возвращать строку или значение, которое может быть преобразовано в строку. В главе 7, например, мы увидим распространенный прием использования чисел в квадратных скобках.
6.2.1. Объекты как ассоциативные массивы
Как отмечалось выше, следующие два выражения возвращают одно и то же значение:
<b>object.property</b><b>object["property"]</b>Первая форма записи, с использованием точки и идентификатора, напоминает синтаксис доступа к статическому полю структуры или объекта в языке С или Java. Вторая форма записи, с использованием квадратных скобок и строки, выглядит как обращение к элементу массива, но массива, который индексируется строками, а не числами. Такого рода массивы называются ассоциативными массивами (а также хешами и словарями). Объекты в языке JavaScript являются ассоциативными массивами, и в этом разделе объясняется, почему это так важно.
В С, C++, Java и других языках программирования со строгим контролем типов объект может иметь только фиксированное число свойств, а имена этих свойств должны определяться заранее. Поскольку JavaScript относится к языкам программирования со слабым контролем типов, данное правило в нем не действует: программы могут создавать любое количество свойств в любых объектах. Однако при использовании для обращения к свойству оператора точка (
<b>.</b>Напротив, когда для обращения к свойствам объекта используется форма записи с квадратными скобками (
<b>[]</b><b>var addr = "";</b><b>for(i =0; і < 4; і++)</b><b> addr += customer["address" + і] + ‘\n';</b>Этот фрагмент читает и объединяет в одну строку значения свойств address0, address1, address2 и address3 объекта customer.
Этот короткий пример демонстрирует гибкость использования формы записи с квадратными скобками и строковыми выражениями для доступа к свойствам объекта. Пример выше можно переписать с использованием оператора точки, но иногда встречаются случаи, когда доступ к свойствам можно организовать только с помощью формы записи с квадратными скобками. Представим, например, что необходимо написать программу, использующую сетевые ресурсы для вычисления текущего значения инвестиций пользователя в акции. Программа должна позволять пользователю вводить имя каждой компании, акциями которой он владеет, а также количество акций каждой компании. Для хранения этих данных можно было бы создать объект с именем
<b>portfolio</b><b>portfolio.ibm</b>Следующая функция, добавляющая информацию об очередном пакете акций, могла бы быть частью такой программы:
<b>function addstock(portfolio, stockname, shares) {</b><b> portfolio[stockname] = shares;</b><b>}</b>Поскольку пользователь вводит имена компаний во время выполнения, нет никакого способа заранее определить эти имена. А так как на момент создания программы имена свойств нам неизвестны, мы не можем использовать оператор точки (
<b>.</b><b>portfolio</b><b>[]</b>В главе 5 был представлен цикл
<b>for/in</b><b>portfolio</b><b>function getvalue(portfolio) {</b><b> var total = 0.0;</b><b> for(stock in portfolio) { // Для каждой компании в portfolio:</b>