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

ajs*_*sie 281 javascript node.js

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

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

这是为什么?

TK-*_*421 283

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

目前(v0.10.ish):

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

  • 另外值得一提的是`console.log()`似乎添加换行符 (22认同)
  • `console.log()` **也** 广播到[调试客户端](https://nodejs.org/en/docs/guides/debugging-getting-started/)。要广播到调试客户端而不打印到 stdio,可以使用 [`require('inspector').console.log()`](https://nodejs.org/api/inspector.html#inspector_inspector_console)。 (2认同)

Mau*_*ord 136

看一下Node文档,显然console.log就是process.stdout.write,最后是一个换行符:

console.log = function (d) {
  process.stdout.write(d + '\n');
};
Run Code Online (Sandbox Code Playgroud)

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

  • 对于后来出现的人来说,请注意v0.3.1很久以前就已经发生了变化.:) (16认同)
  • 1)v0.9.9是两年2)文档不正确,[根据v0.9.9格式通过util插入](https://github.com/joyent/node/blob/v0.9.9-release/ LIB/console.js#L52) (13认同)
  • ...不.刚看了v0.9.9 docs,console.log仍然只是带有换行符的process.stdout.write的别名.请在评论之前进行研究.http://nodejs.org/docs/v0.9.9/api/process.html#process.stdout (5认同)
  • 实际上,似乎该文档从未更新过,仍然存在(干任何人?).我将提交一份公关来解决这个问题,谢谢你通知我这个问题:) (4认同)
  • https://nodejs.org/docs/latest/api/process.html#process_process_stdout (2认同)

Gep*_*ser 59

我知道这是一个非常古老的问题,但我没有看到任何人谈论的主要区别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');
};
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,有一部分可以说.apply(this, arguments)并且在功能上有很大的不同.通过示例更容易解释:

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

process.stdout.write("Hello World\n"); 
Run Code Online (Sandbox Code Playgroud)

如果你没有把断行放在最后,你会在你的字符串后得到一个奇怪的字符,如下所示:

process.stdout.write("Hello World"); //Hello World% 
Run Code Online (Sandbox Code Playgroud)

(我认为这意味着类似"程序的结束",所以只有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 表示文件末尾没有换行符的方式。 (5认同)
  • @DaveNewton你的观点很重要,因为这意味着如果你将程序的输出重定向到一个文件,例如,你将不会在文件中得到那个“%” (3认同)

the*_*ore 28

尚未提到的一个重大区别是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)
Run Code Online (Sandbox Code Playgroud)


小智 12

在这种情况下的另一个重要区别是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);
Run Code Online (Sandbox Code Playgroud)

  • 这就是我正在寻找的。谢谢。 (3认同)

Nov*_*ova 11

在获得 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)
    });
});
Run Code Online (Sandbox Code Playgroud)

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);
    });
});
Run Code Online (Sandbox Code Playgroud)

所以基本上:

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

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

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