空语句的计算结果是什么?

Ben*_*Ben -9 javascript evaluation undefined

我的一个非常好的问题是:在 JavaScript 中,空语句的计算结果是什么?

\n

这是空语句:

\n

;

\n

...如果我评估它,我会得到undefined。

\n

\r\n
\r\n
console.log(eval(\';\')) // \'undefined\'
Run Code Online (Sandbox Code Playgroud)\r\n
\r\n
\r\n

\n

然而,这是另一个空语句(在包含数字文字的语句之后):

\n

1;;

\n

...然而这似乎评估为1.

\n

\r\n
\r\n
console.log(eval(\'1;;\')) // \'1\'
Run Code Online (Sandbox Code Playgroud)\r\n
\r\n
\r\n

\n

这让我很惊讶。

\n

那么,空语句的计算结果是什么?

\n

我注意到规范说空语句返回“ empty”。我还不知道这意味着什么。

\n

规范还说:

\n
\n

当使用术语 \xe2\x80\x9cempty\xe2\x80\x9d 来命名一个值时,它相当于说 \xe2\x80\x9cno 任何类型的值 \xe2\x80\x9d。

\n
\n

因此,空语句返回“没有任何类型的值”。这意味着它无法返回undefined(这是 type 的值Undefined)。我不确定这如何映射到用户态代码。

\n

Ber*_*rgi 5

空语句根本不返回任何内容(空:“没有任何类型的值”)。语句列表,就像脚本正文中将代码eval解析为的语句列表一样,返回最后一条返回任何内容的语句的值:

\n
\n

StatementList 的值是StatementList 中最后一个产生值的项的值。例如,以下对\neval 函数的调用都返回值 1:

\n
eval("1;;;;;")\neval("1;{}")\neval("1;var a;")\n
Run Code Online (Sandbox Code Playgroud)\n
\n

空语句列表、空脚本、空块或不包含产生值的语句的语句列表的计算结果为空。

\n

然后PerformEval操作在步骤 30中将该空值转换为undefined:

\n
\n

如果结果.[[Type]] 为normal且结果.[[Value]] 为empty,则
\n\xc2\xa0 将结果设置为 NormalCompletion( undefined)。

\n
\n