2009-07-17 10 views
46

En Javascript, quelle est la différence entre un objet et un hachage? Comment créez-vous l'un par rapport à l'autre, et pourquoi s'en soucieriez-vous? Y a-t-il une différence entre les exemples de code suivants?Différence entre un objet et un hachage?

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

Et:

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

Et:

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

Pouvez-vous penser à un autre exemple de code j'illustrer?

La question de base ici est quelle est la différence entre un objet et un hachage?

+1

Je pense que votre déclaration « différence entre l'objet et un hachage », on entend signifier « différence entre l'objet et un (hachage)carte". – Peter

+0

bon point ... mais Hash n'est-il pas un vrai type Javascript? –

+7

Il n'existe pas de type de hachage dans JavaScript. '{}' est juste un initialisateur à courte main pour le type 'Object'. Et '[]' est juste un initialisateur à courte main pour le type 'Array'. – Blixt

Répondre

48

Il n'y en a tout simplement pas. Tous les trois sont littéralement égaux.

+14

Incorrect, ou une simplification excessive au moins. Ce n'est pas qu'il n'y a pas de différence entre eux; ils sont en fait tous la même chose, donc le montant de la différence n'est pas «0», mais «NaN». –

+1

Et pourtant ... ici http://stackoverflow.com/questions/8511281/check-if-a-variable-is-an-object-in-javascript ils montrent que diverses implémentations 'isObject' peuvent donner des réponses différentes. –

3

Ils sont identiques.

vous pouvez les utiliser de manière interchangeable.

4

Il n'y a aucune différence dans l'un de vos échantillons. Ils sont tous des objets avec des propriétés nommées. Vous venez de montrer différentes façons de créer/référencer ces propriétés.

3

Je pense que c'est pareil. La troisième version pourrait être utilisée avec les noms de propriétés dynamiques. Le premier est le plus court à écrire.

13

Ce sont des systèmes de notation différents que vous pouvez utiliser de façon interchangeable. Il existe de nombreuses situations où l'utilisation de la syntaxe des parenthèses [ ] peut être plus attrayante, par exemple lors du référencement d'un objet avec une 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

Ils sont identiques. Tout comme [] et new Array() sont les mêmes. Pour plus d'informations sur les principaux types de JavaScript, consultez le MDC Core JavaScript 1.5 reference.

Si vous voulez la preuve que {} est le même que new Object():

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

!!! ATTENTION ACHTUNG AVERTISSEMENT !!! Jamais, jamais affecter à la propriété prototype du type Object dans le code de production. Vous allez polluer tout l'espace de noms global.

0

En fait, il n'y a rien de 'hashtable' ou de 'hashmap' dans JavaScript. L'objet en JavaScript se comporte comme un 'hash' [les objets dans JavaScript sont simplement des propriétés clé/valeur] et donc la confusion.

4

En fait, chaque objet dans JavaScript est un hachage. C'est un hachage des propriétés et des méthodes de l'objet. En fait, tout ce qui est en Javascript est un hachage (c'est-à-dire une liste de paires nom/valeur).

Chaque fois que vous appelez méthode, propriété ou simplement référence à une variable, vous effectuez une recherche de hachage interne.

+0

Pour être concis, il s'agit d'une carte généralisée au lieu d'un hachage que chaque objet dans JavaScript est. Dans des langages tels que Java, C#, etc., les cartes sont utilisées pour un type de données homogène, tandis qu'en JavaScript, les données pour la '' map'' sont simplement hétérogènes. – lcn

5

Dans d'autres langages tels que Java et C#, il est possible d'utiliser n'importe quel objet (pas seulement une chaîne ou un nombre) comme clé dans une table de hachage/hachage, ce qui n'est pas le cas en JavaScript. aux cordes.

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

Il peut être utile d'utiliser des objets arbitraires comme les clés, dans ce cas, vous pouvez utiliser quelque chose comme jshashtable.

Avis de non-responsabilité: J'ai écrit jshashtable.

1

Techniquement, ils sont identiques. Lorsque vous écrivez du code, vous pouvez facilement faire myobject['someproprty' + 'somethingElseConcatenated], ce que vous ne pouvez pas faire en utilisant la "notation par points" - myobject.someproperty est tout ce que vous pouvez faire. Douglas Crockford, l'un des auteurs de ECMAscript, suggère de ne pas utiliser la syntaxe var a = new Object() pour une raison que je n'ai pas tout à fait attraper. Quoi qu'il en soit, ça vaut le coup de regarder sa présentation si ça vous intéresse (il se compose de plusieurs parties, la première est ici http://video.yahoo.com/watch/111593/1710507)

1

Chaque moteur (navigateur) l'implémente différemment mais privilégie le chrome V8 (basé sur la performance) tests que j'ai effectués il ya un an sur la plupart des navigateurs modernes, ils donnent des boosts de performance similaires si vous suivez les directives v8).

Ce qu'il se passe essentiellement est:

  1. Pour mettre en œuvre un objet dynamique sur lequel les propriétés peuvent être ajoutées et supprimées à la volée - une table de hachage est la solution la plus simple - mais speedwise ne est pas aussi efficace comme un objet régulier en Java (accès aléatoire ...).
  2. Ce que V8 essaie de deviner sur la base de quelques stratégies si votre objet est un objet régulier (a l'ensemble final des propriétés définies dans un ordre spécifique, etc ...) ou une hashtable. Au début, il suppose qu'il s'agit d'un objet simple et chaque nouvelle propriété entraîne la création d'une nouvelle structure d'un objet et la copie de l'ancienne sur la nouvelle propriété. Si l'objet est catégorisé comme «difficile», il est déplacé vers un hushtable.
  3. Si les avis v8 trop les « erreurs » - il se déplace tout à hashtables - donc vous obtenez de mauvaises performances (c'est pourquoi vous voulez utiliser les constructeurs qu'init tous vos membres ou structures inited dans un JSON ...)

S'il vous plaît voir ce lien: 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-de-v8-représentation-objet

également une très bonne lecture: https://www.youtube.com/watch?v=UJPdhx5zTaw

Hope it helps ...

Questions connexes