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

Difference between “process.stdout.write” and “console.log” in node.js?

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

编辑:在使用process.stdout.write显示对象时,对变量使用console.log会显示许多不可读的字符。

为什么会这样?


console.log()使用格式化输出调用process.stdout.write。具体实现见console.js中的format()

目前(v0.10.ish):

1
2
3
4
Console.prototype.log = function() {
  this._stdout.write(util.format.apply(this, arguments) + '
'
);
};


显然,查看节点docs console.log只是process.stdout.write,末尾有一个换行符:

1
2
3
4
console.log = function (d) {
  process.stdout.write(d + '
'
);
};

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


我知道这是一个很古老的问题,但我没看到有人谈论过process.stdout.writeconsole.log之间的主要区别,我只是想提一下。

正如Mauvis Leford和TK-421指出的那样,console.log在行尾添加了一个line-break字符(
),但这并不是它所做的全部。

至少在0.10.X版本之后,代码没有改变,现在我们有了5.X版本。

代码如下:

1
2
3
4
Console.prototype.log = function() {
  this._stdout.write(util.format.apply(this, arguments) + '
'
);
};

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

process.stdout.write具有非常基本的功能,您可以在其中编写一些内容,如:

1
2
process.stdout.write("Hello World
"
);

如果不将换行符放在末尾,字符串后面会出现一个奇怪的字符,如下所示:

1
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

  • A就是这样,由于util.format.apply部分的原因,增加了功能(我可以谈论很多关于这到底是做什么的,但是你明白我的意思,你可以在这里阅读更多内容)。

    我希望有人能找到有用的信息。


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

    例如:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    // 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()一起使用,它将不起作用,因为它还将附加到文本中。试试这个例子:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    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);

    我刚刚注意到在获得https.request for post方法的帮助后,在研究这个问题时发现了一些问题。我想我可以分享一些信息来帮助理解。

    像其他人提到的那样,process.stdout.write没有添加新的行,而console.log没有添加新的行。但也有一些例子更容易解释。

    1
    2
    3
    4
    5
    6
    var req = https.request(options, (res) => {
        res.on('data', (d) => {
            process.stdout.write(d);
            console.log(d)
        });
    });

    process.stdout.write(d);将正确打印数据,无需换行。然而,console.log(d)将打印一行新行,但数据显示不正确,例如,给出了的例子。

    为了使console.log(d)正确显示信息,我必须这样做。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    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打印检索点获得的信息,并添加一行新行。

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


    简单的区别是:console.log()方法自动附加新行字符。这意味着,如果我们循环并打印结果,每个结果都将打印成新行。

    process.stdout.write()方法不附加新行字符。用于打印图案。