¿Por qué funciona lo siguiente?
<something>.stop().animate(
{ 'top' : 10 }, 10
);
Mientras que esto no funciona:
var thetop = 'top';
<something>.stop().animate(
{ thetop : 10 }, 10
);
Para hacerlo aún más claro: por el momento no puedo pasar una propiedad CSS a la función animada como variable.
Respuestas:
{ thetop : 10 }
es un objeto literal válido El código creará un objeto con una propiedad denominadathetop
que tiene un valor de 10. Los dos siguientes son lo mismo:En ES5 y versiones anteriores, no puede usar una variable como nombre de propiedad dentro de un objeto literal. Su única opción es hacer lo siguiente:
ES6 define ComputedPropertyName como parte de la gramática de los literales de objetos, lo que le permite escribir el código de esta manera:
Puede usar esta nueva sintaxis en las últimas versiones de cada navegador convencional.
fuente
eval()
no funcionaría dentro de un literal de objeto para nombres de propiedades dinámicas, solo obtendría un error. No solo eso, sino queeval()
realmente no debería usarse para tales cosas. Hay un excelente artículo sobre el uso correcto e incorrecto deeval
: blogs.msdn.com/ericlippert/archive/2003/11/01/53329.aspx{[key] : "value"}
, si la clave fuera nula, daría{ null: "value"}
, mientras que me gustaría que el resultado fuera{}
Con ECMAScript 2015 , ahora puede hacerlo directamente en la declaración de objeto con la notación de corchetes:
Donde
key
puede haber cualquier tipo de expresión (por ejemplo, una variable) que devuelva un valor.Así que aquí su código se vería así:
Donde
thetop
será evaluado antes de ser utilizado como clave.fuente
Cita de ES5 que dice que no debería funcionar
Nota: las reglas han cambiado para ES6: https://stackoverflow.com/a/2274327/895245
Especificaciones: http://www.ecma-international.org/ecma-262/5.1/#sec-11.1.5
Esto significa que:
{ theTop : 10 }
es exactamente lo mismo que{ 'theTop' : 10 }
El
PropertyName
theTop
es unIdentifierName
, por lo que se convierte al'theTop'
valor de cadena, que es el valor de cadena de'theTop'
.No es posible escribir inicializadores de objetos (literales) con claves variables.
Las únicas tres opciones son
IdentifierName
(se expande a cadena literal)StringLiteral
, yNumericLiteral
(también se expande a cadena).fuente
thetop
es unIdentifierName
, entonces ¿ por qué no funciona ? Esa pregunta aún está abierta.{a:1}.a
, por lo quea
claramente no expandimos el valor de la variable en el caso del identificador. Pero sí, explicar más es una mejora en este caso.He usado lo siguiente para agregar una propiedad con un nombre "dinámico" a un objeto:
key
es el nombre de la nueva propiedad.El objeto de propiedades pasado a
animate
será{left: 20, width: 100, top: 10}
Esto solo está usando la
[]
notación requerida según lo recomendado por las otras respuestas, ¡pero con menos líneas de código!fuente
Agregar corchetes alrededor de la variable funciona bien para mí. Prueba esto
fuente
No pude encontrar un ejemplo simple sobre las diferencias entre ES6 y ES5, así que hice uno. Ambas muestras de código crean exactamente el mismo objeto. Pero el ejemplo ES5 también funciona en navegadores más antiguos (como IE11), mientras que el ejemplo ES6 no lo hace.
ES6
ES5
fuente
Actualización 2020 / ejemplo ...
Un ejemplo más complejo, usar corchetes y literales ... algo que puede tener que hacer, por ejemplo, con vue / axios. Envuelva el literal entre paréntesis, entonces
fuente
Código dado:
Traducción:
Como puede ver, la
{ thetop : 10 }
declaración no hace uso de la variablethetop
. En su lugar, crea un objeto con una clave llamadathetop
. Si desea que la clave sea el valor de la variablethetop
, deberá usar corchetes alrededor dethetop
:La sintaxis de corchetes se ha introducido con ES6. En versiones anteriores de JavaScript, tendría que hacer lo siguiente:
fuente
No puedo creer esto no se haya publicado todavía: ¡solo use la notación de flecha con una evaluación anónima!
Completamente no invasivo, no se mete con el espacio de nombres, y solo se necesita una línea:
manifestación:
Mostrar fragmento de código
útil en entornos que aún no admiten la nueva
{[myKey]: myValue}
sintaxis, como, aparentemente; Lo acabo de verificar en mi Consola de desarrollador web: Firefox 72.0.1, lanzado el 2020-01-08.(Estoy seguro de que potencialmente podría hacer algunas soluciones más potentes / extensibles o lo que sea que implique un uso inteligente de
reduce
, pero en ese punto, probablemente sería mejor servir simplemente dividiendo la creación de objetos en su propia función en lugar de bloquearla compulsivamente todo en línea)no es que importe, ya que OP preguntó esto hace diez años, pero por el bien de la integridad y para demostrar cómo es exactamente la respuesta a la pregunta como se indicó, lo mostraré en el contexto original:
fuente
De esta manera también puede lograr la salida deseada
fuente
La implementación de ES5 para asignar claves está a continuación:
He adjuntado un fragmento que solía convertir en objeto desnudo.
fuente
Puede hacer lo siguiente para ES5:
O extraer a una función:
fuente
Si desea que la clave del objeto sea la misma que el nombre de la variable, hay una pequeña mano en ES 2015. Nuevas anotaciones en ECMAScript 2015
fuente
Puedes hacerlo de esta manera:
fuente
También puedes intentarlo así:
fuente