gpt4 book ai didi

javascript - 为什么 JS 计算属性语法允许赋值表达式?

转载 作者:行者123 更新时间:2023-12-01 16:10:39 25 4
gpt4 key购买 nike

Javascript 语法允许在计算属性名称 (ComputedPropertyName) 中使用赋值表达式 (AssignmentExpression)(参见 12.2.6 Object InitializerES 2015 Grammarkdown):

ComputedPropertyName[Yield] :
`[` AssignmentExpression[In, ?Yield] `]`

这允许一种写法,例如:

 var data;
var a= {
[data="something"]: "x"
}

为什么这有用?为什么用 ConditionalExpression 还不够?这似乎是不必要的语法复杂化。

最佳答案

基本上,这与您的第一个想法相反。不需要对 ComputedPropertyName 中允许的表达式类型进行特殊处理,因此语言设计者选择使用“正常”表达式,即 AssignmentExpression

如果您查看 EcmaScript 语法,您会发现唯一使用 ConditionalExpression 的地方是在 AssignmentExpression 的定义中。在这方面,它类似于 AssignmentExpression 之前的文法中定义的所有其他表达式子语法,它们仅用于定义文法的运算符优先顺序。 (基于运算符优先级解析的实用解析器可能甚至没有对应于这些各种非终结符的任何内容。)

基本上,除了定义运算符优先级外,文法中只使用了两个表达式非终结符:AssignmentExpressionExpression。差异与不幸的 C 遗产有关 comma operator (评估然后忘记它的第一个参数)。 Expression 用于允许使用逗号运算符的上下文:

Expression: AssignmentExpression
| Expression ',' AssignmentExpression

几乎包括 语句 中所有使用表达式的地方。 AssignmentExpression(没有其他 Expression 子语法)用在 , 表示表达式列表的上下文中:参数列表、数组文字等。很难证明将赋值表达式的使用仅限于语言的一个模糊 Angular 落,而它们在任何其他允许表达式的上下文中都可以很好地使用。

实际上有一个论点使 ComputedPropertyName 语法更加宽松,而不是禁止使用逗号运算符,因为属性访问语法 (MemberExpression '[' Expression '] ') 是允许使用逗号运算符 的众多地方之一,尽管它实际上从未被使用过。

实际上编写 array[i, j] 是——至少恕我直言——糟糕的风格,因为它几乎肯定会让没有意识到它与 array[j](除非评估 i 有副作用)。在逗号运算符可用的语言(C、C++、EcmaScript 等)中,这种用法主要是一种混淆技术,StackOverflow 包含大量混淆有效的证据。我认为,只有保持与混淆代码的向后兼容性的需要才阻止了委员会从属性访问语法中删除逗号运算符。

由于 ComputedPropertyName 语法基本上类似于属性访问语法,因此人们可能希望它也是 Expression,而不是 AssignmentExpression .但显然,委员会能够抵制这种诱惑。

关于javascript - 为什么 JS 计算属性语法允许赋值表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59372794/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com