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

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