来自JavaScript eloquent书籍:
许多语言中没有产生有意义值的操作仅仅是因为它们必须产生一些值而导致undefined。
解释器需要从其所读取的任何内容产生值吗?
这些不会产生有意义值的操作的例子有哪些?
来自JavaScript eloquent书籍:
许多语言中没有产生有意义值的操作仅仅是因为它们必须产生一些值而导致undefined。
解释器需要从其所读取的任何内容产生值吗?
这些不会产生有意义值的操作的例子有哪些?
语句和表达式都有值,但非表达式语句的值在代码中不可访问。这在规范级别上是有意义的,在浏览器的控制台中也可以看到,但它实际上没有任何日常实用价值。声明在代码的逐步执行之外,规范级别上没有结果值(尽管控制台显示其结果为undefined)。
要查看它的操作,请打开您的浏览器控制台,键入以下内容:
if (true) "foo"
输入"foo"
并按下回车键。你将看到"foo"
。现在尝试:
if (false) "foo"
输入并按回车键,你会看到undefined
。
为什么?因为if语句的执行结果是它的语句块(如果条件为true)或undefined
(如果条件为false)。
上面链接中关于if (condition) statement
的说明如下:
语义运行时:执行
IfStatement:
if (
Expression)
Statement
- Let exprRef be the result of evaluating Expression.
- Let exprValue be ToBoolean(? GetValue(exprRef)).
- If exprValue is false, then
Else
- Return NormalCompletion(undefined).
- Let stmtCompletion be the result of evaluating Statement.
- Return Completion(UpdateEmpty(stmtCompletion, undefined)).
其中Completion(...)创建一个完成记录,第一个参数是完成结果的值。
在控制台中尝试另一个例子:
var n = 4; while (n--) { "body " + n; }
"body 0"
,因为while
语句的值是其正文的最后一次执行的值(如果它从未执行过正文,则为undefined
)。
if (true) "foo"
中的"foo"
有效; 它是一个表达式声明,其中表达式是字符串文字。