JavaScript - impossible de définir la propriété non définie


108

Mon code:

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

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

console.debug (d);

J'obtiens l'erreur suivante:

Uncaught TypeError: Impossible de définir la propriété «Greeting» sur undefined.

J'essaye de faire quelque chose de similaire à un tableau associatif. Pourquoi ça ne marche pas?


1
d [a] n'est pas défini. Essentiellement, d ["1"] n'est pas défini
Joseph Marikle

Réponses:


159

vous ne définissez d[a]aucune valeur.

Pour cette raison, est d[a]évalué à undefinedet vous ne pouvez pas définir de propriétés undefined.

Si vous ajoutez d[a] = {}juste après, les d = {}choses devraient fonctionner comme prévu.

Vous pouvez également utiliser un initialiseur d'objet:

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

Ou vous pouvez définir toutes les propriétés de ddans une instance de fonction anonyme:

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

Si vous êtes dans un environnement qui prend en charge les fonctionnalités ES2015, vous pouvez utiliser des noms de propriétés calculés :

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

Cela fonctionne. le modèle doit être: d = {[a]: {salutations: b, données: c}}
robskrob

@robertjewell, bon point, j'ai mis à jour pour inclure la note sur la notation ES2015.
zzzzBov

Explication incroyable.
fiza khan

32

Vous devez définir d[a]soit un tableau associatif, soit un objet:

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

Sans réglage, voici ce qui se passe:

d[a] == undefined, c'est ce que vous faites undefined['greeting']=b;et par définition, undefined n'a pas de propriétés. Ainsi, l'erreur que vous avez reçue.


arrayou object. JS n'a pas de tableaux associatifs, mais Objectpeut agir comme un pour des utilisations limitées.
Jeremy J Starcher

@JeremyJStarcher: absolument correct et important à savoir, mais à ce niveau de réflexion, JavaScript n'a pas de tableaux; il n'a que des objets
vol7ron

Pas exactement. Il y a des aspects des tableaux associatifs qui ne sont pas vrais à propos des objets Javacript qui peuvent déclencher des codeurs. (Les véritables tableaux associés ne sont pas limités en exigeant que les clés soient des chaînes. La présence de propriétés prédéfinies héritées est une autre différence majeure.) D'un autre côté, les tableaux Javascript, tandis que les objets, agissent comme on s'attend à ce qu'un tableau numérique se comporte. L'un est un aspect de la fonctionnalité, tandis que l'autre est la mise en œuvre interne.
Jeremy J Starcher

6

L'objet stocké dans d[a]n'a été défini sur rien. Ainsi, d[a]évalue à undefined. Vous ne pouvez pas attribuer une propriété à undefined:). Vous devez affecter un objet ou un tableau à d[a]:

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

console.debug(d);

2
Il est préférable d'attribuer un objet: d[a] = {};- l'utilisation de tableaux avec des touches non numériques a tendance à entraîner des problèmes sur toute la ligne.
nnnnnn

5

En javascript, presque tout est un objet nullet undefinedfait exception.

Les instances de Arrayest un objet. afin que vous puissiez définir la propriété d'un tableau, pour la même raison, vous ne pouvez pas définir la propriété d'un non défini, car ce n'est PAS un objet


3

je ferais juste une simple vérification pour voir si d [a] existe et sinon l'initialiserais ...

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);
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.