Warum funktioniert folgendes?
<something>.stop().animate(
{ 'top' : 10 }, 10
);
Während dies nicht funktioniert:
var thetop = 'top';
<something>.stop().animate(
{ thetop : 10 }, 10
);
Um es noch deutlicher zu machen: Im Moment kann ich keine CSS-Eigenschaft als Variable an die Animationsfunktion übergeben.
Antworten:
{ thetop : 10 }
ist ein gültiges Objektliteral. Der Code erstellt ein Objekt mit einer Eigenschaft mitthetop
dem Wert 10. Beide sind identisch:In ES5 und früheren Versionen können Sie eine Variable nicht als Eigenschaftsnamen in einem Objektliteral verwenden. Sie können nur Folgendes tun:
ES6 definiert ComputedPropertyName als Teil der Grammatik für Objektliterale, mit der Sie den Code wie folgt schreiben können:
Sie können diese neue Syntax in den neuesten Versionen jedes Mainstream-Browsers verwenden.
quelle
eval()
würde in einem Objektliteral für dynamische Eigenschaftsnamen nicht funktionieren, es würde nur eine Fehlermeldung angezeigt . Nicht nur das, sonderneval()
sollte wirklich nicht für solche Dinge verwendet werden. Es gibt einen ausgezeichneten Artikel über die korrekte und falsche Verwendung voneval
: blogs.msdn.com/ericlippert/archive/2003/11/01/53329.aspx{[key] : "value"}
Schlüssel null wäre, würde er geben{ null: "value"}
, während ich das Ergebnis gerne hätte{}
Mit ECMAScript 2015 können Sie dies jetzt direkt in der Objektdeklaration mit der Klammernotation tun:
Wo
key
kann eine beliebige Art von Ausdruck (z. B. eine Variable) sein, der einen Wert zurückgibt.Hier würde Ihr Code also so aussehen:
Wo
thetop
wird ausgewertet, bevor es als Schlüssel verwendet wird.quelle
ES5-Zitat, das besagt, dass es nicht funktionieren sollte
Hinweis: Die Regeln für ES6 wurden geändert: https://stackoverflow.com/a/2274327/895245
Spezifikation: http://www.ecma-international.org/ecma-262/5.1/#sec-11.1.5
Das bedeutet, dass:
{ theTop : 10 }
ist genau das gleiche wie{ 'theTop' : 10 }
Das
PropertyName
theTop
ist einIdentifierName
, also wird es in den'theTop'
Zeichenfolgenwert konvertiert, der der Zeichenfolgenwert von ist'theTop'
.Es ist nicht möglich, Objektinitialisierer (Literale) mit variablen Schlüsseln zu schreiben.
Die einzigen drei Optionen sind
IdentifierName
(wird zu einem Zeichenfolgenliteral erweitert)StringLiteral
undNumericLiteral
(wird auch zu einer Zeichenfolge erweitert).quelle
thetop
ist einIdentifierName
, warum funktioniert es nicht ? Diese Frage ist noch offen.{a:1}.a
, alsoa
den Variablenwert im Bezeichnerfall eindeutig nicht erweitern. Aber ja, weiter zu erklären ist in diesem Fall eine Verbesserung.Ich habe Folgendes verwendet, um einem Objekt eine Eigenschaft mit einem "dynamischen" Namen hinzuzufügen:
key
ist der Name der neuen Eigenschaft.Das Objekt der Eigenschaften, an die übergeben
animate
wird, ist{left: 20, width: 100, top: 10}
Hierbei wird nur die erforderliche
[]
Notation verwendet, wie in den anderen Antworten empfohlen, jedoch mit weniger Codezeilen!quelle
Das Hinzufügen einer eckigen Klammer um die Variable funktioniert gut für mich. Versuche dies
quelle
Ich konnte kein einfaches Beispiel für die Unterschiede zwischen ES6 und ES5 finden, also habe ich eines gemacht. Beide Codebeispiele erstellen genau das gleiche Objekt. Das ES5-Beispiel funktioniert jedoch auch in älteren Browsern (wie IE11), während das ES6-Beispiel dies nicht tut.
ES6
ES5
quelle
2020 Update / Beispiel ...
Ein komplexeres Beispiel mit Klammern und Literalen ... etwas, das Sie möglicherweise zum Beispiel mit vue / axios tun müssen. Wickeln Sie das Literal also in die Klammern
quelle
Gegebener Code:
Übersetzung:
Wie Sie sehen können, verwendet die
{ thetop : 10 }
Deklaration die Variable nichtthetop
. Stattdessen wird ein Objekt mit einem Schlüssel namens erstelltthetop
. Wenn der Schlüssel der Wert der Variablen sein sollthetop
, müssen Sie eckige Klammern verwendenthetop
:Die eckige Klammer-Syntax wurde mit ES6 eingeführt. In früheren Versionen von JavaScript müssten Sie Folgendes tun:
quelle
Ich kann es nicht glauben dies noch nicht veröffentlicht wurde: Verwenden Sie einfach die Pfeilnotation mit anonymer Bewertung!
Völlig nicht invasiv, spielt nicht mit dem Namespace und benötigt nur eine Zeile:
Demo:
Code-Snippet anzeigen
nützlich in Umgebungen, die die neue
{[myKey]: myValue}
Syntax noch nicht unterstützen , wie z. Ich habe es gerade auf meiner Web Developer Console überprüft - Firefox 72.0.1, veröffentlicht am 08.01.2020.(Ich bin sicher, Sie könnten möglicherweise leistungsfähigere / erweiterbarere Lösungen oder was auch immer mit cleverem Einsatz entwickeln
reduce
, aber an diesem Punkt wäre es wahrscheinlich besser, wenn Sie die Objekterstellung einfach in ihre eigene Funktion aufteilen, anstatt sie zwanghaft zu blockieren alle inline)Nicht, dass es wichtig wäre, seit OP dies vor zehn Jahren gefragt hat, aber der Vollständigkeit halber und um zu demonstrieren, wie es genau die Antwort auf die angegebene Frage ist, werde ich dies im ursprünglichen Kontext zeigen:
quelle
Auf diese Weise können Sie auch die gewünschte Ausgabe erzielen
quelle
Die ES5-Implementierung zum Zuweisen von Schlüsseln ist unten aufgeführt:
Ich habe ein Snippet angehängt, das ich zum Konvertieren in ein nacktes Objekt verwendet habe.
quelle
Für ES5 können Sie Folgendes tun:
Oder extrahieren Sie zu einer Funktion:
quelle
Wenn der Objektschlüssel mit dem Variablennamen identisch sein soll, gibt es in ES 2015 eine kurze Hand. Neue Notationen in ECMAScript 2015
quelle
Sie können es so machen:
quelle
Sie können auch Folgendes versuchen:
quelle