node.js中“process.stdout.write”和“console.log”的区别?
node.js中的“process.stdout.write”和“console.log”有什么区别?
编辑:使用console.log为variables显示了很多不可读的字符,同时使用process.stdout.write显示一个对象。
这是为什么?
console.log()
调用具有格式化输出的process.stdout.write
。 有关实现,请参阅console.js中的format()
。
目前(v0.10.ish):
Console.prototype.log = function() { this._stdout.write(util.format.apply(this, arguments) + '\n'); };
查看节点docs显然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.write
和console.log
之间的主要区别,我只想提到它。
正如Mauvis Leford和TK-421指出的那样, console.log
line-break
添加了一个换行符( \n
),但这并不是全部。
代码至less从0.10.X
版本没有改变,现在我们有一个5.X
版本。
这里是代码:
Console.prototype.log = function() { this._stdout.write(util.format.apply(this, arguments) + '\n'); };
正如你所看到的,有一部分说.apply(this, arguments)
,这对function有很大的影响。 用例子来解释一下比较容易:
process.stdout.write
有一个非常基本的function,你可以在这里写一些东西,像这样:
process.stdout.write("Hello World\n");
如果你不把最后一行放在最后,你会在你的string后面出现一个奇怪的字符,例如:
process.stdout.write("Hello World"); //Hello World%
(我认为这意味着像“程序的结束”,所以只有在process.stdout.write
被使用在文件末尾,而且没有添加break行时才会看到)
另一方面, console.log
可以做更多的事情。
-
你可以用同样的方法使用它
console.log("Hello World"); //You don't need the break line here because it was already formated
console.log("Hello World"); //You don't need the break line here because it was already formated
,怪异的angular色也消失了 -
你可以写多个string
console.log("Hello", "World");
-
你可以build立关联
console.log("Hello %s", "World") //Useful when "World" is inside a variable
就这样,由于util.format.apply
部分(我可以讲很多关于这个function的东西,但是你明白了我的观点,你可以在这里阅读更多内容)给出了增加的function。
我希望有人find这个信息有用。
没有提到的一个很大的区别是process.stdout只将string作为参数(也可以是pipe道stream),而console.log则采用任何Javascript数据types。
例如:
// 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.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
打印在检索点获得的信息并添加一个新行。
这是我能解释的最好方法。
在这个上下文中的另一个重要区别是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);