EDIT:在使用process时,将console.log用作变量会显示很多无法读取的字符。 stdout.write显示了一个对象。
为什么?
#1 楼
console.log()
调用带格式化输出的process.stdout.write
。有关实现,请参见console.js中的format()
。当前(v0.10.ish):
Console.prototype.log = function() {
this._stdout.write(util.format.apply(this, arguments) + '\n');
};
评论
还值得一提的是console.log()似乎添加了换行符
– jchook
18年4月12日在1:56
console.log()还会广播到调试客户端。要向调试客户端进行广播而不打印到stdio,可以使用require('inspector')。console.log()。
–尼古拉斯E.
20-10-26在19:28
#2 楼
看一下Node文档,显然console.log只是process.stdout.write,结尾处是一个换行符: org / docs / v0.3.1 / api / process.html#process.stdout评论
对于后来出现的人,请注意v0.3.1是很久以前的事情,此后发生了变化。 :)
–布伦丹
2015年2月25日4:17在
...不。仅看了v0.9.9文档,console.log仍然只是带有换行符的process.stdout.write的别名。发表评论之前,请先进行研究。 nodejs.org/docs/v0.9.9/api/process.html#process.stdout
–莫维斯·莱德福德
2015年2月25日在17:53
1)v0.9.9已有两年历史了2)文档不正确,按照v0.9.9,格式是通过util插值的
–布伦丹
15年2月26日在5:21
实际上,似乎文档从未更新过并且仍然存在(有人干燥吗?)。我将提交PR来解决此问题,感谢您将此问题通知我:)
–布伦丹
15年2月26日在5:25
另外,请参阅nodejs.org/docs/latest/api/…和nodejs.org/docs/latest/api/…。
–查尔斯·伍德
17年12月29日在19:50
#3 楼
我知道这是一个非常老的问题,但我没有看到任何人谈论process.stdout.write
和console.log
之间的主要区别。我只想提一下。正如Mauvis Leford和TK-421指出的那样,
console.log
在行尾(line-break
)末尾添加了\n
字符,但这还不是全部。至少从
0.10.X
版本开始,代码没有更改,现在我们有了5.X
版本。这是代码:
Console.prototype.log = function() {
this._stdout.write(util.format.apply(this, arguments) + '\n');
};
如您所见,其中有一部分说
.apply(this, arguments)
,并且在功能上有很大的不同。用示例更容易解释:process.stdout.write
具有非常基本的功能,您可以在其中编写一些内容,例如:process.stdout.write("Hello World\n");
如果不将换行符放在末尾,则会在字符串后面出现一个奇怪的字符,如下所示:
process.stdout.write("Hello World"); //Hello World%
(我认为这意味着就像“程序的末尾”,因此只有在文件末尾使用
process.stdout.write
且未添加换行符时,您才会看到它。console.log
可以做更多的事情。您可以以相同的方式使用它
console.log("Hello World"); //You don't need the break line here because it was already formated
,而且奇怪的字符确实消失了您可以编写多个字符串
console.log("Hello", "World");
您可以建立关联
console.log("Hello %s", "World") //Useful when "World" is inside a variable
就这样,
util.format.apply
部分提供了附加功能(我可以谈论很多确切的功能,但您明白我的意思,您可以阅读这里有更多内容。)我希望有人觉得这些信息有用。
评论
如果您解释了如何使用stdout.write并避免获取%,这也将非常有帮助
–穆罕默德·阿雷夫(Muhammad Aref)
17年1月17日在16:07
我通过简单地调用process.stdout.write('\ n');解决了最后获得%的问题。在我的循环结束时(例如,如果您有)
–穆罕默德·阿雷夫(Muhammad Aref)
17年1月17日在16:09
%只是shell表示文件末尾没有换行符的方式。
–戴夫·牛顿
19年6月13日在2:08
@DaveNewton的观点很重要,因为这意味着,例如,如果将程序的输出重定向到文件,则不会在文件中获得该%
–mr.mams
20年4月3日,10:30
#4 楼
尚未提及的一大不同之处是process.stdout仅将字符串作为参数(也可以通过管道传输),而console.log采用任何Javascript数据类型。例如:
// ok
console.log(null)
console.log(undefined)
console.log('hi')
console.log(1)
console.log([1])
console.log({one:1})
console.log(true)
console.log(Symbol('mysymbol'))
// any other data type passed as param will throw a TypeError
process.stdout.write('1')
// can also pipe a readable stream (assuming `file.txt` exists)
const fs = require('fs')
fs.createReadStream('file.txt').pipe(process.stdout)
#5 楼
在这种情况下,另一个重要区别是process.stdout.clearLine()
和process.stdout.cursorTo(0)
。 如果您只想在一行中显示下载或处理的百分比,这将很有用。如果您将clearLine(),cursorTo()与
console.log()
一起使用,则该命令将无效,因为它还会在文本后附加\ n。只需尝试以下示例:var waitInterval = 500;
var totalTime = 5000;
var currentInterval = 0;
function showPercentage(percentage){
process.stdout.clearLine();
process.stdout.cursorTo(0);
console.log(`Processing ${percentage}%...` ); //replace this line with process.stdout.write(`Processing ${percentage}%...`);
}
var interval = setInterval(function(){
currentInterval += waitInterval;
showPercentage((currentInterval/totalTime) * 100);
}, waitInterval);
setTimeout(function(){
clearInterval(interval);
}, totalTime);
评论
这就是我要的东西。谢谢。
– Patrick P.
20 Mar 18 '20 at 6:52
#6 楼
在获得https.request for post方法的帮助后,在研究此内容时我刚刚注意到了一些东西。以为我分享了一些有助于理解的信息。但是,还有一些这样的示例更容易解释。var req = https.request(options, (res) => {
res.on('data', (d) => {
process.stdout.write(d);
console.log(d)
});
});
process.stdout.write
将正确打印数据而无需换行。但是console.log
将打印新行,但数据无法正确显示,例如以process.stdout.write(d);
为例。 br /> var req = https.request(options, (res) => {
var dataQueue = "";
res.on("data", function (d) {
dataQueue += d;
});
res.on("end", function () {
console.log(dataQueue);
});
});
所以基本上:
console.log(d)
打印在检索时获得的信息并添加新行。这是我能解释的最好方法。
#7 楼
简单的区别是:console.log()方法自动添加换行符。这意味着,如果我们正在遍历并打印结果,则每个结果都将以换行方式打印。用于打印图案。
#8 楼
Console.log实现process.sdout.write,process.sdout.write是一个缓冲区/流,将直接在您的控制台中输出。
根据我的puglin serverline:
console = new Console(consoleOptions)
,您可以使用自己的readline系统重写Console类。您可以看到console.log的代码源:
v14.x-lib / internal / console / constructor.js;
对于旧版本:v10.0.0-lib / console.js。
查看更多内容:
readline.createInterface进行自定义行为或使用控制台输入。
评论
你能举个例子吗? console.log()调用带有格式化输出的process.stdout.write。有关实现,请参见console.js中的format()。