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

IT技术 javascript node.js
2021-01-30 04:31:38

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

编辑:在使用 process.stdout.write 显示对象时,将 console.log 用于变量显示了很多不可读的字符。

这是为什么?

6个回答

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

目前(v0.10.ish):

Console.prototype.log = function() {
  this._stdout.write(util.format.apply(this, arguments) + '\n');
};
console.log() 广播到调试客户端要在不打印到 stdio 的情况下广播到调试客户端,您可以使用require('inspector').console.log().
2021-03-24 04:31:38
另外值得一提的是,console.log()似乎添加了换行符
2021-03-28 04:31:38

查看 Node 文档,显然 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

1) v0.9.9 已经两年了 2) 文档不正确,按照 v0.9.9,格式是通过 util 插入的
2021-03-30 04:31:38
对于后来出现的人,请注意 v0.3.1 是很久以前的事了,从那时起事情已经发生了变化。:)
2021-04-04 04:31:38
实际上,该文档似乎从未更新过并且仍然存在(DRY 任何人?)。我将提交 PR 来解决这个问题,感谢您通知我这个问题:)
2021-04-05 04:31:38
...不。刚刚查看了 v0.9.9 文档,console.log 仍然只是 process.stdout.write 的别名,带有换行符。请在发表评论之前进行研究。 nodejs.org/docs/v0.9.9/api/process.html#process.stdout
2021-04-14 04:31:38

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

正如Mauvis LefordTK-421指出的那样,它console.logline-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可以做得更多。

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

    console.log("Hello World"); //You don't need the break line here because it was already formated 而且那个奇怪的角色确实消失了

  2. 你可以写多个字符串

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

  3. 你可以建立关联

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

就是这样,由于该util.format.apply部分提供了附加的功能(我可以谈论很多关于这到底是做什么的,但您明白我的意思,您可以在此处阅读更多内容)。

我希望有人觉得这些信息有用。

%只是 shell 表示文件末尾没有换行符的方式。
2021-03-16 04:31:38
%通过简单地process.stdout.write('\n');在我的循环结束时调用来解决了最后的问题(例如,如果你有的话)
2021-03-27 04:31:38
如果您解释了如何使用stdout.write和避免获取,这也将非常有帮助%
2021-03-31 04:31:38
@DaveNewton 你的观点很重要,因为这意味着如果你将程序的输出重定向到一个文件,例如,你不会%在文件中得到它
2021-04-05 04:31:38

一个尚未提及的重大区别是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)
是的,实际上是一个漂亮的印刷品。
2021-03-20 04:31:38

这种情况下的另一个重要区别是process.stdout.clearLine()process.stdout.cursorTo(0)

如果您只想在一行中显示下载或处理的百分比,这将非常有用。如果您使用 clearLine(),cursorTo()console.log()将不起作用,因为它还会将 \n 附加到文本中。试试这个例子:

var totalTime = 5000;
var waitInterval = totalTime / 10;
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 + 100)
这就是我要找的。谢谢。
2021-04-10 04:31:38