【问题标题】:What is the significance of double square brackets in javascript property names when initializing the object?初始化对象时,javascript属性名称中的双方括号有什么意义?
【发布时间】:2021-07-23 07:33:38
【问题描述】:

我目前正在查看前段时间编写的一些代码,我不确定为什么以下 2 条语句是相等的,出于某种原因我选择了第一种方式。

const a = 'foo';
const b = { [[a]]: 'boo' } // This is in code
const c = { [a]: 'boo' } // ES6 way

它们似乎都产生了完全相同的结果。我不确定第一个选项是否是 ES6 之前的有效选项,但是当我在节点 0.10 上尝试时,它没有将它们中的任何一个识别为有效语句。了解为什么双方括号会产生相同的结果会很有帮助。

更新:

看到 cmets/answer 后,我尝试确认是否将方括号内的表达式视为数组,确实如此。

> const foo = 'foo'
undefined
> const boo = 'boo'
undefined
> const combo = { [foo,boo]: 'foo boo' }
const combo = { [foo,boo]: 'foo boo' } // This doesn't work foo,boo is not a valid expression 
                    ^

Uncaught SyntaxError: Unexpected token ','
> const combo = { [[foo,boo]]: 'foo boo' }
undefined
> combo
{ 'foo,boo': 'foo boo' } // Treats expression itself as array and `toString()` gets called on the array producing 'foo,boo' string

【问题讨论】:

  • 不知道应该是什么。我的 IDE 说它不是有效的 JS。
  • 我怀疑在b 的情况下,您正在创建一个包含单个元素a 的数组,然后尝试通过计算的键语法将其用作对象键。由于对象键是字符串,因此调用数组的 toString 方法,在您的情况下最终将成为字符串 'foo',并用作计算值

标签: javascript node.js ecma


【解决方案1】:

在 ES6 中,[expression]: value 解释如下:

  • 评估expression
  • 将结果转换为字符串
  • 将此字符串用作键

分别

 given [ [a] ]: 'boo'

 evaluate [a]   => ['foo']
 String ['foo'] => 'foo'
 result         => {'foo': 'boo'}

换句话说,多余的括号会被忽略。

【讨论】:

  • 谢谢 - [表达式] 真的被视为单个元素数组,然后在该数组上运行 toString 吗?
  • @opensourcegeek:不,最外面的括号是语法的一部分。 toString 应用于其中的内容,例如给expression 不给[expression]
猜你喜欢
  • 2013-06-15
  • 2016-04-22
  • 2011-09-09
  • 1970-01-01
  • 2010-12-29
  • 1970-01-01
相关资源
最近更新 更多