Ответ 1
Доступ к членам с .
называется точечной нотации. Доступ к ним с помощью []
называется записью в виде скобок.
Точечная нотация работает только с именами свойств, которые являются действительными имена идентификаторов [spec], поэтому в основном любое имя, которое также было бы допустимым именем переменной (допустимым идентификатором, см. также Какие символы действительны для имен переменных JavaScript?) и любое зарезервированное ключевое слово [spec].
Обозначение скобок ожидает выражения, которое оценивает строку (или может быть принудительно привязано к строке), поэтому вы можете использовать любую последовательность символов в качестве имени свойства. Нет ограничений на то, что может содержать строка.
Примеры:
obj.foo; // valid
obj.else // valid, reserved keywords are valid identifier names
obj.42 // invalid, identifier names cannot start with numbers
obj.3foo // invalid, ""
obj.foo-bar // invalid, `-` is not allowed in identifier names
obj[42] // valid, 42 will be coerced to "42"
obj["--"] // valid, any character sequence is allowed
obj[bar] // valid, will evaluate the variable `bar` and
// use its value as property name
Использовать обозначения скобок:
- Когда имя свойства содержится в переменной, например.
obj[foo]
. - Имя свойства содержит символы, не разрешенные в идентификаторах, например. начинается с цифры † или содержит пробел или тире (
-
), например.obj["my property"]
.
Использовать точечную нотацию: Во всех других ситуациях.
Существует caveat, хотя в отношении зарезервированных ключевых слов. Хотя спецификация позволяет использовать их в качестве имен свойств и с точечной нотацией, не все браузеры или инструменты уважают это (особенно старые версии IE). Поэтому лучшим решением на мой взгляд является избегать использования зарезервированных ключевых слов для имен свойств или использовать нотацию скобки, если вы не можете.
†: Это также причина, по которой вы можете использовать нотацию нот для доступа к элементам массива. Идентификаторы не могут начинаться с цифр и, следовательно, не могут состоять только из цифр.