Accessing members with
. is called dot notation. Accessing them with
 is called bracket notation.
Bracket notation expects an expression which evaluates to a string (or can be coerced to a string), so you can use any character sequence as property name. There are no limits to what a string can contain.
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 // 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
Use bracket notation:
- When the property name is contained in a variable, e.g.
- The property name contains characters not permitted in identifiers, e.g. starts with a digit†, or contains a space or dash (
Use dot notation: In all other situations.
There is a caveat though regarding reserved keywords. While the specification permits to use them as property names and with the dot notation, not all browsers or tools respect this (notably older IE versions). So the best solution in my opinion is to avoid using reserved keywords for property names or use bracket notation if you cannot.
†: That’s also the reason why you can only use bracket notation to access array elements. Identifiers cannot start with digits, and hence cannot consist only of digits.