JavaScript - не можна встановити властивість невизначеного


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: Неможливо встановити властивість "привітання" для невизначеного.

Я намагаюся зробити щось подібне до асоціативного масиву. Чому це не працює?


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
  }
};

Це справді працює. шаблон повинен бути: d = {[a]: {привітання: b, дані: c}}
robskrob

@robertjewell, добре, я оновив, щоб включити примітку про позначення ES2015.
zzzzBov

Дивовижне пояснення.
фіза-хан

32

Ви повинні встановити d[a]або асоціативний масив, або об’єкт:

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

Без налаштування, ось що відбувається:

d[a] == undefined, тож ви робите, undefined['greeting']=b;і за визначенням, невизначений не має властивостей. Таким чином, помилка, яку ви отримали.


arrayабо object. JS не має асоціативних масивів, хоча Objectдля обмеженого використання може діяти як один.
Jeremy J Starcher

@JeremyJStarcher: абсолютно правильно і важливо знати, але за таким рівнем мислення JavaScript не має масивів; у неї є лише об'єкти
vol7ron

Не зовсім. Існують аспекти асоціативних масивів, які не відповідають дійсності щодо об'єктів Javacript, які можуть відключати кодери. (Справжній асоційований масив не обмежений тим, що вимагати, щоб ключі були рядками. Наявність успадкованих заздалегідь визначених властивостей - ще одна основна відмінність.) З іншого боку, масиви Javascript, в той час як об'єкти діють як один, очікує, що чисельний масив поводиться. Один є аспектом функціональності, а інший - внутрішньою реалізацією.
Джеремі Дж Старчер

6

Об'єкт, що зберігається в d[a], не встановлений для нічого. Таким чином, d[a]оцінює до undefined. Ви не можете призначити властивість undefined:). Вам потрібно призначити об’єкт або масив d[a]:

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

console.debug(d);

2
Найкраще призначити об’єкт: d[a] = {};- використання масивів з нечисловими клавішами, як правило, призводить до проблем вниз по лінії.
nnnnnn

5

У javascript майже все є об'єктом nullі undefinedє винятком.

Екземпляри Array- це об'єкт. тож ви можете встановити властивість масиву, з тієї ж причини ви не можете встановити властивість невизначеного, оскільки його НЕ є об'єктом


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);
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.