2011-12-25 42 views
30

¿Por qué usar cadenas como claves de matriz, la consola muestra esa matriz sin estos valores declarados y al iterar por estos valores donde las claves son cadenas no se muestran? , aunque puedo obtener valor de ellos.Cadenas como claves de matriz en javascript

>> var arr = [ 0, 1, 2, 3 ]; 
    undefined 

>> arr["something"] = "aught"; 
    "aught" 

>> arr 
    [0, 1, 2, 3] 

>> arr["something"] 
    "aught" 

>> for(var i = arr.length; i--; console.log(arr[ i ])); 
    3 
    2 
    1 
    0 

entiendo que las matrices son objetos que hayan aplicado algún tipo de interfaz 'enumeración' en el motor de Javascript. Lo más interesante es que el intérprete no lanza ninguna advertencia o error, así que dediqué un tiempo a buscar dónde se podrían perder los datos. I ahora, estaba equivocado y yo solía [] en lugar de {}

Respuesta

69

En javascript hay 2 tipo de matrices: las matrices estándar y matrices asociativas

  • [ ] - matriz estándar - 0 índices enteros basadas únicamente
  • { } - matriz asociativa - objetos JavaScript donde las claves pueden ser cualquier cadena

Así que cuando usted defina:

var arr = [ 0, 1, 2, 3 ]; 

está definiendo una matriz estándar donde los índices solo pueden ser enteros. Cuando lo haces arr["something"] desde something (que es lo que usas como índice) no es un número entero, básicamente estás definiendo una propiedad para el objeto arr (todo es objeto en javascript). Pero no está agregando un elemento a la matriz estándar.

+2

@abuduba, porque no hay nada incorrecto :-) Tu código es perfectamente válido javascript. Es ambiguo para el lector ya que está mezclando los 2 tipos de matrices, pero es válido. ¿Por qué querrías que el intérprete indicara que algo anda mal cuando no hay nada malo? –

+18

Esto es principalmente un problema de terminología, pero javascript generalmente no llama a '{}' una matriz asociativa. Lo llaman un objeto que tiene propiedades. ¿La mayoría de la gente no está de acuerdo en que lo mejor es no confundir las cosas al llamar a un objeto javascript una matriz asociativa? – jfriend00

+1

Nota: Si intenta usar '' defineProperty'' en la matriz como '' Object.defineProperty.call (arr, 'something', 'unught'); '' arrojará un error. – David

9

for(var i = arr.length; i--; console.log(arr[ i ]));

Esto sólo le dará los índices numéricos, por supuesto, pero todavía se puede reproducir indefinidamente ambos índices numéricos y claves de las cadenas de la matriz como esta:

for (var x in arr) { 
    console.log(x + ": " + arr[x]); 
} 
/* (console output): 
    0: 0 
    1: 1 
    2: 2 
    3: 3 
    something: aught 
*/ 
+1

entonces, agreguemos esto 'Array.prototype.somethingCool =" not really ";' y luego ejecutemos for-in-loop !! – KhaledMohamedP

Cuestiones relacionadas