我在Google Chrome控制台中尝试了以下代码,并获得了此输出。为什么还要再打印4张?
var i = 0;
do{
console.log(i);
i++;
} while(i < 5);
输出:
0
1
2
3
4
4
答案 0 :(得分:5)
最后没有多余的4。您的循环是正确的,并且工作正常:)。这是i++
表达式的返回值,您在开发人员控制台中误认为console.log
。试试这个,您会发现的;
var i=0;do{console.log('i = ', i);i++;}while(i<5);
编辑感谢@ggorlen指出这一点,它是块({}
)中最后一个表达式的返回值,其返回值i++
,以i
递增值并返回它的最后一个值(如果i = 4; i++
返回4并得出i = 5),({++i
返回5并得出i = 5)
var i=0;do{console.log('i = ', i);++i;}while(i<5);
将返回值为5
答案 1 :(得分:2)
JavaScript具有"Completion Records"的概念。基本上每个语句都会生成一个完成记录。
完成类型是一种记录,用于解释值和控制流的运行时传播,例如执行非本地控制权转移的语句(中断,继续,返回和抛出)的行为。
您通常无法在用户登陆代码中对其进行任何操作,但是运行时需要这些来正确执行程序。但是,Chrome控制台会打印它执行的最后一条语句的完成记录的值。
在不涉及太多细节的情况下,会发生以下情况:
do...while
循环是其主体的完成记录的值。i++;
)。 The value of the completion record of an expression is the value the expression evaluates to。展示此行为的最简单示例就是
42;
对该表达式 statement 求值的结果是一个完成记录,看起来像
{
type: normal,
value: 42,
target: empty
}
您将在控制台中看到它打印42
,因为那是表达式语句的完成记录的值。
一个稍微进化的示例:
if (true) {
42;
}
将打印相同的内容。
答案 2 :(得分:0)