JavaScript - kann die Eigenschaft undefined nicht festlegen

108

Mein Code:

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

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

console.debug (d);

Ich erhalte folgende Fehlermeldung:

Nicht erfasster TypeError: Die Eigenschaft 'Begrüßung' von undefined kann nicht festgelegt werden.

Ich versuche, etwas Ähnliches wie ein assoziatives Array zu tun. Warum funktioniert das nicht?

StackOverflowNewbie
quelle
1
d [a] ist undefiniert. Im Wesentlichen ist d ["1"] undefiniert
Joseph Marikle

Antworten:

159

du hast nie gesetzt d[a] einen Wert festgelegt.

Aus diesem Grund wird d[a]ausgewertet undefinedund Sie können keine Eigenschaften festlegen undefined.

Wenn Sie d[a] = {}direkt nach dem Hinzufügen hinzufügen, d = {}sollten die Dinge wie erwartet funktionieren.

Alternativ können Sie einen Objektinitialisierer verwenden:

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

Oder Sie können alle Eigenschaften deiner anonymen Funktionsinstanz festlegen :

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

Wenn Sie sich in einer Umgebung befinden, die ES2015-Funktionen unterstützt, können Sie berechnete Eigenschaftsnamen verwenden :

d = {
  [a]: {
    greetings: b,
    data: c
  }
};
zzzzBov
quelle
Das funktioniert. Das Muster sollte sein: d = {[a]: {Grüße: b, Daten: c}}
Robskrob
@robertjewell, guter Punkt, ich habe aktualisiert, um den Hinweis zur ES2015-Notation aufzunehmen.
zzzzBov
Erstaunliche Erklärung.
Fiza Khan
32

Sie müssen d[a]entweder ein assoziatives Array oder ein Objekt festlegen :

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

Ohne Einstellung passiert Folgendes:

d[a] == undefined, So Sie tun , undefined['greeting']=b;und per Definition hat undefiniert keine Eigenschaften. Somit ist der Fehler, den Sie erhalten haben.

vol7ron
quelle
arrayoder object. JS verfügt nicht über assoziative Arrays, Objectkann sich jedoch für begrenzte Zwecke wie eines verhalten.
Jeremy J Starcher
@JeremyJStarcher: absolut korrekt und wichtig zu wissen, aber nach dieser Denkweise hat JavaScript keine Arrays; es hat nur Objekte
vol7ron
Nicht genau. Es gibt Aspekte von assoziativen Arrays, die für Javacript-Objekte, die Codierer auslösen können, nicht zutreffen. (Echte assoziierte Arrays sind nicht darauf beschränkt, dass Schlüssel Zeichenfolgen sein müssen. Das Vorhandensein geerbter vordefinierter Eigenschaften ist ein weiterer wesentlicher Unterschied.) Andererseits verhalten sich Javascript-Arrays, während Objekte sich so verhalten, als würde man erwarten, dass sich ein numerisches Array verhält. Einer ist ein Aspekt der Funktionalität, während der andere die interne Implementierung ist.
Jeremy J Starcher
6

Das unter gespeicherte Objekt d[a]wurde auf nichts gesetzt. Somit d[a]ergibt sich zu undefined. Sie können undefined:) keine Eigenschaft zuweisen . Sie müssen ein Objekt oder Array zuweisen d[a]:

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

console.debug(d);
Polaris878
quelle
2
Am besten weisen Sie ein Objekt zu: d[a] = {};- Die Verwendung von Arrays mit nicht numerischen Tasten führt später zu Problemen.
nnnnnn
5

In Javascript ist fast alles ein Objekt nullund undefinedeine Ausnahme.

Instanzen von Arrayist ein Objekt. Sie können also die Eigenschaft eines Arrays festlegen. Aus demselben Grund können Sie die Eigenschaft eines undefinierten Arrays nicht festlegen, da es sich NICHT um ein Objekt handelt

Wukong
quelle
3

Ich würde nur eine einfache Überprüfung durchführen, um festzustellen, ob d [a] existiert, und wenn nicht, es initialisieren ...

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
quelle