如何在 JavaScript 对象文字中使用变量作为键?
为什么下面的方法有效?
<something>.stop().animate(
{ 'top' : 10 }, 10
);
然而这不起作用:
var thetop = 'top';
<something>.stop().animate(
{ thetop : 10 }, 10
);
为了更清楚地说明:目前我无法将 CSS 属性作为变量传递给 animate 函数。
Why does the following work?
<something>.stop().animate(
{ 'top' : 10 }, 10
);
Whereas this doesn't work:
var thetop = 'top';
<something>.stop().animate(
{ thetop : 10 }, 10
);
To make it even clearer: At the moment I'm not able to pass a CSS property to the animate function as a variable.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(16)
{ thetop : 10 }
是一个有效的对象文字。该代码将创建一个名为thetop
的属性的对象,其值为 10。以下两者是相同的:在 ES5 及更早版本中,不能在对象字面量内使用变量作为属性名称。您唯一的选择是执行以下操作:
ES6 定义 CompulatedPropertyName 作为对象字面量语法的一部分,它允许您编写如下代码:
您可以在每个主流浏览器的最新版本中使用这种新语法。
{ thetop : 10 }
is a valid object literal. The code will create an object with a property namedthetop
that has a value of 10. Both the following are the same:In ES5 and earlier, you cannot use a variable as a property name inside an object literal. Your only option is to do the following:
ES6 defines ComputedPropertyName as part of the grammar for object literals, which allows you to write the code like this:
You can use this new syntax in the latest versions of each mainstream browser.
使用 ECMAScript 2015,您现在可以使用括号符号直接在对象声明中执行此操作:
其中
key
可以是任何类型的返回值的表达式(例如变量)。所以这里你的代码看起来像:
在用作键之前将评估
thetop
。With ECMAScript 2015 you are now able to do it directly in object declaration with the brackets notation:
Where
key
can be any sort of expression (e.g. a variable) returning a value.So here your code would look like:
Where
thetop
will be evaluated before being used as key.ES5 引用说它不应该工作
注意:ES6 的规则已更改:https://stackoverflow.com /a/2274327/895245
规范: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
(也扩展为字符串)。< /p>ES5 quote that says it should not work
Note: rules have changed for ES6: https://stackoverflow.com/a/2274327/895245
Spec: http://www.ecma-international.org/ecma-262/5.1/#sec-11.1.5
This means that:
{ theTop : 10 }
is the exact same as{ 'theTop' : 10 }
The
PropertyName
theTop
is anIdentifierName
, so it gets converted to the'theTop'
string value, which is the string value of'theTop'
.It is not possible to write object initializers (literals) with variable keys.
The only three options are
IdentifierName
(expands to string literal),StringLiteral
, andNumericLiteral
(also expands to a string).ES6 / 2020
如果您尝试使用来自任何其他来源的“key:value”将数据推送到对象,您可以使用如下内容:
希望这对某人有帮助:)
ES6 / 2020
If you're trying to push data to an object using "key:value" from any other source, you can use something like this:
Hope this helps someone :)
我使用以下方法将具有“动态”名称的属性添加到对象:
key
是新属性的名称。传递给
animate
的属性对象将为{left: 20, width: 100, top: 10}
这只是使用所需的
[]
其他答案推荐的符号,但代码行更少!I have used the following to add a property with a "dynamic" name to an object:
key
is the name of the new property.The object of properties passed to
animate
will be{left: 20, width: 100, top: 10}
This is just using the required
[]
notation as recommended by the other answers, but with fewer lines of code!在变量周围添加方括号对我来说很有用。试试这个
Adding square bracket around the variable works good for me. Try this
你也可以这样尝试:
You can also try like this:
我找不到关于 ES6 和 ES5 之间差异的简单示例,所以我做了一个。两个代码示例创建完全相同的对象。但 ES5 示例也适用于较旧的浏览器(如 IE11),而 ES6 示例则不行。
ES6
ES5
I couldn't find a simple example about the differences between ES6 and ES5, so I made one. Both code samples create exactly the same object. But the ES5 example also works in older browsers (like IE11), wheres the ES6 example doesn't.
ES6
ES5
更新:正如评论者指出的那样,任何支持箭头函数的 JavaScript 版本也支持
({[myKey]:myValue})
,所以这个答案没有实际用例(事实上,它可能会在一些奇怪的极端情况下崩溃)。不要使用下面列出的方法。
我不敢相信这还没有发布:只需使用带有匿名评估的箭头函数即可!
完全非侵入性,不会扰乱命名空间,并且只需要一行:
演示:
在尚不支持新的我的观点是正确的;只需将其包含在括号中即可。{[myKey]: myValue}
语法的环境中很有用,例如 - 显然;我刚刚在我的 Web 开发者控制台 — Firefox 72.0.1(2020 年 1 月 8 日发布)上进行了验证。(我确信您可能会制定一些更强大/可扩展的解决方案或任何涉及巧妙使用
reduce
的解决方案,但此时您'通过将对象创建分解为它自己的函数而不是强制地将其全部内联起来可能会更好)这并不重要,因为OP十年前就提出了这个问题,但为了完整性并证明它是如何完全对所述问题的答案,我将在原始上下文中展示这一点:
Update: As a commenter pointed out, any version of JavaScript that supports arrow functions will also support
({[myKey]:myValue})
, so this answer has no actual use-case (and, in fact, it might break in some bizarre corner-cases).Don't use the below-listed method.
I can't believe this hasn't been posted yet: just use arrow functions with anonymous evaluation!
Completely non-invasive, doesn't mess with the namespace, and it takes just one line:
demo:
useful in environments that don't support the newI stand corrected; just wrap the thing in parenthesis and it works.{[myKey]: myValue}
syntax yet, such as—apparently; I just verified it on my Web Developer Console—Firefox 72.0.1, released 2020-01-08.(I'm sure you could potentially make some more powerful/extensible solutions or whatever involving clever use of
reduce
, but at that point you'd probably be better served by just breaking out the Object-creation into its own function instead of compulsively jamming it all inline)not that it matters since OP asked this ten years ago, but for completeness' sake and to demonstrate how it is exactly the answer to the question as stated, I'll show this in the original context:
给定代码:
翻译:
如您所见,
{ thetop : 10 }
声明没有使用变量thetop
。相反,它创建一个带有名为thetop
的键的对象。如果您希望键是变量thetop
的值,那么您必须在thetop
周围使用方括号:ES6 中引入了方括号语法。在早期版本的 JavaScript 中,您必须执行以下操作:
Given code:
Translation:
As you can see, the
{ thetop : 10 }
declaration doesn't make use of the variablethetop
. Instead it creates an object with a key namedthetop
. If you want the key to be the value of the variablethetop
, then you will have to use square brackets aroundthetop
:The square bracket syntax has been introduced with ES6. In earlier versions of JavaScript, you would have to do the following:
2020 更新/示例...
一个更复杂的示例,使用括号和文字...您可能需要使用 vue/axios 来做一些事情。将文字括在括号中,因此
2020 update/example...
A more complex example, using brackets and literals...something you may have to do for example with vue/axios. Wrap the literal in the brackets, so
分配键的 ES5 实现如下:
我附加了一个用于转换为裸对象的代码片段。
ES5 implementation to assign keys is below:
I've attached a snippet I used to convert to bare object.
如果你希望对象键与变量名相同,ES 2015 中有一个简写。
ECMAScript 2015 中的新表示法
If you want object key to be same as variable name, there's a short hand in ES 2015.
New notations in ECMAScript 2015
你可以这样做:
You can do it this way:
这样你也可以获得想要的输出
This way also you can achieve desired output
您可以对 ES5 执行以下操作:
或提取到函数:
You could do the following for ES5:
Or extract to a function: