JavaScript解释器是否会从它读取的任何内容中产生值?

3

来自JavaScript eloquent书籍:

许多语言中没有产生有意义值的操作仅仅是因为它们必须产生一些值而导致undefined。

解释器需要从其所读取的任何内容产生值吗?
这些不会产生有意义值的操作的例子有哪些?


JS语言的定义是所有表达式都有一个值。但是有些函数并不返回任何东西。 - SLaks
@SLaks 但在控制台函数中返回undefined,这是一个值。 - Moaaz Bhnas
1
这就是控制台的作用。控制台不是语言的一部分。 - Pointy
1个回答

4

语句和表达式都有值,但非表达式语句的值在代码中不可访问。这在规范级别上是有意义的,在浏览器的控制台中也可以看到,但它实际上没有任何日常实用价值。声明在代码的逐步执行之外,规范级别上没有结果值(尽管控制台显示其结果为undefined)。

要查看它的操作,请打开您的浏览器控制台,键入以下内容:

if (true) "foo"

输入"foo"并按下回车键。你将看到"foo"。现在尝试:

if (false) "foo"

输入并按回车键,你会看到undefined

为什么?因为if语句的执行结果是它的语句块(如果条件为true)或undefined(如果条件为false)。

上面链接中关于if (condition) statement的说明如下:

语义运行时:执行

IfStatement: if (Expression) Statement

  1. Let exprRef be the result of evaluating Expression.
  2. Let exprValue be ToBoolean(? GetValue(exprRef)).
  3. If exprValue is false, then
    1. Return NormalCompletion(undefined).
    Else
    1. Let stmtCompletion be the result of evaluating Statement.
  4. Return Completion(UpdateEmpty(stmtCompletion, undefined)).

其中Completion(...)创建一个完成记录,第一个参数是完成结果的

在控制台中尝试另一个例子:

var n = 4; while (n--) { "body " + n; }

结果是"body 0",因为while语句的值是其正文的最后一次执行的值(如果它从未执行过正文,则为undefined)。
* “非表达式语句” - JavaScript允许任何表达式在预期为语句的位置出现时作为语句(这就是函数调用作为语句的方式,例如)。这就是为什么我的if (true) "foo"中的"foo"有效; 它是一个表达式声明,其中表达式是字符串文字。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接