简写属性名称* this *

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了简写属性名称* this *相关的知识,希望对你有一定的参考价值。

以下代码失败

let x = {this}

为什么我不能用这个简写属性名?


来自浏览器的错误消息

chrome 66.0.3359.117:未捕获的SyntaxError:意外的标记}

firefox 59.0.1:这是一个无效的标识符

edge 41.16299.371.0:标识符的关键字使用无效

我不太了解这些消息所说的内容。


为了说清楚,下面的代码运行正常

let x = 5
let y = {x}
let z = {this:this}

console.log({x,y,z})
答案

According to the ECMA spec(我把粗体放入了重要的东西):

12.2.6 Object Initializer

NOTE 1 An object initializer is an expression describing the initialization of an Object, written in a form resembling a literal. It is a list of zero or more pairs of property keys and associated values, enclosed in curly brackets. The values need not be literals; they are evaluated each time the object initializer is evaluated.

Syntax

  • ObjectLiteral [收益率]: {} {PropertyDefinitionList [?yield]} {PropertyDefinitionList [?yield],}
  • PropertyDefinitionList [Yield]: PropertyDefinition [?产量] PropertyDefinitionList [?Yield],PropertyDefinition [?Yield]
  • PropertyDefinition [收益率]: IdentifierReference [?产量] CoverInitializedName [?产量] PropertyName [?Yield]:AssignmentExpression [In,?Yield] MethodDefinition [?产量]
  • PropertyName [收益率]: LiteralPropertyName ComputedPropertyName [?产量]
  • LiteralPropertyName: IdentifierName 字符串字面量 NumericLiteral
  • ComputedPropertyName [Yield]: - [AssignmentExpression [In,?Yield]] CoverInitializedName [收益率]: IdentifierReference [?Yield] Initializer [In,?Yield]
  • 初始化器[In,Yield]: = AssignmentExpression [?In,?Yield]

NOTE 2 MethodDefinition is defined in 14.3.

NOTE 3 In certain contexts, ObjectLiteral is used as a cover grammar for a more restricted secondary grammar. The CoverInitializedName production is necessary to fully cover these secondary grammars. However, use of this production results in an early Syntax Error in normal contexts where an actual ObjectLiteral is expected.


12.1 Identifiers

Syntax

  • IdentifierReference [收益率]: 识别码 [〜收益率]收益率
  • BindingIdentifier [收益率]: 识别码 [〜收益率]收益率
  • LabelIdentifier [收益率]: 识别码 [〜收益率]收益率
  • 标识符: IdentifierName但不是ReservedWord

这意味着在简写中let x = {Identifier}不允许保留字作为标识符。 this是一个保守的词,看看11.6.2 Reserved Words和向前。另一方面,我们看到扩展的写作方式是不同的: let x = {PropertyName:AssignmentExpression}其中PropertName是ComputedPropertyName或LiteralPropertyName,它是不排除保留字的IdentifierName。因此let x = {this: this}let x = {class: 10}没有问题。但是,它没有解释为什么会这样,也许它会使语法复杂化或使其模糊不清?

另一答案

javascript中的this是一个关键字(不是变量),因此它没有名称。

{ x }的情况下,x有一个名字,“x”,它的值。

{ this }this没有名字。 this只是在解释代码时表示正确的值。

以上是关于简写属性名称* this *的主要内容,如果未能解决你的问题,请参考以下文章

11.按要求编写Java应用程序。 创建一个叫做机动车的类: 属性:车牌号(String),车速(int),载重量(double) 功能:加速(车速自增)减速(车速自减)修改车牌号,查询车的(代码片段

代码干货|内联 Style 简写属性的发现

从视图/控制器获取 pimcore 片段名称

0065 animation:动画动画序列动画常见属性 动画简写方式速度曲线细节案例大数据热点图案例奔跑的熊大

很实用的JQuery代码片段(转)

css常用的简写技巧_css background简写css border 简写css font属性简写等