【问题标题】:Object Literal Property Value Shorthand incompatible with `this`对象文字属性值简写与 `this` 不兼容
【发布时间】:2015-12-25 23:19:56
【问题描述】:

在 JavaScript 中可以这样做:

var a = {this: this}

但是使用 ES6 属性简写我得到 SyntaxError:

var b = {this}; // SyntaxError: this is a reserved identifier

这不是一个真正的用例,但我只是想知道这两者之间有什么区别。我认为它应该做同样的事情(要么创建一个新对象,要么抛出一个错误)。

更新:

我在 Firefox 42.0 中运行此示例。但是它在 babel-node 中工作(它创建对象 { this: {} } 没有错误)。那么正确的行为是什么?

【问题讨论】:

  • 这是什么环境?它在 babel-node 中对我有用。
  • 我也一样,works fine here
  • 它似乎在 babel-node 中工作。查看我的更新。
  • 在 Chrome 中不起作用。

标签: javascript ecmascript-6


【解决方案1】:

该速记属性初始值设定项子句的语法规定,所使用的单个术语必须是一个标识符。因为this 是保留字,它不是标识符,所以会出现语法错误。

规范的相关部分是section 12.2.6

【讨论】:

  • 我同意你可以使用this作为属性名称但在 OP 中的尝试失败这一事实构成了语言缺陷,但你善良-of 习惯于作为 JavaScript 程序员。
  • 我对此感到困惑。首先,{ this } 至少在 babel-node 中对我有用。 Babel 将其编译成{ "this": this };,这是完全合法的。我知道{ break } 无法工作,即使break 被允许作为键,因为不能有标识符break。但是this 是一种特殊的标识符,如果我没有完全正确的术语,请见谅。那么,这是一个语言缺陷,还是 Babel 在不应该允许它的时候允许它,或者 OP 使用的任何引擎/处理器在它应该允许它的时候不允许它?
猜你喜欢
  • 1970-01-01
  • 2021-08-20
  • 2017-07-11
  • 2015-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多