Какова реальная разница в использовании []
и .
для доступа к свойствам массива или объекта? Какой из них использовать?
Также почему оператор .
допускает свойство index?
Какова реальная разница в использовании []
и .
для доступа к свойствам массива или объекта? Какой из них использовать?
Также почему оператор .
допускает свойство index?
Доступ к членам с .
называется точечной нотации. Доступ к ним с помощью []
называется записью в виде скобок.
Точечная нотация работает только с именами свойств, которые являются действительными имена идентификаторов [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). Поэтому лучшим решением на мой взгляд является избегать использования зарезервированных ключевых слов для имен свойств или использовать нотацию скобки, если вы не можете.
†: Это также причина, по которой вы можете использовать нотацию нот для доступа к элементам массива. Идентификаторы не могут начинаться с цифр и, следовательно, не могут состоять только из цифр.
Вы должны использовать .
, когда знаете имя свойства
var object = {};
object.property = 'whatever';
используйте []
, когда имя свойства содержится в переменной
var object = {};
var property = 'another-property';
object[property] = 'whatever';
Поскольку @DCoder добавлен, некоторые свойства объекта не могут быть доступны без использования нотации []
, поскольку их имена разбивают синтаксис. Например. свойства с именем class
, default
или значениями данных
И почему нет. оператор допускает свойство индекса? я действительно хочу полная причина. Спасибо.
Хорошо, если это возможно, подумайте:
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
};
Оба оператора точечного оператора и индекс (запись в виде скобок) используются для доступа к свойству объекта. Как правило, доступ к оператору с точками довольно быстрый, потому что доступ к переменным по окну значительно медленнее. Но в случае особого характера в переменных, вы не можете использовать оператор точки, поскольку он даст ошибку. Для таких случаев нам нужно использовать оператор индекса и передать имя переменной в виде строкового формата, означающего нижнюю двоеточие, иначе оно даст ошибку 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)