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


323

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

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

这是为什么?


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

Answers:


324

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

当前(v0.10.ish):

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

34
还值得一提的是,它console.log()似乎增加了换行符
jchook

143

看一下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


18
对于后来出现的人,请注意v0.3.1是很久以前的事情,此后发生了变化。:)
布伦丹

5
...不。只是看了v0.9.9文档,console.log仍然只是带有换行符的process.stdout.write的别名。发表评论之前,请先进行研究。 nodejs.org/docs/v0.9.9/api/process.html#process.stdout
Mauvis Ledford

13
1)v0.9.9两岁2)文档不正确,因为每v0.9.9的格式UTIL通过插值
布伦丹

4
实际上,似乎文档从未更新过并且仍然存在(有人干燥吗?)。我将提交PR来解决此问题,感谢您将此问题通知我:)
Brendan


66

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

正如Mauvis LefordTK-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可以做更多的事情。

  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部分提供了增加的功能(我可以谈论很多确切的功能,但是您明白我的意思,您可以在这里阅读更多内容)。

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


如果您解释了如何使用stdout.write并避免%
弄乱,

%通过简单地process.stdout.write('\n');在循环末尾调用(例如,如果有的话)解决了到达末尾的问题
Muhammad Aref

2
%只是Shell表示文件末尾没有换行符的方式。
戴夫牛顿

1
@DaveNewton您的观点很重要,因为这意味着,例如,如果您将程序的输出重定向到文件,则不会%在文件中得到它
mr.mams

31

未提及的一大不同之处是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)

15

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

5

在获得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 打印在检索点获得的信息,并添加新行。

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


1

简单的区别是: console.log()方法自动添加换行符。这意味着如果我们遍历并打印结果,则每个结果都将以新行打印。

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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.