node.js中“process.stdout.write”和“console.log”的区别?

node.js中的“process.stdout.write”和“console.log”有什么区别?

编辑:使用console.log为variables显示了很多不可读的字符,同时使用process.stdout.write显示一个对象。

这是为什么?

console.log()调用具有格式化输出的process.stdout.write 。 有关实现,请参阅console.js中的format()

目前(v0.10.ish):

 Console.prototype.log = function() { this._stdout.write(util.format.apply(this, arguments) + '\n'); }; 

查看节点docs显然console.log只是在最后一个换行符的process.stdout.write:

 console.log = function (d) { process.stdout.write(d + '\n'); }; 

来源: http : //nodejs.org/docs/v0.3.1/api/process.html#process.stdout

我知道这是一个非常古老的问题,但我没有看到任何人谈论process.stdout.writeconsole.log之间的主要区别,我只想提到它。

正如Mauvis Leford和TK-421指出的那样, console.log line-break添加了一个换行符( \n ),但这并不是全部。

代码至less从0.10.X版本没有改变,现在我们有一个5.X版本。

这里是代码:

 Console.prototype.log = function() { this._stdout.write(util.format.apply(this, arguments) + '\n'); }; 

正如你所看到的,有一部分说.apply(this, arguments) ,这对function有很大的影响。 用例子来解释一下比较容易:

process.stdout.write有一个非常基本的function,你可以在这里写一些东西,像这样:

 process.stdout.write("Hello World\n"); 

如果你不把最后一行放在最后,你会在你的string后面出现一个奇怪的字符,例如:

 process.stdout.write("Hello World"); //Hello World% 

(我认为这意味着像“程序的结束”,所以只有在process.stdout.write被使用在文件末尾,而且没有添加break行时才会看到)

另一方面, console.log可以做更多的事情。

  1. 你可以用同样的方法使用它

    console.log("Hello World"); //You don't need the break line here because it was already formated console.log("Hello World"); //You don't need the break line here because it was already formated ,怪异的angular色也消失了

  2. 你可以写多个string

    console.log("Hello", "World");

  3. 你可以build立关联

    console.log("Hello %s", "World") //Useful when "World" is inside a variable

就这样,由于util.format.apply部分(我可以讲很多关于这个function的东西,但是你明白了我的观点,你可以在这里阅读更多内容)给出了增加的function。

我希望有人find这个信息有用。

没有提到的一个很大的区别是process.stdout只将string作为参数(也可以是pipe道stream),而console.log则采用任何Javascript数据types。

例如:

 // 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) 

我刚刚注意到了一些事情,在获得https.request的post方法帮助之后进行研究。 以为我分享一些帮助理解的意见。

与其他人一样, process.stdout.write不会在console.log中添加新行。 但是也有这样的例子更容易解释。

 var req = https.request(options, (res) => { res.on('data', (d) => { process.stdout.write(d); console.log(d) }); }); 

process.stdout.write(d); 将正确打印数据而不用换行。 但是console.log(d)会打印一个新行,但是数据不能正确显示,例如<Buffer 12 34 56...

为了使console.log(d)正确显示信息,我将不得不这样做。

 var req = https.request(options, (res) => { var dataQueue = ""; res.on("data", function (d) { dataQueue += d; }); res.on("end", function () { console.log(dataQueue); }); }); 

所以基本上:

  • process.stdout.write连续打印信息作为正在检索的数据,不会添加新行。

  • console.log打印在检索点获得的信息并添加一个新行。

这是我能解释的最好方法。

在这个上下文中的另一个重要区别是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);