查看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.
让我烦恼的是:为什么?我想这意味着const
在let
/const
出现之前就已经被保留了几年,但它在当时有什么意义呢?它只是为未来的意图保留的吗?
我想这意味着
const
在let
/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
作为保留关键字。自那以后,保留关键字的规则变得更加复杂,因此它们不再在词汇语法中描述,而是作为静态语义限制来描述。