Dlaczego poniższe działania działają?
<something>.stop().animate(
{ 'top' : 10 }, 10
);
Podczas gdy to nie działa:
var thetop = 'top';
<something>.stop().animate(
{ thetop : 10 }, 10
);
Aby było jeszcze jaśniej: W tej chwili nie jestem w stanie przekazać właściwości CSS do funkcji animacji jako zmiennej.
Odpowiedzi:
{ thetop : 10 }
jest poprawnym dosłownym obiektem. Kod utworzy obiekt o nazwiethetop
o nazwie o wartości 10. Oba poniższe są takie same:W ES5 i wcześniejszych nie można używać zmiennej jako nazwy właściwości wewnątrz literału obiektu. Jedyną opcją jest wykonanie następujących czynności:
ES6 definiuje ComputedPropertyName jako część gramatyki literałów obiektowych, co pozwala pisać kod w następujący sposób:
Możesz użyć tej nowej składni w najnowszych wersjach każdej głównej przeglądarki.
źródło
eval()
nie działałby wewnątrz literału obiektu dla dynamicznych nazw właściwości, po prostu pojawiłby się błąd. Nie tylko to, aleeval()
naprawdę nie powinno się go używać do takich rzeczy. Jest doskonały artykuł na temat poprawnego i niepoprawnego użyciaeval
: blogs.msdn.com/ericlippert/archive/2003/11/01/53329.aspx{[key] : "value"}
jeśli klucz byłby pusty, dałby{ null: "value"}
, podczas gdy chciałbym, aby wynik był{}
Dzięki ECMAScript 2015 możesz teraz zrobić to bezpośrednio w deklaracji obiektu za pomocą notacji w nawiasach:
Gdzie
key
może być dowolne wyrażenie (np. Zmienna) zwracające wartość.Więc twój kod wyglądałby następująco:
Gdzie
thetop
zostanie oceniony przed użyciem jako klucza.źródło
Cytat ES5, który mówi, że to nie powinno działać
Uwaga: zasady uległy zmianie w ES6: https://stackoverflow.com/a/2274327/895245
Spec: http://www.ecma-international.org/ecma-262/5.1/#sec-11.1.5
To znaczy że:
{ theTop : 10 }
jest dokładnie taki sam jak{ 'theTop' : 10 }
PropertyName
theTop
JestIdentifierName
, więc zostanie przekonwertowany do'theTop'
wartości ciągu, który jest wartość ciąg'theTop'
.Nie można pisać inicjatorów obiektów (literałów) ze zmiennymi kluczami.
Jedyne trzy opcje to
IdentifierName
(rozwija się do literału łańcuchowego)StringLiteral
iNumericLiteral
((rozwija się również do łańcucha).źródło
thetop
jestIdentifierName
, więc dlaczego to nie działa ? To pytanie jest nadal otwarte.{a:1}.a
, więca
wyraźnie nie rozszerzaj wartości zmiennej w przypadku identyfikatora. Ale tak, dalsze wyjaśnienie jest poprawą w tym przypadku.Użyłem następujących elementów, aby dodać właściwość o nazwie „dynamicznej” do obiektu:
key
to nazwa nowej właściwości.Obiektem przekazywanych właściwości
animate
będzie{left: 20, width: 100, top: 10}
Jest to po prostu użycie wymaganej
[]
notacji zgodnie z zaleceniami innych odpowiedzi, ale z mniejszą liczbą wierszy kodu!źródło
Dodanie nawiasu kwadratowego wokół zmiennej działa dla mnie dobrze. Spróbuj tego
źródło
Nie mogłem znaleźć prostego przykładu na temat różnic między ES6 a ES5, więc zrobiłem taki. Oba próbki kodu tworzą dokładnie ten sam obiekt. Ale przykład ES5 działa również w starszych przeglądarkach (takich jak IE11), gdzie nie działa przykład ES6.
ES6
ES5
źródło
Aktualizacja 2020 / przykład ...
Bardziej złożony przykład z użyciem nawiasów i literałów ... coś, co możesz zrobić na przykład z vue / axios. Owinąć literał w nawiasy, więc
źródło
Podany kod:
Tłumaczenie:
Jak widać,
{ thetop : 10 }
deklaracja nie korzysta ze zmiennejthetop
. Zamiast tego tworzy obiekt z kluczem o nazwiethetop
. Jeśli chcesz, aby klucz był wartością zmiennejthetop
, musisz użyć nawiasów kwadratowych wokółthetop
:Składnia nawiasu kwadratowego została wprowadzona w ES6. We wcześniejszych wersjach JavaScript należy wykonać następujące czynności:
źródło
Nie mogę uwierzyć, że nie zostało to jeszcze opublikowane: użyj notacji ze strzałką z anonimową oceną!
Całkowicie nieinwazyjny, nie zadziera z przestrzenią nazw i zajmuje tylko jedną linię:
próbny:
Pokaż fragment kodu
przydatne w środowiskach, które nie obsługują
{[myKey]: myValue}
jeszcze nowej składni, takich jak - najwyraźniej; Właśnie to zweryfikowałem w konsoli Web Developer - Firefox 72.0.1, wydany 08.01.2020.(Jestem pewien, że mógłbyś potencjalnie stworzyć jakieś bardziej wydajne / rozszerzalne rozwiązania lub cokolwiek obejmującego sprytne użycie
reduce
, ale w tym momencie prawdopodobnie lepiej byś był obsługiwany przez rozbicie stworzenia obiektu na swoją własną funkcję zamiast kompulsywnego blokowania go wszystko w linii)nie, że jest to ważne, ponieważ PO zadał to dziesięć lat temu, ale dla kompletności boską i zademonstrować, jak to jest dokładnie odpowiedź na pytanie, jak stwierdził, pokażę to w oryginalnym kontekście:
źródło
W ten sposób można również osiągnąć pożądaną wydajność
źródło
Implementacja ES5 do przypisywania kluczy jest poniżej:
Dołączyłem fragment, którego użyłem do konwersji na nagi obiekt.
źródło
W przypadku ES5 możesz wykonać następujące czynności:
Lub wypakuj do funkcji:
źródło
Jeśli chcesz, aby klucz obiektu był taki sam jak nazwa zmiennej, w ES 2015 jest krótka ręka. Nowe notacje w ECMAScript 2015
źródło
Możesz to zrobić w ten sposób:
źródło
Możesz także spróbować w ten sposób:
źródło