JavaScript - невозможно установить свойство undefined

108

Мой код:

var a = "1",
b = "hello",
c = { "100" : "some important data" },
d = {};

d[a]["greeting"] = b;
d[a]["data"] = c;

console.debug (d);

Я получаю следующую ошибку:

Uncaught TypeError: Невозможно установить для свойства "приветствие" значение undefined.

Я пытаюсь сделать что-то похожее на ассоциативный массив. Почему это не работает?

StackOverflowNewbie
источник
1
d [a] не определено. По сути, d ["1"] не определено
Джозеф Марикл

Ответы:

159

вы никогда не устанавливаете d[a]никакого значения.

Из-за этого d[a]оценивается как undefined, и вы не можете устанавливать свойства undefined.

Если вы добавите d[a] = {}сразу после, d = {}все должно работать, как ожидалось.

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

d[a] = {
    greetings: b,
    data: c
};

Или вы можете установить все свойства dв экземпляре анонимной функции:

d = new function () {
    this[a] = {
        greetings: b,
        data: c
    };
};

Если вы находитесь в среде, которая поддерживает функции ES2015, вы можете использовать вычисляемые имена свойств :

d = {
  [a]: {
    greetings: b,
    data: c
  }
};
zzzzBov
источник
Это действительно работает. шаблон должен быть таким: d = {[a]: {greetings: b, data: c}}
robskrob
@robertjewell, хорошая мысль, я обновился, чтобы включить примечание о нотации ES2015.
zzzzBov
Прекрасное объяснение.
физа хан
32

Вы должны установить d[a]либо ассоциативный массив, либо объект:

  • d[a] = [];
  • d[a] = {};

Без настройки вот что происходит:

d[a] == undefined, так что вы делаете, undefined['greeting']=b;и по определению undefined не имеет свойств. Итак, ошибку вы получили.

vol7ron
источник
arrayили object. JS не имеет ассоциативных массивов, но Objectможет действовать как массив для ограниченного использования.
Джереми Джей Старчер
@JeremyJStarcher: абсолютно правильно и важно знать, но на таком уровне мышления в JavaScript нет массивов; в нем есть только объекты
vol7ron
Не совсем. Есть аспекты ассоциативных массивов, которые не соответствуют объектам Javacript, что может сбить с толку кодеров. (Истинные ассоциированные массивы не ограничиваются требованием, чтобы ключи были строками. Другим важным отличием является наличие унаследованных предопределенных свойств.) С другой стороны, массивы Javascript, в то время как объекты, действуют так, как ожидается от числового массива. Один - аспект функциональности, а другой - внутренняя реализация.
Джереми Джей Старчер
6

Для объекта, хранящегося в d[a], ничего не установлено. Таким образом, d[a]оценивается в undefined. Вы не можете присвоить свойство undefined:). Вам необходимо назначить объект или массив d[a]:

d[a] = [];
d[a]["greeting"] = b;

console.debug(d);
Полярис878
источник
2
Лучше всего назначить объект: d[a] = {};- использование массивов с нечисловыми клавишами приводит к проблемам в дальнейшем.
nnnnnn
5

В javascript почти все является объектом nullи undefinedисключением.

Экземпляры Array- это объект. поэтому вы можете установить свойство массива, по той же причине вы не можете установить свойство undefined, потому что это НЕ объект

Wukong
источник
3

Я бы просто проверил, существует ли d [a], и если не инициализирую его ...

var a = "1",
    b = "hello",
    c = { "100" : "some important data" },
    d = {};

    if (d[a] === undefined) {
        d[a] = {}
    };
    d[a]["greeting"] = b;
    d[a]["data"] = c;

    console.debug (d);
iohzrd
источник