process.stdout.write"和“;console.log"在node . js ?

"process.stdout. "在node.js中写入“和”console.log“?

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

为什么呢?

322343 次浏览

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

目前(v0.10.ish):

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

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

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

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

代码至少从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"); < / p >

  3. 你可以进行关联

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

就是这样,增加的功能是由于util.format.apply部分(我可以谈论很多关于这到底是做什么的,但你明白我的意思,你可以阅读更多在这里)。

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

一个没有提到的很大区别是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)

我刚刚注意到,在获得https帮助后,在研究这个问题时。申请邮寄方式。我想分享一些帮助你理解的信息。

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 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)
简单的区别是: Console.log ()方法自动追加新行字符。这意味着如果我们循环遍历并打印结果,每个结果将在新行中打印。

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


实现process.sdout。Write, process. sout . Write是一个直接输出到控制台的缓冲区/流。

根据我的puglin serverline: console = new Console(consoleOptions),你可以用你自己的readline系统重写Console类。

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


更多信息:

对于那些喜欢Deno的人,我能够通过使用下面的ANSI转义序列与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++}`));


}

console.log()添加大量的东西和一个新的行每次你调用它

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

至少我是这么被教导的

这里的答案很好。下面将详述console.log格式化函数的重要性。格式化的一个尚未提到的特性是组级别,日志将支持组级别,但stdout不支持组级别。

console.log('Begin...')


console.group()
console.log('Line 2 (console.log)')
process.stdout.write('Line 3 (process.stdout)\n')
console.log('Line 4 (console.log)')
process.stdout.write('Line 5 (process.stdout)') // no newline
console.groupEnd()


console.log('...done')

输出:

Begin...
Line 2 (console.log)
Line 3 (process.stdout)
Line 4 (console.log)
Line 5 (process.stdout)...done

注意stdout不支持控制台。组格式,并且总是写到行开头,其中console.log尊重分组并适当缩进。


只对日志语句(和一个额外的组)执行相同的操作:

console.log('Begin...')


console.group()
console.log('Line 2 (console.log)')
console.log('Line 3 (console.log)')
console.log('Line 4 (console.log)')
console.log('Line 5 (console.log)')
console.group()
console.log('Line 6 (console.log)')
console.log('Line 7 (console.log)')
console.groupEnd()
console.groupEnd()


console.log('...done')

输出:

Begin...
Line 2 (console.log)
Line 3 (console.log)
Line 4 (console.log)
Line 5 (console.log)
Line 6 (console.log)
Line 7 (console.log)
...done