node.jsの「process.stdout.write」と「console.log」の違いは何ですか?


323

node.jsの「process.stdout.write」と「console.log」の違いは何ですか?

編集:変数にconsole.logを使用すると、process.stdout.writeを使用するとオブジェクトが表示される一方で、多くの読み取り不可能な文字が表示されました。

何故ですか?


4
例を提供できますか?console.log()は、フォーマットされた出力でprocess.stdout.writeを呼び出します。実装については、console.jsのformat()を参照してください。
TK-421

回答:


324

console.log()process.stdout.writeフォーマットされた出力で呼び出します。format()実装についてはconsole.jsを参照してください。

現在(v0.10.ish):

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

34
console.log()改行を追加するように見えることも言及する価値があります
jchook 2018

144

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


18
後でお越しの方は、v0.3.1はかなり前のことであり、それ以来状況が変わっていることに注意してください。:)
ブレンダン

5
...いいえ。ただv0.9.9 docsを見ると、console.logは、改行付きのprocess.stdout.writeの単なるエイリアスです。コメントする前にあなたの研究をしてください。 nodejs.org/docs/v0.9.9/api/process.html#process.stdout
Mauvis Ledford

13
1)v0.9.9は2歳です2)そのドキュメントは不正確です。v0.9.9に従って、フォーマットはutilを介して補間されます
Brendan

4
実際、そのドキュメントはまだ更新されておらず、まだ存在しているようです(DRY誰か?)私はそれを修正するためにPRを提出します、その問題について私に通知してくれてありがとう:)
ブレンダン


66

私は、これは非常に古い質問ですが、私は誰もが主な違いについて話を見ていなかった知っている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');
};

ご覧のとおり.apply(this, arguments)、機能性に大きな違いをもたらす部分があります。例でそれを説明する方が簡単です:

process.stdout.write 非常に基本的な機能があり、次のようにそこに何かを書くだけです。

process.stdout.write("Hello World\n"); 

改行を最後に置かないと、文字列の後に次のような奇妙な文字が表示されます。

process.stdout.write("Hello World"); //Hello World% 

(それは「プログラムの終わり」のようなものを意味すると思うので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パートのおかげで、追加された機能が提供されます(これが正確に何をするかについては多くのことを話すことができますが、私の理解はここにあります)。

この情報がお役に立てば幸いです。


使用方法stdout.writeと取得を回避する方法を説明した場合にも非常に役立ちます%
Muhammad Aref

ループの終わりに(たとえば、ある場合)%呼び出すだけで、最後に到達する問題を解決しましたprocess.stdout.write('\n');
Muhammad Aref

2
これ%は、シェルがファイルの最後に改行がないことを示す方法にすぎません。
デイブニュートン

1
@DaveNewtonポイントは重要です。たとえば、プログラムの出力をファイルにリダイレクトする場合、ファイルではそれを取得できないため%です
mr.mams

31

言及されていない大きな違いの1つは、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)

15

このコンテキストでのもう1つの重要な違いは、process.stdout.clearLine()およびprocess.stdout.cursorTo(0)です。

これは、ダウンロードまたは処理の割合を1行で表示する場合に便利です。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);

これは私が探しているものです。ありがとう。
Patrick P.

5

postメソッドのhttps.requestのヘルプを取得した後、これを調査しているときに何かに気づきました。理解を助けるためにいくつかの情報を共有すると思いました。

process.stdout.writeconsole.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 検索時に取得した情報を出力し、新しい行を追加します。

それが私が説明できる最良の方法です。


1

単純な違いは次のとおりです 。console.log()メソッドは自動的に改行文字を追加します。つまり、結果をループして出力する場合、各結果は新しい行に出力されます。

process.stdout.write()メソッドは改行文字を追加しません。パターンの印刷に役立ちます。


0

Console.logはprocess.sdout.writeを実装します。process.sdout.writeは、コンソールに直接出力されるバッファ/ストリームです。

私のパグリンサーバーラインによると:console = new Console(consoleOptions)コンソールクラスを独自のreadlineシステムで書き換えることができます。

console.logのコードソースを確認できます。


続きを見る :

  • readline.createInterfaceを使用してカスタム動作を作成するか、コンソール入力を使用します。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.