JavaScript - nie można ustawić właściwości undefined


108

Mój kod:

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

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

console.debug (d);

Otrzymuję następujący błąd:

Uncaught TypeError: Nie można ustawić właściwości „powitanie” na wartość undefined.

Próbuję zrobić coś podobnego do tablicy asocjacyjnej. Dlaczego to nie działa?


1
d [a] jest niezdefiniowane. W istocie d ["1"] jest nieokreślone
Joseph Marikle

Odpowiedzi:


159

nigdy nie ustawiasz d[a]żadnej wartości.

Z tego powodu d[a]szacuje się na undefinedi nie można ustawić właściwości undefined.

Jeśli dodasz d[a] = {}zaraz po tym, d = {}wszystko powinno działać zgodnie z oczekiwaniami.

Alternatywnie możesz użyć inicjatora obiektu:

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

Lub możesz ustawić wszystkie właściwości dw instancji funkcji anonimowej:

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

Jeśli pracujesz w środowisku obsługującym funkcje ES2015, możesz użyć obliczonych nazw właściwości :

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

To działa. wzór powinien wyglądać następująco: d = {[a]: {pozdrowienia: b, dane: c}}
robskrob

@robertjewell, dobra uwaga, zaktualizowałem, dodając notatkę o notacji ES2015.
zzzzBov

Niesamowite wyjaśnienie.
fiza khan

32

Musisz ustawić d[a]tablicę asocjacyjną lub obiekt:

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

Bez ustawiania dzieje się tak:

d[a] == undefinedwięc robisz undefined['greeting']=b;iz definicji undefined nie ma właściwości. Tak więc otrzymany błąd.


arraylub object. JS nie ma tablic asocjacyjnych, chociaż Objectmoże działać jak jedna do ograniczonych zastosowań.
Jeremy J Starcher

@JeremyJStarcher: absolutnie poprawne i ważne, aby wiedzieć, ale na tym poziomie myślenia JavaScript nie ma tablic; ma tylko obiekty
vol7ron

Nie dokładnie. Istnieją aspekty tablic asocjacyjnych, które nie są prawdziwe w przypadku obiektów Javacript, które mogą spowodować błąd programistów. (Rzeczywiste tablice skojarzone nie są ograniczone przez wymaganie, aby klucze były ciągami. Obecność dziedziczonych, predefiniowanych właściwości jest kolejną istotną różnicą.) Z drugiej strony, tablice JavaScript, podczas gdy obiekty, zachowują się tak, jakby się zachowywały tablice numeryczne. Jeden to aspekt funkcjonalności, a drugi to implementacja wewnętrzna.
Jeremy J Starcher,

6

Obiekt przechowywany w d[a]nie został ustawiony na nic. W ten sposób d[a]szacuje do undefined. Nie możesz przypisać właściwości do undefined:). Musisz przypisać obiekt lub tablicę do d[a]:

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

console.debug(d);

2
Najlepiej przypisać obiekt: d[a] = {};- używanie tablic z klawiszami nienumerycznymi zwykle prowadzi do problemów.
nnnnnn

5

W javascript prawie wszystko jest obiektem nulli undefinedjest wyjątkiem.

Wystąpienia Arrayjest obiektem. więc możesz ustawić właściwość tablicy, z tego samego powodu nie możesz ustawić właściwości niezdefiniowanej, ponieważ NIE jest to obiekt


3

po prostu sprawdzę, czy d [a] istnieje, a jeśli nie, zainicjuj go ...

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);
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.