google d8 (v8 shell),每次按下 return 键输出 "undefined"
google d8 (v8 shell), outputs "undefined" on every press of return key
我在 linux mint rafaela 上安装了 google v8 版本 4.6.0 运行,使用 gclient 下载并使用 "make native console=readline -j4".
构建
现在每当我有 d8 shell 运行,当我按下 return 键时它输出未定义。
这种行为的原因是什么?以及如何让它停止?
例如,这里是终端的摘录。
~/js/v8/out/native/d8
V8 version 4.6.0 (candidate)
d8> print("hello world")
hello world
undefined
d8> //(I had pressed enter key here.)
undefined
d8> print("something")
something
undefined
d8>
编辑:
根据@Xufox 和@"Denys Séguret" 的回答,这里未定义的是打印函数中的 return 类型,按回车键的情况下 return 类型也是未定义的。
但为什么它在从文件加载脚本时不显示相同的行为。
前任。文件 "test.js" 包含
function foo() {
return "foo's return";
}
print("hello1");
print("hello2");
foo();
print("hello3");
print("hello4");
并在 d8 中加载它。
~/js/v8/out/native/d8
V8 version 4.6.0 (candidate)
d8> load("test.js")
hello1
hello2
hello3
hello4
undefined
d8>
它只有一个"undefined",我猜这是我在加载指令后按回车键的结果。
此外,它不显示 "foo function" 的 return 值。所以我猜,它忽略函数的 return 值和 undefined 实际上只是 return 键的结果?我错了吗?我可以说服他也忽略 return 键吗?
第二个输出是您输入的 statement/expression 的结果。在你的情况下它总是 undefined
.
尝试输入返回值的表达式,例如 2+2
。
您在浏览器的控制台中得到相同的行为:
undefined
是函数的return值。它类似于 console.log(…)
:函数 logs 内容但是 returns 什么都没有(即 undefined
) .你可以输入
typeof console.log(4);
which returns "undefined"
(在实际记录 4
之前),因为那是 return 值的类型。 return 值和记录到控制台是两个独立的过程。
看这张图:
这是来自 Firefox 的控制台。带有白色条带的行是 log messages,带有灰色条带和向左箭头的是输入,带有向右箭头的是 return值。每个浏览器的行为都不同。
一些浏览器在输入为空时不执行任何操作,但是对于空格或换行符 undefined
也会 return 编辑。
你会看到,console.log(…)
returns undefined
,但 7
实际上 returns7
。所以简单地不要使用 print(…)
,而只使用其中的值。
D8 中的每个输入都作为脚本求值,然后打印该脚本的结果。此结果是脚本的所谓 完成值 ,如语言规范中所定义。那是其中一件疯狂的 JavaScript 事情,其定义的细节非常荒谬。但粗略地说,它是最后执行的表达式语句的值,或者undefined
,如果没有执行到这样的语句。同样的概念也定义了 eval
调用的结果值。
我在 linux mint rafaela 上安装了 google v8 版本 4.6.0 运行,使用 gclient 下载并使用 "make native console=readline -j4".
构建
现在每当我有 d8 shell 运行,当我按下 return 键时它输出未定义。
这种行为的原因是什么?以及如何让它停止?
例如,这里是终端的摘录。
~/js/v8/out/native/d8 V8 version 4.6.0 (candidate) d8> print("hello world") hello world undefined d8> //(I had pressed enter key here.) undefined d8> print("something") something undefined d8>
编辑:
根据@Xufox 和@"Denys Séguret" 的回答,这里未定义的是打印函数中的 return 类型,按回车键的情况下 return 类型也是未定义的。
但为什么它在从文件加载脚本时不显示相同的行为。
前任。文件 "test.js" 包含
function foo() {
return "foo's return";
}
print("hello1");
print("hello2");
foo();
print("hello3");
print("hello4");
并在 d8 中加载它。
~/js/v8/out/native/d8 V8 version 4.6.0 (candidate) d8> load("test.js") hello1 hello2 hello3 hello4 undefined d8>
它只有一个"undefined",我猜这是我在加载指令后按回车键的结果。
此外,它不显示 "foo function" 的 return 值。所以我猜,它忽略函数的 return 值和 undefined 实际上只是 return 键的结果?我错了吗?我可以说服他也忽略 return 键吗?
第二个输出是您输入的 statement/expression 的结果。在你的情况下它总是 undefined
.
尝试输入返回值的表达式,例如 2+2
。
您在浏览器的控制台中得到相同的行为:
undefined
是函数的return值。它类似于 console.log(…)
:函数 logs 内容但是 returns 什么都没有(即 undefined
) .你可以输入
typeof console.log(4);
which returns "undefined"
(在实际记录 4
之前),因为那是 return 值的类型。 return 值和记录到控制台是两个独立的过程。
看这张图:
这是来自 Firefox 的控制台。带有白色条带的行是 log messages,带有灰色条带和向左箭头的是输入,带有向右箭头的是 return值。每个浏览器的行为都不同。
一些浏览器在输入为空时不执行任何操作,但是对于空格或换行符 undefined
也会 return 编辑。
你会看到,console.log(…)
returns undefined
,但 7
实际上 returns7
。所以简单地不要使用 print(…)
,而只使用其中的值。
D8 中的每个输入都作为脚本求值,然后打印该脚本的结果。此结果是脚本的所谓 完成值 ,如语言规范中所定义。那是其中一件疯狂的 JavaScript 事情,其定义的细节非常荒谬。但粗略地说,它是最后执行的表达式语句的值,或者undefined
,如果没有执行到这样的语句。同样的概念也定义了 eval
调用的结果值。