2011-09-20 19 views
74

Mi código:JavaScript - no puede establecer la propiedad de indefinido

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

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

     console.debug (d); 

me sale el siguiente error:

Uncaught TypeError: Cannot set property 'greeting' of undefined.

que estoy tratando de hacer algo similar a una matriz asociativa. ¿Por qué no está funcionando?

+0

d [a] no está definido. En esencia d ["1"] no está definido –

Respuesta

98

nunca ha configurado d[a] a ningún valor.

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

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

Como alternativa, puede utilizar un inicializador de objeto:

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

O podría configurar todas las propiedades de una instancia d en función anónima:

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

Si estás en un entorno que admite las características de ES2015, puede usar computed property names:

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

Esto funciona. el patrón debería ser: d = {[a]: {saludos: b, data: c}} – robertjewell

+0

@robertjewell, buen punto, lo he actualizado para incluir la nota sobre la notación ES2015. – zzzzBov

4

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

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

console.debug(d); 
+1

Lo mejor para asignar un objeto: 'd [a] = {};' - el uso de matrices con teclas no numéricas tiende a generar problemas en el futuro. – nnnnnn

21

Usted tiene que fijar d[a] ya sea a una matriz asociativa, o un objeto:

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

Sin configuración, esto es lo que Está sucediendo t:

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

+0

'array' o' object'. JS no tiene matrices asociativas, aunque 'Object' puede actuar como uno para usos limitados. –

+0

@JeremyJStarcher: es absolutamente correcto e importante saberlo, pero según ese nivel de pensamiento, JavaScript no tiene matrices; solo tiene objetos – vol7ron

+0

No exactamente. Hay aspectos de arreglos asociativos que no son ciertos acerca de los objetos Javacript que pueden hacer tropezar a los codificadores. (Las matrices asociadas verdaderas no están limitadas por requerir que las claves sean cadenas. La presencia de propiedades predefinidas heredadas es otra gran diferencia). Por otro lado, las matrices de JavaScript, aunque son objetos, actúan como uno espera que se comporte una matriz numérica. Uno es un aspecto de la funcionalidad, mientras que el otro es la implementación interna. –

4

En javascript casi todo es un objeto, null y undefined son la excepción.

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

Cuestiones relacionadas