JavaScript: impossibile impostare la proprietà di undefined


108

Il mio codice:

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

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

console.debug (d);

Ottengo il seguente errore:

Uncaught TypeError: Impossibile impostare la proprietà "greeting" di undefined.

Sto cercando di fare qualcosa di simile a un array associativo. Perché non funziona?


1
d [a] non è definito. In sostanza d ["1"] non è definito
Joseph Marikle,

Risposte:


159

non hai mai impostato d[a]alcun valore.

Per questo d[a]motivo , restituisce undefinede non è possibile impostare le proprietà undefined.

Se aggiungi d[a] = {}subito dopo le d = {}cose dovrebbero funzionare come previsto.

In alternativa, puoi usare un inizializzatore di oggetti:

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

Oppure puoi impostare tutte le proprietà di din un'istanza di funzione anonima:

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

Se ti trovi in ​​un ambiente che supporta le funzionalità ES2015, puoi utilizzare i nomi delle proprietà calcolate :

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

Questo funziona. lo schema dovrebbe essere: d = {[a]: {saluti: b, dati: c}}
robskrob

@robertjewell, buon punto, ho aggiornato per includere la nota sulla notazione ES2015.
zzzzBov

Incredibile spiegazione.
fiza khan

32

Devi impostare d[a]un array associativo o un oggetto:

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

Senza impostazione, ecco cosa sta succedendo:

d[a] == undefined, quindi stai facendo undefined['greeting']=b;e per definizione, undefined non ha proprietà. Quindi, l'errore che hai ricevuto.


arrayo object. JS non ha array associativi, sebbene Objectpossa agire come uno per usi limitati.
Jeremy J Starcher

@ JeremyJStarcher: assolutamente corretto e importante da sapere, ma a quel livello di pensiero JavaScript non ha array; ha solo oggetti
vol7ron

Non esattamente. Ci sono aspetti degli array associativi che non sono veri per gli oggetti Javacript che possono far inciampare i programmatori. (I veri array associati non sono limitati dal richiedere che le chiavi siano stringhe. La presenza di proprietà predefinite ereditate è un'altra grande differenza.) D'altra parte, gli array Javascript, mentre gli oggetti, si comportano come ci si aspetta che un array numerico si comporti. Uno è un aspetto della funzionalità, mentre l'altro è l'implementazione interna.
Jeremy J Starcher

6

L'oggetto memorizzato in d[a]non è stato impostato su alcun valore. Quindi, d[a]valuta a undefined. Non puoi assegnare una proprietà a undefined:). Devi assegnare un oggetto o un array a d[a]:

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

console.debug(d);

2
È meglio assegnare un oggetto: d[a] = {};- l'uso di array con tasti non numerici tende a creare problemi su tutta la linea.
nnnnnn

5

In javascript quasi tutto è un oggetto nulle undefinedfanno eccezione.

Istanze di Arrayè un oggetto. quindi puoi impostare la proprietà di un array, per lo stesso motivo, non puoi impostare la proprietà di un non definito, perché NON è un oggetto


3

farei solo un semplice controllo per vedere se d [a] esiste e se non lo inizializzo ...

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);
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.