Clés en Javascript les objets ne peuvent être des chaînes de caractères?
jshashtable états:
JavaScript intégré dans les objets fournissent des fonctionnalités à l'aide de la table de hachage
la notation entre crochets pour
propriétés, à condition que vos clés sont
des chaînes ou des nombres:
De ce que je sais, les clés sont des chaînes seulement, (puisque les chiffres sont contraints dans les chaînes de toute façon). Je veux juste vérifier et s'assurer que ce qui est indiqué ci-dessus est fausse (car les touches ne peuvent pas être des nombres).
N'standard ECMA dit rien à ce sujet..
Ou est la mise en œuvre du navigateur?
- J'ai maintenant mis à jour le jshashtable de la documentation. Comme je l'ai mentionné dans un commentaire à l'une des réponses, j'ai essayé de garder les choses simples, mais en fait c'est juste fudgy et sans doute mal si vous étiez en droit de prendre sur elle.
- Vers le bas Toujours pas fan 😉 C'est une approche suggérée: "Pas de. Bien que les objets JavaScript peut être utilisé comme une table de hachage, il y a plusieurs limitations qui font à l'aide de JavaScript les objets inappropriés pour un générique de hachage. Une limitation est que seules des chaînes de caractères et les nombres ont tendance à faire des touches utiles." (Montrent ensuite des cas et expliquer avec plus de détails. etc, mais laisser l'intro d'une intro et d'éviter de commettre à "seulement les chaînes", etc)
- Oui, votre version est certainement une amélioration. Je l'ai utilisé presque mot pour mot, alors je vous remercie beaucoup pour cela et tous vos commentaires.
- dans un proche avenir, WeakMap permettra de faire exactement cela : developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
Vous devez vous connecter pour publier un commentaire.
Qui semble être incorrect - clés de l'objet
sont toujours des chaînes de caractèrespeut être des chaînes de caractères ou (depuis ECMAScript 2015, aka ECMA-262 ed 6) les symboles. Mais c'est un autre sujet à la place du support de l'accès à la propriété.Voir ECMA-262 ed 3 § 11.2.1 (voir aussi ECMAScript 2017 (projet).):
Donc, lorsque vous utilisez la notation point, les bits après la virgule doit correspondre aux critères d'un identifiant-nom. Mais lors de l'utilisation de crochets, un expression est fournie, ce qui est évalué, et résolu à une chaîne.
Brièvement, notation crochets est fourni de manière à ce que les propriétés peuvent être consultées à l'aide d'un expression, par exemple
Ci-dessus,
x
est fourni dans les crochets de sorte qu'il est évalué, en retournant la chaîne 'foo'. Depuis cette propriété n'existe pas sury
encore, il est ajouté. Lefoo
propriété dey
est ensuite affecté à une valeur de "foo valeur".En termes généraux, la expression dans les crochets est évaluée et son
toString()
méthode appelée. C'est cette valeur qui est utilisée comme nom de propriété.Dans la dot de la propriété méthode d'accès, l'identifiant n'est pas évalué, donc:
crée une propriété
bar
avec une valeurbar value
.Si vous souhaitez créer une propriété numérique, puis:
permettra d'évaluer
5
, voir, c'est pas une chaîne, appelez le (plus ou moins)Number(5).toString()
qui renvoie la chaîne5
, qui est utilisé pour le nom de la propriété. Il est ensuite affecté à la valeur5
, qui est un nombre.Modifier
Cette réponse a été écrit lors de l'ECMAScript ed3 actuelle, cependant, les choses ont évolué. Veuillez voir les références plus tard et MDN.
CallExpression.Ident is identical to CallExpression["Ident"]
n'implique pas queCallExpression[42] is identical to CallExpression["42"]
(même si ça l'est, et il est concluante libellé dans la spécification).Vous êtes de droite ne peuvent être des chaînes de caractères, et les touches numériques tels que ceux utilisés dans les Tableaux sont contraints et stockés sous forme de chaînes.
ECMAScript spec, page 42: ECMA-262 Script 3e Édition.
La production
PropertyName : NumericLiteral
est évaluée comme suit:obj[array]
ou similaire. (C'est une règle d'utilisation, pas une grammaire de la production.)Eh bien, voici ma réponse -- surtout parce que je n'étais pas satisfait avec les références dans les autres (bonnes) réponses - expressions pour les noms de propriété [ ] sont toujours coereced à cordes et ce comportement est bien défini dans le cahier des charges. Ainsi, en fonction de l'interprétation de la citation en question, il peut être considéré comme trompeur et/ou incorrectes.
Cependant, la citation ne présume pas que
x[42]
etx["42"]
sont différents; il les états, avec l'induire en erreur l'exclusion des autres primitives et les détails -- que seules des chaînes de caractères et les nombres sont utilisable comme les "clés de hachage" (vraiment les noms de propriété) dans des conditions normales de propriété de la résolution et, dans ce sens, la citation est sans doute correct.Ces règles sont de La norme ECMA-262 Spécification du Langage ECMAScript 5e édition (décembre 2009)
De la section "11.2.1 Accesseurs de Propriété" (règles de production omis):
Heureux de codage.
Les touches sont toujours des chaînes de caractères. Cela signifie que vous ne pouvez pas utiliser une instance d'objet de l'identité comme une clé.
En Flash ActionScript 3 (utilise fort au moment de l'exécution de types à la différence de AS2) il y a un Dictionnaire d'objet qui utilise une stricte égalité de comparaison pour les clés, de sorte que vous pouvez utiliser des instances de l'objet eux-mêmes comme des clés (ainsi que des nombres, des chaînes, etc.).
Si vous vouliez faire la même chose en JavaScript, il serait difficile, parce que vous en auriez pour générer votre propre id d'objet et de les attacher à chaque objet que vous voulais suivre. Certains ont suggéré l'ajout d'un prototype de fonction de la classe de l'Objet, mais qui permettrait d'ajouter des frais généraux pour chaque objet inutilement. Dans tous les cas, vous souhaitez donner un objet d'un suivi de l'ID via un appel de fonction qui assigne une incrémentation nombre statique à une propriété unique comme "
__objectid__
".Il serait alors envisageable de créer un Dictionnaire-comme la classe avec des méthodes comme Add(clé,valeur), mais il aurait pour stocker des chaînes de caractères, des nombres et des objets en trois internes hachages pour s'assurer de la "3" ne pas entrer en collision avec le nombre de 3 ou de l'objet avec l'id 3. La méthode add aurait automatiquement attribué un
__objectid__
à n'importe quelle touche du type d'objet qui n'a pas déjà un id affecté. Même après tout cela, vous ne seriez pas en mesure d'accéder le dictionnaire à l'aide de crochets, sauf s'il y a des crochets pour les affectations de propriété que je ne connais pas en JavaScript.Ici est un
functor Array
. Il est utile lors de l'utilisation d'un paradigme de la Programmation Fonctionnelle.affiche:
un vide
alert
et puis:etc.
Nota Bene:
alert( FunctorRA )
montre.toString()
n'énumère pas les non-indices numériquesFunctorRA
est un objet générique dans la matrice de "vêtements".
syntaxique équivalent ( même avec de la ficelleeval
coercition )voir Dynamique le nom de la fonction javascript? pour plus de détails sur la façon
:
, un colon, peut être intégré dans un nom de fonction, même si il est habituellement un délimiteur d'un point de vue syntaxique de délimiter l'initialiseur de propriétés, des étiquettes, des?:
(expressions conditionnelles) etc. Un problème analogue existe avec.
nécessitant l'échappement de tous les syntaxiquement significative JavaScript codes de caractères tels que(){}\n .,
... . Le[]
construire effectivement cela pour l'figurant entre parenthèses à l'expression, dans son ensemble, sans doute en raison du report de l'évaluation de la chaîne pour être un objet de type String. Ceci est similaire à l'effet43.x=2
est verboten mais pas si 43 est représenté par un objet de type Nombre par(43).x=2
ou43["x"]=2
.(la preuve:
javascript:alert( [ (43).x=2, 43["x"]=2 ] )
affiche2,2
maisjavascript:alert(43.x=2)
génère une erreur).Oui, les clés peuvent être des nombres. En fait, la spécification utilise le même générique fonctions de cartographie pour les deux Objets et les Tableaux.
Bien tout ce que vous utilisez pour la clé est converti en chaîne en raison de la fonction de hachage qui hachages des chaînes à une près de courte unique ensemble d'octets qui peut être interprété comme un entier, provoquer nombre entier de comparaison au cours de la recherche linéaire est faible et rapide.(Les objets JavaScript sont des tables de hachage). Vous stringify les objets et les tableaux afin de les utiliser comme une clé. Les touches peuvent être illimité en taille. Mais attention, à cause des objets javascript sont non ordonnée.
Hier et d'aujourd'hui, j'ai essayé d'envelopper ma tête autour de l'apparition des problèmes dans ce domaine et j'ai écrit ces solutions.
Premier est une coutume de la mise en œuvre d'une table de hachage, http://stamat.wordpress.com/javascript-quickly-find-very-large-objects-in-a-large-array/
Et là, tout est expliqué dans les dilettantes termes...
autre est une mise à niveau à la première, et c'est un déterministe JSON stringify, que stringifies objets avec par ordre alphabétique propriétés: http://stamat.wordpress.com/2013/07/03/javascript-object-ordered-property-stringify/
Check it out 🙂
Oui, type de. Les objets sont, par définition, qu'une collection de paires clé-valeur (alors que les clés sont des chaînes de caractères ou Symboles). Cependant, comme ils sont utilisés comme tables de choix par beaucoup de gens, la plupart des moteurs de choisir une table de hachage comme discbased pour la mise en œuvre des objets en interne (dans certains cas). Donc, oui, vous pouvez utiliser des objets comme une table de hachage (mais il n'est pas garanti que le moteur va effectivement utiliser une table de hachage sous le capot).
Pas. Les numéros seront projetées à la chaîne lorsqu'il est utilisé comme clés de l'objet, tout comme n'importe quelle autre valeur. Par conséquent, vous pouvez utiliser des Objets comme une table de hachage pour les nombres et pour les cordes, mais pas pour les deux en même temps:
Si vous avez besoin d'une table de hachage pour arbitraire /mixte des valeurs, une
Map
ou unSet
sera le meilleur choix, surtout parce qu'ils garantissent O(1) recherche du temps.