来自JavaScript雄辩书:
许多语言中的许多操作不会产生有意义的价值 仅仅因为必须而产生未定义 产生一些值。
口译员是否必须从读取的内容中产生一个值?
这些操作没有产生有意义的价值的示例?
语句和表达式都有值,但是在代码中无法访问非表达语句*的值。这在规范级别上是有意义的,您可以在浏览器的控制台中看到它,但实际上并没有任何日常实用程序。声明不在代码的分步执行之外,在规范级别上没有结果值(件显示undefined
作为其结果)。
要在行动中看到它,请打开浏览器控制台,键入以下内容:
if (true) "foo"
...并按Enter。您会看到"foo"
。现在尝试:
if (false) "foo"
...并按Enter。您会看到undefined
。
为什么?因为if
语句的结果是其身体的结果(如果条件为真)或undefined
(如果条件为false)。
这是上面的规格链接有关if (condition) statement
的说法:
运行时语义:评估
ifstatement :
if (
表达式)
语句
- 让 exprref 是评估表达式。
的结果- 让 exprvalue be toboolean(?getValue( exprref ))。
- 如果 exprvalue 是 false ,然后
别的
- 返回strumanCompletion( UNDEFINED )。
- 令 stmtcompletion 是评估语句。
的结果- 返回完成(updateEmpty( stmtcompletion , undefined ))。
...其中完成(...)创建一个完成记录;第一个参数是完成的 value 。
这是在您的控制台中尝试的另一个:
var n = 4; while (n--) { "body " + n; }
结果是 "body 0"
,因为 while
语句的值是上次执行的值(或undefined
,如果从未执行过该身体)。
* "非表达语句" - JavaScript允许在预期语句的位置出现任何表达式作为语句(例如,这是函数调用作为语句的工作方式)。这就是为什么我的"foo"
在if (true) "foo"
中工作的原因;这是一个表达式语句,其中表达式为字符串文字。