Pourquoi fonctionne ce qui suit?
<something>.stop().animate(
{ 'top' : 10 }, 10
);
Alors que cela ne fonctionne pas:
var thetop = 'top';
<something>.stop().animate(
{ thetop : 10 }, 10
);
Pour le rendre encore plus clair: Pour le moment, je ne suis pas en mesure de transmettre une propriété CSS à la fonction d'animation en tant que variable.
Réponses:
{ thetop : 10 }
est un littéral d'objet valide. Le code créera un objet avec une propriété nomméethetop
qui a une valeur de 10. Les deux éléments suivants sont identiques:Dans ES5 et versions antérieures, vous ne pouvez pas utiliser une variable comme nom de propriété dans un littéral d'objet. Votre seule option est de procéder comme suit:
ES6 définit ComputedPropertyName dans le cadre de la grammaire des littéraux d'objet, ce qui vous permet d'écrire le code comme ceci:
Vous pouvez utiliser cette nouvelle syntaxe dans les dernières versions de chaque navigateur grand public.
la source
eval()
ne fonctionnerait pas dans un littéral d'objet pour les noms de propriétés dynamiques, vous obtiendriez simplement une erreur. Non seulement cela, maiseval()
ne devrait vraiment pas être utilisé pour de telles choses. Il y a un excellent article sur l'utilisation correcte et incorrecte deeval
: blogs.msdn.com/ericlippert/archive/2003/11/01/53329.aspx{[key] : "value"}
, si la clé était nulle, cela donnerait{ null: "value"}
, alors que j'aimerais que le résultat soit{}
Avec ECMAScript 2015, vous pouvez maintenant le faire directement dans la déclaration d'objet avec la notation des crochets:
Où
key
peut être n'importe quelle sorte d'expression (par exemple une variable) renvoyant une valeur.Voici donc à quoi ressemblerait votre code:
Où
thetop
sera évalué avant d'être utilisé comme clé.la source
Citation ES5 qui dit que cela ne devrait pas fonctionner
Remarque: les règles ont changé pour ES6: https://stackoverflow.com/a/2274327/895245
Spec: http://www.ecma-international.org/ecma-262/5.1/#sec-11.1.5
Cela signifie que:
{ theTop : 10 }
est exactement le même que{ 'theTop' : 10 }
Le
PropertyName
theTop
est unIdentifierName
, il est donc converti en la'theTop'
valeur de chaîne, qui est la valeur de chaîne de'theTop'
.Il n'est pas possible d'écrire des initialiseurs d'objets (littéraux) avec des clés variables.
Les trois seules options sont
IdentifierName
(se développe en littéral de chaîne)StringLiteral
etNumericLiteral
(se développe également en chaîne).la source
thetop
unIdentifierName
, alors pourquoi ça ne marche pas ? Cette question est toujours ouverte.{a:1}.a
, donca
clairement ne pas étendre la valeur de la variable dans le cas de l'identifiant. Mais oui, expliquer davantage est une amélioration dans ce cas.J'ai utilisé ce qui suit pour ajouter une propriété avec un nom "dynamique" à un objet:
key
est le nom de la nouvelle propriété.L'objet des propriétés transmises
animate
sera{left: 20, width: 100, top: 10}
Ceci utilise simplement la
[]
notation requise comme recommandé par les autres réponses, mais avec moins de lignes de code!la source
L'ajout d'un crochet carré autour de la variable me convient. Essaye ça
la source
Je n'ai pas pu trouver d' exemple simple sur les différences entre ES6 et ES5, alors j'en ai fait un. Les deux exemples de code créent exactement le même objet. Mais l'exemple ES5 fonctionne également dans les navigateurs plus anciens (comme IE11), contrairement à l'exemple ES6.
ES6
ES5
la source
Mise à jour 2020 / exemple ...
Un exemple plus complexe, en utilisant des crochets et des littéraux ... quelque chose que vous pourriez avoir à faire par exemple avec vue / axios. Enveloppez le littéral dans les crochets, donc
la source
Code donné:
Traduction:
Comme vous pouvez le voir, la
{ thetop : 10 }
déclaration n'utilise pas la variablethetop
. Au lieu de cela, il crée un objet avec une clé nomméethetop
. Si vous voulez que la clé soit la valeur de la variablethetop
, vous devrez utiliser des crochets autourthetop
:La syntaxe entre crochets a été introduite avec ES6. Dans les versions antérieures de JavaScript, vous devez effectuer les opérations suivantes:
la source
Je ne peux pas croire que cela n'ait pas encore été posté: utilisez simplement la notation fléchée avec une évaluation anonyme!
Complètement non invasif, ne dérange pas l'espace de noms et ne prend qu'une seule ligne:
démo:
Afficher l'extrait de code
utile dans les environnements qui ne prennent pas encore en charge la nouvelle
{[myKey]: myValue}
syntaxe, comme - apparemment; Je viens de le vérifier sur ma console Web Developer - Firefox 72.0.1, publiée le 2020-01-08.(Je suis sûr que vous pourriez potentiellement créer des solutions plus puissantes / extensibles ou tout ce qui implique une utilisation intelligente de
reduce
, mais à ce stade, vous seriez probablement mieux servi en décomposant simplement la création d'objet dans sa propre fonction au lieu de la bloquer compulsivement. tous en ligne)non pas que cela soit important depuis que OP l'a demandé il y a dix ans, mais pour être complet et pour montrer comment c'est exactement la réponse à la question telle qu'elle est énoncée, je vais montrer cela dans le contexte d'origine:
la source
De cette façon, vous pouvez également obtenir la sortie souhaitée
la source
L'implémentation d'ES5 pour attribuer des clés est ci-dessous:
J'ai joint un extrait que j'ai utilisé pour convertir en objet nu.
la source
Vous pouvez effectuer les opérations suivantes pour ES5:
Ou extrayez vers une fonction:
la source
Si vous voulez que la clé d'objet soit la même que le nom de la variable, il y a un raccourci dans ES 2015. Nouvelles notations dans ECMAScript 2015
la source
Vous pouvez le faire de cette façon:
la source
Vous pouvez également essayer comme ceci:
la source