在node.js中,“ process.stdout.write”和“ console.log”之间有什么区别?

EDIT:在使用process时,将console.log用作变量会显示很多无法读取的字符。 stdout.write显示了一个对象。

为什么?

评论

你能举个例子吗? console.log()调用带有格式化输出的process.stdout.write。有关实现,请参见console.js中的format()。

#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.writeconsole.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进行自定义行为或使用控制台输入。