Разница между использованием скобки (`[]`) и точечной (`.`) нотации

Какова реальная разница в использовании [] и . для доступа к свойствам массива или объекта? Какой из них использовать?

Также почему оператор . допускает свойство index?

Ответы

Ответ 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). Поэтому лучшим решением на мой взгляд является избегать использования зарезервированных ключевых слов для имен свойств или использовать нотацию скобки, если вы не можете.


†: Это также причина, по которой вы можете использовать нотацию нот для доступа к элементам массива. Идентификаторы не могут начинаться с цифр и, следовательно, не могут состоять только из цифр.

Ответ 2

Вы должны использовать ., когда знаете имя свойства

var object = {};
object.property = 'whatever';

используйте [], когда имя свойства содержится в переменной

var object = {};
var property = 'another-property';
object[property] = 'whatever';

Поскольку @DCoder добавлен, некоторые свойства объекта не могут быть доступны без использования нотации [], поскольку их имена разбивают синтаксис. Например. свойства с именем class, default или значениями данных

Ответ 3

И почему нет. оператор допускает свойство индекса? я действительно хочу полная причина. Спасибо.

Хорошо, если это возможно, подумайте:

var a = 0.5;

Вы имели в виду номер 0.5 или доступ к элементу 5 номера? См:

Number.prototype[5] = 3;

0[5] //3
0.5 // 0.5

Если вы позволили синтаксису 0.5 равняться 0[5], то откуда вы знаете, что вы имеете в виду?

Однако можно использовать числа непосредственно с литералом объекта:

var a = {
    0: 3,
    1: 5
};

Ответ 4

Оба оператора точечного оператора и индекс (запись в виде скобок) используются для доступа к свойству объекта. Как правило, доступ к оператору с точками довольно быстрый, потому что доступ к переменным по окну значительно медленнее. Но в случае особого характера в переменных, вы не можете использовать оператор точки, поскольку он даст ошибку. Для таких случаев нам нужно использовать оператор индекса и передать имя переменной в виде строкового формата, означающего нижнюю двоеточие, иначе оно даст ошибку undefined. например,

var abc = {
    font-size : "12px"
} 
Using dot operator - abc.font-size;           //it will give error (Incorrect)
Using index operator - abc["font-size"];      //12px (Correct)