2009-07-17 21 views
46

En Javascript, ¿cuál es la diferencia entre un objeto y un hash? ¿Cómo se crea uno frente al otro y por qué te importaría? ¿Hay alguna diferencia entre los siguientes ejemplos de código?¿Diferencia entre un objeto y un hash?

var kid = { 
name: "juni", 
age: 1 
} 

Y:

var kid = new Object(); 
kid.name = "juni"; 
kid.age = 1; 

Y:

var kid = new Object(); 
kid["name"] = "juni"; 
kid["age"] = 1; 

Puede usted pensar en cualquier otro ejemplo de código que debería ilustrar?

La pregunta principal aquí es ¿cuál es la diferencia entre un objeto y un hash?

+1

Creo que su declaración "diferencia entre objeto y un hash" se entiende en el sentido de "diferencia entre un objeto y (almohadilla)mapa". – Peter

+0

buen punto ... pero ¿no es Hash un tipo de Javascript real? –

+7

No existe el tipo de hash en JavaScript. '{}' es solo un inicializador short-hand para el tipo 'Object'. Y '[]' es solo un inicializador short-hand para el tipo 'Array'. – Blixt

Respuesta

48

Simplemente no hay ninguno. Los tres de ellos son literalmente iguales.

+14

Incorrecta o, al menos, una simplificación excesiva. No es que no haya "ninguna diferencia entre ellos"; en realidad son todos lo mismo, así que la diferencia no es '0', sino' NaN'. –

+1

Y aún ... aquí http://stackoverflow.com/questions/8511281/check-if-a-variable-is-an-object-in-javascript muestran que varias implementaciones 'isObject' _deben dar respuestas diferentes. –

3

Son lo mismo.

puede usarlos indistintamente.

4

No hay ninguna diferencia en ninguna de sus muestras. Todos son objetos con propiedades nombradas. Acaba de mostrar diferentes formas de crear/hacer referencia a esas propiedades.

3

Creo que esto es todo lo mismo. La tercera versión podría usarse con nombres de propiedad dinámicos. El primero es el más corto para escribir.

13

Son sistemas de notación diferentes que puede usar indistintamente. Hay muchas situaciones donde usar la sintaxis de corchetes [ ] puede ser más atractivo, un ejemplo sería cuando se hace referencia a un objeto con una variable.

var temp = "kid"; 
var obj = new Object(); 
obj[temp] = 5; // this is legal, and is equivalent to object.kid 
obj.temp = 5; // this references literally, object.temp 
2

Son lo mismo. Al igual que [] y new Array() son lo mismo.

Para obtener más información sobre los tipos básicos de JavaScript, eche un vistazo a MDC Core JavaScript 1.5 reference.

Si quieres una prueba de que {} es lo mismo que new Object():

Object.prototype.helloWorld = function() { alert('Foo!'); }; 
var a = new Object(); 
var b = {}; 
a.helloWorld(); 
b.helloWorld(); 

!!! ADVERTENCIA AVERTISSEMENT DE ACHTUNG !!! Nunca, nunca asigne a la propiedad prototype del tipo Object en código de producción. Estarás contaminando todo el espacio de nombres global.

0

En realidad, no hay nada llamado 'hashtable' o 'hashmap' en JavaScript. El objeto en JavaScript se comporta como un 'hash' [los objetos en JavaScript son simplemente propiedades de clave/valor] y de ahí la confusión.

4

En realidad, cada objeto en JavaScript ES un hash. Este es un hash de las propiedades y métodos del objeto. De hecho, todo en Javascript es un hash (es decir, una lista de pares nombre/valor).

Cada vez que llama al método, a la propiedad o simplemente hace referencia a cualquier variable, realiza una búsqueda interna de hash.

+0

Para ser conciso, es un mapa generalizado en lugar de un hash que es cada objeto en JavaScript. En idiomas como Java, C# y etc., los mapas se usan para tipos de datos homogéneos, mientras que en JavaScript, los datos para el '' map'' son simplemente heterogéneos. – lcn

5

En otros lenguajes como Java y C# es posible usar cualquier objeto (no solo una cadena o un número) como clave en una tabla hash/mapa hash, que no es el caso en JavaScript: las claves simplemente se convierten a cuerdas.

var h = {}, k = {}; 
h[k] = "One"; 
alert(h[ "[object Object]" ]); // Alerts "One" 

Puede ser útil el uso de objetos arbitrarios como llaves, en cuyo caso se puede usar algo como jshashtable.

Descargo de responsabilidad: Escribo jshashtable.

1

Técnicamente, son lo mismo. Cuando escribe código, puede hacer fácilmente myobject['someproprty' + 'somethingElseConcatenated], lo que no puede hacer cuando usa la "notación de punto" - myobject.someproperty es todo lo que puede hacer.

Douglas Crockford, uno de los autores de ECMAscript, sugiere no utilizar la sintaxis var a = new Object() por algún motivo que no capté del todo. De todos modos, vale la pena ver su presentación si le interesa (consta de varias partes, la primera está aquí http://video.yahoo.com/watch/111593/1710507)

1

Cada motor (navegador) lo implementa de forma diferente, pero deje que se enfoque en el V8 de Chrome (basado en el rendimiento Las pruebas que realicé hace un año en la mayoría de los navegadores modernos ofrecen aumentos de rendimiento similares si sigues las directrices de v8.

Lo que ocurre básicamente es:

  1. para implementar un objeto dinámico en el que las propiedades se pueden añadir y eliminar en el momento - una tabla hash es la solución más simple - pero speedwise no es tan eficiente como objeto regular en java (acceso aleatorio ...).
  2. Lo que V8 hace es intentar adivinar basándose en algunas estrategias si su objeto es un objeto normal (tiene un conjunto final de propiedades establecidas en un orden específico, etc.) o una tabla hash. Al principio asume que se trata de un objeto simple y cada nueva propiedad provoca la creación de una nueva estructura de un objeto y la copia de la antigua en ella más la nueva propiedad. Si el objeto se categoriza como "difícil", se mueve a una mesa plegable.
  3. Si v8 nota demasiados "errores" - mueve todo a hashtables - por lo tanto, obtiene un rendimiento pobre (es por eso que quiere usar constructores que inicien todos sus miembros o estructuras en un json ...)

Por favor ver los siguientes enlaces: https://developers.google.com/v8/design#prop_access

www.quora.com/Are-JavaScript-Objects-implemented-as-HashTables-Is-key-value-access-O-1

jayconrod.com/posts/52/a-tour-of-v8-object-representation

También una muy buena conferencia: https://www.youtube.com/watch?v=UJPdhx5zTaw

creo que sirve ...

Cuestiones relacionadas