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?


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

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.


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

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


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);
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.