node.js 中的“process.stdout.write”和“console.log”有什么区别?
编辑:在使用 process.stdout.write 显示对象时,将 console.log 用于变量显示了很多不可读的字符。
这是为什么?
node.js 中的“process.stdout.write”和“console.log”有什么区别?
编辑:在使用 process.stdout.write 显示对象时,将 console.log 用于变量显示了很多不可读的字符。
这是为什么?
console.log()
process.stdout.write
带有格式化输出的调用。有关format()
实现,请参见console.js。
目前(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.write
和console.log
我只是想提一提它。
正如Mauvis Leford和TK-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
可以做得更多。
你可以用同样的方式使用它
console.log("Hello World"); //You don't need the break line here because it was already formated
而且那个奇怪的角色确实消失了
你可以写多个字符串
console.log("Hello", "World");
你可以建立关联
console.log("Hello %s", "World") //Useful when "World" is inside a variable
就是这样,由于该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)
这种情况下的另一个重要区别是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)