2011-07-27 18 views
11

Duplicar posibles:
In javascript how can we identify whether an object is a Hash or an Array?Distinguir entre matriz y de hash en javascript con typeof()

en JavaScript

typeof([]) 

y

typeof({}) 

ambos devuelven "objeto".

¿Cómo puedo distinguir de manera confiable entre una matriz y una matriz asociativa en Javascript?

he pensado en probar el objeto en cuestión para ver si tiene el atributo "longitud" (lo que indica que sería una matriz), pero lo que a continuación, el siguiente también sería visto como una matriz:

{length:5} 

Respuesta

16

navegadores modernos tienen Array.isArray construido en

Para los navegadores más antiguos, puede probar para esa función y añadir cuando sea necesario.

if(typeof Array.isArray !== 'function') { 
    Array.isArray = function(arr) { 
     return Object.prototype.toString.call(arr) === '[object Array]'; 
    }; 
} 

alert(Array.isArray([])); 

EDIT:

Array.isArray is part of ECMAScript 5:

15.4.3.2 Array.isArray (arg)

La función isArray toma una arg argumento, y devuelve el valor booleano verdadero si t El argumento es un objeto cuya propiedad interna de clase es "Array"; de lo contrario, devuelve falso. Se toman los siguientes pasos:

  1. Si Tipo (arg) no es Object, devuelve false.
  2. Si el valor de la propiedad interna [[Class]] de arg es "Array", entonces devuelve true.
  3. Devolver falso.
0

Las matrices asociativas no existen en Javascript.

Una matriz solo puede tener teclas numéricas. Si accede a una clave de cadena, de hecho está utilizando un atajo, que es exactamente equivalente a la notación de objeto.

http://www.quirksmode.org/js/associative.html

http://andrewdupont.net/2006/05/18/javascript-associative-arrays-considered-harmful/

+4

Erm, creo que ya has retrocedido. Los objetos JS normales son matrices asociativas. Son matrices reales que no existen en javascript. Una matriz en js es un objeto con azúcar para que parezca una matriz real (la propiedad de longitud más notable, que simplemente devuelve 1 + el campo numérico más alto almacenado en el objeto). – beldaz

4

Una buena idea es, para comprobar si hay el valor interno [[CClass]]. Para ello, es necesario invocar Object.prototype.toString:.

var toStr = Object.prototype.toString; 

toStr.call([]); // === [object Array] 
toStr.call({}); // === [object Object] 
Cuestiones relacionadas