ChatGPT解决这个技术问题 Extra ChatGPT

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

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

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

这是为什么?

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

T
TK-421

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() 似乎添加了一个换行符
console.log()debugging clients广播。要广播到调试客户端而不打印到 stdio,您可以使用 require('inspector').console.log()
M
Mauvis Ledford

查看 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


对于后来出现的人,请注意 v0.3.1 是很久以前的事了,从那以后情况发生了变化。 :)
...不。刚刚查看了 v0.9.9 文档,console.log 仍然只是带有换行符的 process.stdout.write 的别名。请在发表评论之前进行研究。 nodejs.org/docs/v0.9.9/api/process.html#process.stdout
1) v0.9.9 已有两年历史 2) 文档不正确,as per v0.9.9 the format is interpolated through util
实际上,该文档似乎从未更新过并且仍然存在(DRY 有人吗?)。我将提交 PR 来解决这个问题,感谢您通知我这个问题 :)
C
Community

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

正如 Mauvis LefordTK-421 所指出的,console.log 在行尾添加了一个 line-break 字符 (\n),但这并不是它的全部功能。

代码至少从 0.10.X 版本开始就没有改变,现在我们有了一个 5.X 版本。

Here 是代码:

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"); //这里不需要换行,因为它已经格式化了,而且那个奇怪的字符确实消失了 你可以写多个字符串 console.log("Hello", "World");您可以进行关联 console.log("Hello %s", "World") //当“World”在变量中时很有用

就是这样,添加的功能要归功于 util.format.apply 部分(我可以谈论很多关于这究竟是做什么的,但你明白我的意思,你可以阅读更多 here)。

我希望有人发现这些信息有用。


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

尚未提及的一大区别是 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)

是的,实际上是漂亮的印刷品。
R
Ravi Makwana

在这种情况下,另一个重要的区别是 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)

这就是我要找的。谢谢。
N
Nova

在获得 https.request for 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 打印在检索点获得的信息并添加一个新行。

这是我能解释它的最好方式。


R
Rishu Anand

简单的区别是:console.log() 方法自动附加换行符。这意味着如果我们循环并打印结果,每个结果都会打印在新行中。

process.stdout.write() 方法不附加换行符。用于打印图案。


u
user9342572809

Console.log 实现 process.sdout.write,process.sdout.write 是一个缓冲区/流,将直接在您的控制台中输出。

根据我的 puglin serverlineconsole = new Console(consoleOptions),您可以使用自己的 readline 系统重写 Console 类。

可以看到console.log的代码源:

v14.x - lib/internal/console/constructor.js;

对于旧版本:v10.0.0 - lib/console.js。

看更多 :

readline.createInterface 进行自定义行为或使用控制台输入。


a
ascii

console.log() 每次调用时都会添加大量内容和新行

process.stdout.write() 只是纯文本,没有格式

至少我是这么教的


s
suchislife

对于喜欢 Deno 的人,我可以通过将以下 ANSI Escape Sequences 与 Deno 的 process.stdout.write 版本结合使用来实现这一点。

ESC[2K  clears entire line
ESC[#G  moves cursor to column #

代码

/*
    Console.log() to the same line
    Supported in Deno 1.8.1
*/

const myTextEncoder : TextEncoder = new TextEncoder();

let counter : number = 0;

while(counter < 100000) {

  // ESC[2K clears entire line
  await Deno.stdout.write(myTextEncoder.encode(`\x1b[2K`));
  // ESC[#G moves cursor to column #
  await Deno.stdout.write(myTextEncoder.encode(`\x1b[0G`));
  // OUTPUT incremented counter
  await Deno.stdout.write(myTextEncoder.encode(`COUNTER: ${counter++}`));

}