JavaScript: no se puede establecer la propiedad de indefinido

108

Mi código:

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

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

console.debug (d);

Obtuve el siguiente error:

Uncaught TypeError: no se puede establecer la propiedad 'greeting' de undefined.

Estoy tratando de hacer algo similar a una matriz asociativa. ¿Por qué esto no funciona?

StackOverflowNewbie
fuente
1
d [a] no está definido. En esencia, d ["1"] no está definido
Joseph Marikle

Respuestas:

159

nunca estableces d[a]ningún valor.

Debido a esto, d[a]evalúa undefinedy no puede establecer propiedades en undefined.

Si agrega d[a] = {}justo después, las d = {}cosas deberían funcionar como se esperaba.

Alternativamente, puede usar un inicializador de objeto:

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

O puede establecer todas las propiedades de den una instancia de función anónima:

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

Si se encuentra en un entorno que admite las funciones de ES2015, puede utilizar nombres de propiedad calculados :

d = {
  [a]: {
    greetings: b,
    data: c
  }
};
zzzzBov
fuente
Esto funciona. el patrón debe ser: d = {[a]: {saludos: b, datos: c}}
robskrob
@robertjewell, buen punto, he actualizado para incluir la nota sobre la notación ES2015.
zzzzBov
Increíble explicación.
fiza khan
32

Debe establecer d[a]una matriz asociativa o un objeto:

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

Sin configurar, esto es lo que está sucediendo:

d[a] == undefined, así que lo estás haciendo undefined['greeting']=b;y, por definición, undefined no tiene propiedades. Por lo tanto, el error que recibió.

vol7ron
fuente
arrayo object. JS no tiene matrices asociativas, aunque Objectpuede actuar como una para usos limitados.
Jeremy J Starcher
@JeremyJStarcher: absolutamente correcto e importante saberlo, pero según ese nivel de pensamiento, JavaScript no tiene matrices; solo tiene objetos
vol7ron
No exactamente. Hay aspectos de las matrices asociativas que no son ciertos sobre los objetos Javacript que pueden hacer tropezar a los codificadores. (Los arreglos asociados verdaderos no están limitados por requerir que las claves sean cadenas. La presencia de propiedades predefinidas heredadas es otra diferencia importante.) Por otro lado, los arreglos Javascript, mientras que los objetos, actúan como si se esperara que se comportara un arreglo numérico. Uno es un aspecto de la funcionalidad, mientras que el otro es la implementación interna.
Jeremy J Starcher
6

El objeto almacenado en d[a]no se ha establecido en nada. Por lo tanto, d[a]evalúa a undefined. No puede asignar una propiedad a undefined:). Necesita asignar un objeto o matriz a d[a]:

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

console.debug(d);
Polaris878
fuente
2
Es mejor asignar un objeto: d[a] = {};- el uso de matrices con teclas no numéricas tiende a generar problemas en el futuro.
nnnnnn
5

En javascript casi todo es un objeto nully undefinedes una excepción.

Ejemplos de Arrayes un objeto. para que pueda establecer la propiedad de una matriz, por la misma razón, no puede establecer la propiedad de un indefinido, porque NO es un objeto

wukong
fuente
3

Solo haría una verificación simple para ver si d [a] existe y, si no, lo inicializaría ...

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
fuente