Как работает этот массив объектов JavaScript? - PullRequest
3 голосов
/ 21 октября 2011

Я пытаюсь понять что-то очень простое. Если у меня есть такой объект:

var topics = {}

И я делаю это:

topics[name] = ["chapter 1", "chapter 2", "chapter 3"];

Когда я регистрирую этот объект, я не вижу атрибута имени. Что я на самом деле сделал? Я создал ключ с именем name со значением массива?

Конечно, я знаю, что могу сделать это, просто сделав

topics.name =  ["chapter 1", "chapter 2", "chapter 3"];

Но тогда что это делает?

topics[name] = ["chapter 1", "chapter 2", "chapter 3"];

Может кто-нибудь уточнить, пожалуйста?

Ответы [ 6 ]

3 голосов
/ 21 октября 2011

Это должно привести к ошибке, если у вас нет переменной name, определенной как строка или число.

Эти три эквивалентны:

var name = "key";
topics[name] = "value";

topics["key"] = "value";

topics.key = "value";
3 голосов
/ 21 октября 2011

Когда вы используете нотацию [], она ожидает промежуточное выражение, которое преобразуется в строку.

Использование name без кавычек 'name' предполагает, что вы используете переменную с именем name.

Который в вашем случае undefined.

Правильное использование будет

topics["name"] = ["chapter 1", "chapter 2", "chapter 3"];

Если вы хотите использовать переменную, вы можете сделать что-то вроде

var prop = 'name';
var topics = {};

topics[prop] = ["chapter 1", "chapter 2", "chapter 3"];

это создаст свойство name для объекта .. полезное для динамического / автоматического создания / заполнения объектов ..

3 голосов
/ 21 октября 2011

Вы создаете свойство объекта с именем, основанным на значении переменной name. Если вы хотите создать свойство с именем name таким образом, вам нужно сделать:

topics["name"] = ["chapter 1", "chapter 2", "chapter 3"];
2 голосов
/ 21 октября 2011

Полученную структуру можно увидеть на следующем снимке экрана. Как заявляет mck89, вы, вероятно, захотите использовать синтаксис "name"

enter image description here

2 голосов
/ 21 октября 2011

Обычно существует три способа различения:

topics.name
topics["name"]
topics[name]

Первые два эквивалентны.Таким образом, .xxx представляет буквенный ключ xxx, как и ["xxx"].

Последний будет использовать то, что содержит переменная name.Например:

var name = "test";
topics[name] = 123; // topics["test"] now exists
1 голос
/ 21 октября 2011

Если ваш код не привел к ReferenceError, возможно, вы уже имели переменную в глобальной области действия с именем name и создали новое свойство из содержимого name.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...