Почему работает следующее?
<something>.stop().animate(
{ 'top' : 10 }, 10
);
Тогда как это не работает:
var thetop = 'top';
<something>.stop().animate(
{ thetop : 10 }, 10
);
Чтобы сделать это еще яснее: на данный момент я не могу передать свойство CSS в функцию animate как переменную.
Ответы:
{ thetop : 10 }
является допустимым литералом объекта. Код создаст объект со именем свойстваthetop
, имеющим значение 10. Оба следующих элемента одинаковы:В ES5 и более ранних версиях нельзя использовать переменную в качестве имени свойства внутри литерала объекта. Ваш единственный вариант - сделать следующее:
ES6 определяет ComputedPropertyName как часть грамматики для литералов объекта, которая позволяет писать код следующим образом:
Вы можете использовать этот новый синтаксис в последних версиях каждого основного браузера.
источник
eval()
не будет работать внутри литерала объекта для динамических имен свойств, вы просто получите ошибку. Мало того, но наeval()
самом деле не следует использовать для таких вещей. Есть отличная статья о правильном и неправильном использованииeval
: blogs.msdn.com/ericlippert/archive/2003/11/01/53329.aspx{[key] : "value"}
если бы ключ был нулевым, он бы дал{ null: "value"}
, тогда как я хотел бы, чтобы результат был{}
С ECMAScript 2015 вы теперь можете сделать это непосредственно в объявлении объекта с помощью скобок:
Где
key
может быть любое выражение (например, переменная), возвращающее значение.Итак, здесь ваш код будет выглядеть так:
Где
thetop
будет оцениваться перед использованием в качестве ключа.источник
ES5 цитата, которая говорит, что это не должно работать
Примечание: правила были изменены для ES6: https://stackoverflow.com/a/2274327/895245
Spec: http://www.ecma-international.org/ecma-262/5.1/#sec-11.1.5
Это значит, что:
{ theTop : 10 }
точно так же, как{ 'theTop' : 10 }
Это
PropertyName
theTop
являетсяIdentifierName
, поэтому он преобразуется в'theTop'
строковое значение, которое является строковым значением'theTop'
.Невозможно написать инициализаторы объектов (литералы) с переменными ключами.
Доступны только три параметра
IdentifierName
(расширяется до строкового литерала)StringLiteral
иNumericLiteral
(также расширяется до строкового).источник
thetop
этоIdentifierName
, так почему она не работает ? Этот вопрос все еще открыт.{a:1}.a
, поэтомуa
явно не раскрываем значение переменной в случае идентификатора. Но да, дальнейшее объяснение является улучшением в этом случае.Я использовал следующее, чтобы добавить свойство с «динамическим» именем к объекту:
key
это имя новой собственности.Объект переданных свойств
animate
будет{left: 20, width: 100, top: 10}
Это просто использование требуемой
[]
записи, как рекомендовано другими ответами, но с меньшим количеством строк кода!источник
Добавление квадратной скобки вокруг переменной работает хорошо для меня. Попробуй это
источник
Я не смог найти простой пример о различиях между ES6 и ES5, поэтому я сделал один. Оба примера кода создают один и тот же объект. Но пример ES5 также работает в старых браузерах (например, IE11), тогда как пример ES6 - нет.
ES6
ES5
источник
2020 обновление / пример ...
Более сложный пример - использование скобок и литералов ... то, что вам, возможно, придется сделать, например, с помощью vue / axios. Оберните литерал в скобки, так
источник
Данный код:
Перевод:
Как видите,
{ thetop : 10 }
объявление не использует переменнуюthetop
. Вместо этого он создает объект с ключом с именемthetop
. Если вы хотите, чтобы ключом было значение переменнойthetop
, вам придется использовать квадратные скобкиthetop
:Синтаксис в квадратных скобках был введен в ES6. В более ранних версиях JavaScript вам пришлось бы делать следующее:
источник
Я не могу поверить, что это еще не было опубликовано: просто используйте обозначение стрелки с анонимной оценкой!
Полностью неинвазивный, не связывается с пространством имен и занимает всего одну строку:
демо:
Показать фрагмент кода
полезен в средах, которые еще не поддерживают новый
{[myKey]: myValue}
синтаксис, таких как - очевидно; Я только что проверил это на своей консоли веб-разработчика - Firefox 72.0.1, выпущенной 2020-01-08.(Я уверен, что вы могли бы потенциально сделать несколько более мощных / расширяемых решений или что-либо, включающее умное использование
reduce
, но в этот момент вам, вероятно, будет лучше, если вы просто разбиваете создание объекта на его собственную функцию, а не навязываете его принудительно все встроено)не то, чтобы это имело значение с тех пор, как ОП задала этот вопрос десять лет назад, но для полноты картины и для демонстрации того, насколько точным является ответ на поставленный вопрос, я покажу это в первоначальном контексте:
источник
Таким образом, вы также можете достичь желаемого результата
источник
Реализация ES5 для назначения ключей приведена ниже:
Я прикрепил фрагмент, который использовал для преобразования в голый объект.
источник
Вы можете сделать следующее для ES5:
Или извлечь в функцию:
источник
Если вы хотите, чтобы ключ объекта совпадал с именем переменной, в ES 2015 есть сокращение. Новые нотации в ECMAScript 2015
источник
Вы можете сделать это следующим образом:
источник
Вы также можете попробовать вот так:
источник