2011-02-12 142 views
185

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

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

这是为什么?

+3

你能提供一个例子吗? console.log()使用格式化输出调用process.stdout.write。有关实现,请参阅console.js中的format()。 – 2011-02-12 11:47:53

+1

发布它作为答案=) – ajsie 2011-02-13 03:34:46

回答

176

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

目前(v0.10.ish):

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

望着节点文档显然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

+9

对于后来出现的人来说,请注意,v0.3.1是很久以前的事情,并且自那以后发生了变化。 :) – 2015-02-25 04:17:58

+4

...不。刚刚查看了v0.9.9文档,console.log仍然是process.stdout.write的别名,并带有换行符。请在评论之前做你的研究。 http://nodejs.org/docs/v0.9.9/api/process.html#process.stdout – 2015-02-25 17:53:05

38

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

由于Mauvis LefordTK-421指出的,console.log在行(\n)的末尾添加一个line-break字符,但还不是全部它做什么。

自从至少有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是在使用你的文件的结尾,你没有' t加分行)

另一方面,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部分(我可以讲了很多关于究竟这样做,但你明白我的意思,你可以阅读更多here)。

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

17

没有提到的一个很大的区别是process.stdout只将字符串作为参数(也可以是管道流),而console.log采用任何Javascript数据类型。

e.g:

// 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) 
1

我刚刚发现了一些,同时帮助您使用https.request为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打印检索点获得的信息并添加新行。

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

2

这方面的另一个重要区别是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); 
相关问题