Por que o seguinte funciona?
<something>.stop().animate(
{ 'top' : 10 }, 10
);
Considerando que isso não funciona:
var thetop = 'top';
<something>.stop().animate(
{ thetop : 10 }, 10
);
Para deixar ainda mais claro: No momento, não sou capaz de passar uma propriedade CSS para a função animar como uma variável.
Respostas:
{ thetop : 10 }
é um literal de objeto válido. O código criará um objeto com uma propriedade nomeadathetop
que possui um valor de 10. Ambos são os mesmos:No ES5 e versões anteriores, você não pode usar uma variável como um nome de propriedade dentro de um literal de objeto. Sua única opção é fazer o seguinte:
O ES6 define ComputedPropertyName como parte da gramática dos literais de objetos, o que permite escrever o código assim:
Você pode usar essa nova sintaxe nas versões mais recentes de cada navegador principal.
fonte
eval()
não funcionaria dentro de um literal de objeto para nomes de propriedades dinâmicas, você apenas receberia um erro. Não apenas isso, maseval()
realmente não deve ser usado para essas coisas. Existe um excelente artigo sobre o uso correto e incorreto deeval
: blogs.msdn.com/ericlippert/archive/2003/11/01/53329.aspx{[key] : "value"}
, se a chave fosse nula, daria{ null: "value"}
, enquanto eu gostaria que o resultado fosse{}
Com o ECMAScript 2015, agora você pode fazê-lo diretamente na declaração de objeto com a notação de colchetes:
Onde
key
pode haver qualquer tipo de expressão (por exemplo, uma variável) retornando um valor.Portanto, aqui seu código seria semelhante a:
Onde
thetop
será avaliado antes de ser usado como chave.fonte
Citação ES5 que diz que não deve funcionar
Nota: as regras foram alteradas para o ES6: https://stackoverflow.com/a/2274327/895245
Spec: http://www.ecma-international.org/ecma-262/5.1/#sec-11.1.5
Isso significa que:
{ theTop : 10 }
é exatamente o mesmo que{ 'theTop' : 10 }
Como
PropertyName
theTop
é umIdentifierName
, ele é convertido no'theTop'
valor da sequência, que é o valor da sequência'theTop'
.Não é possível escrever inicializadores de objetos (literais) com chaves variáveis.
As únicas três opções são
IdentifierName
(expande para literal da cadeia)StringLiteral
eNumericLiteral
(também se expande para uma cadeia).fonte
thetop
é umIdentifierName
, então por que não funciona ? Essa questão ainda está em aberto.{a:1}.a
, portanto,a
claramente não expanda o valor da variável no caso identificador. Mas sim, explicar melhor é uma melhoria neste caso.Eu usei o seguinte para adicionar uma propriedade com um nome "dinâmico" a um objeto:
key
é o nome da nova propriedade.O objeto das propriedades transmitidas para
animate
será{left: 20, width: 100, top: 10}
Isso é apenas usando a
[]
notação necessária , conforme recomendado pelas outras respostas, mas com menos linhas de código!fonte
Adicionar colchete em torno da variável funciona bem para mim. Tente isto
fonte
Não consegui encontrar um exemplo simples sobre as diferenças entre o ES6 e o ES5, então fiz um. Os dois exemplos de código criam exatamente o mesmo objeto. Mas o exemplo do ES5 também funciona em navegadores mais antigos (como o IE11), enquanto o exemplo do ES6 não.
ES6
ES5
fonte
Atualização 2020 / exemplo ...
Um exemplo mais complexo, usando colchetes e literais ... algo que você pode ter que fazer, por exemplo, com vue / axios. Coloque o literal entre colchetes, para
fonte
Código fornecido:
Tradução:
Como você pode ver, a
{ thetop : 10 }
declaração não faz uso da variávelthetop
. Em vez disso, cria um objeto com uma chave chamadathetop
. Se você deseja que a chave seja o valor da variávelthetop
, precisará usar colchetes ao redorthetop
:A sintaxe entre colchetes foi introduzida no ES6. Nas versões anteriores do JavaScript, você teria que fazer o seguinte:
fonte
Eu não posso acreditar que isso ainda não foi publicado: basta usar a seta-notação com a avaliação anônima!
Completamente não invasivo, não mexe com o espaço para nome e leva apenas uma linha:
demo:
Mostrar snippet de código
útil em ambientes que ainda não suportam a nova
{[myKey]: myValue}
sintaxe, como - aparentemente; Acabei de verificar no meu console do desenvolvedor da Web - Firefox 72.0.1, lançado em 20-01-2008.(Tenho certeza de que você poderia potencialmente criar soluções mais poderosas / extensíveis ou o que quer que envolva o uso inteligente de
reduce
, mas nesse momento você provavelmente seria melhor atendido apenas quebrando a criação de objetos em sua própria função, em vez de ativá-la compulsivamente tudo em linha)não que isso importe, já que o OP pediu isso há dez anos, mas por uma questão de exaustividade e para demonstrar como é exatamente a resposta para a pergunta conforme declarada, mostrarei isso no contexto original:
fonte
Dessa forma, você também pode obter a saída desejada
fonte
A implementação do ES5 para atribuir chaves está abaixo:
Anexei um trecho que usei para converter em objeto nu.
fonte
Você pode fazer o seguinte no ES5:
Ou extraia para uma função:
fonte
Se você deseja que a chave do objeto seja igual ao nome da variável, existe uma abreviação no ES 2015. Novas anotações no ECMAScript 2015
fonte
Você pode fazer assim:
fonte
Você também pode tentar assim:
fonte