为什么"const"在JS中是保留关键字,而"let"不是



查看JS保留字(MDN),看起来新特性是以向后兼容的方式引入的,这意味着var let = 0, async = 1, await = 2;是一个有效的表达式,至少在strict模式之外。参见:为什么await和async变量名是有效的?为什么在规范

中将' let '指定为保留关键字?然而,const是一个实际的关键字,所以你不能做var const = 0;(见:这篇文章)。

var let = 100; // OK
var const = 100; // SyntaxError: Cannot use the keyword 'const' as a variable name.

让我烦恼的是:为什么?我想这意味着constlet/const出现之前就已经被保留了几年,但它在当时有什么意义呢?它只是为未来的意图保留的吗?

我想这意味着constlet/const出现之前已经被保留了几年?

是的。从ECMAScript 1开始,您可以发现它是一个保留字。

但是它在当时有什么意义呢?它只是为未来的意图保留的吗?

Yes:

未来保留字
以下单词在建议的扩展中用作关键字,因此保留以允许将来采用的可能性

FutureReservedWord :: one of
case   debugger  export   super
catch  default   extends  switch
class  do        finally  throw
const  enum      import   try

这些语句中的许多都在后来的语言版本中使用,如ES3中的switch/case/default, ES3中的try/catch/finally/throw, ES6中的class/extends/super, ES6中的export/import, ES3中的do(与while一起使用),ES5中的debugger语句和ES6中的const语句。enum是目前为止所有语言版本中唯一一个为将来无条件保留的关键字。

ECMAScript 2甚至添加了更多类似java的保留关键字,从那时起的列表:

abstract  do import short
boolean   double      instanceof  static
byte      enum        int         super
case      export      interface   switch
catch     extends     long        synchronized
char      final       native      throw
class     finally     package     throws
const     float       private     transient
debugger  goto        protected   try
default   implements  public      volatile

ES3实现了一些。

ES5随后删除了一些java元素,如基本类型名称和方法修饰符,但也引入了一些新的保留关键字(let,yield),并在严格模式下进行了区分:

FutureReservedWord :: one of
class  enum    extends  super
const  export  import 

以下标记在严格模式代码中出现时也被认为是FutureReservedWords:

implements  let      private    public  yield
interface   package  protected  static

ES6实现了类和模块,只留下enum,并且只在模块中引入了await作为保留关键字。自那以后,保留关键字的规则变得更加复杂,因此它们不再在词汇语法中描述,而是作为静态语义限制来描述。

最新更新