2011-02-12 4 views
185

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

EDIT:オブジェクトを示したprocess.stdout.writeを使用しながら、変数のためにconsole.logを使用するには読めない文字の多くを示しました。

なぜですか?

+3

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

+1

答えとして投稿する=) – ajsie

答えて

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はずっと前のことであり、事態はその後変わってきたことにご注意ください。 :) –

+4

...いいえ。ちょうどv0.9.9のドキュメントを見て、console.logはまだlinebreakでprocess.stdout.writeのエイリアスです。コメントする前に研究をしてください。 http://nodejs.org/docs/v0.9.9/api/process.html#process.stdout –

+10

1)v0.9.9は2歳です2)ドキュメントは間違っています[v0.9.9のフォーマットutilを通して補間されています。(https://github.com/joyent/node/blob/v0.9.9-release/lib/console.js#L52) –

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("Hello World\n"); 

process.stdout.writeは非常に基本的な機能を持って、あなただけのように、そこに何かを書くことができます

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

(私は、「プログラムの終了」のようなものを意味だと思うので、あなたがあなたprocess.stdout.writeがで使用した場合にのみ表示されます:あなたはこのような何か、あなたの文字列の後に奇妙な文字を取得しますあなたのファイルの最後には、トン一方

)破断線を追加し、console.logは多くを行うことができます。

  1. あなたは、複数の文字列

    console.log("Hello", "World");

  2. を書くことができますあなたは同じよう

    console.log("Hello World"); //You don't need the break line here because it was already formatedでそれを使用することができますし、また、その奇妙な文字が

  3. を消えました団体を作ることができます

    機能を追加し、それをだ

    console.log("Hello %s", "World") //Useful when "World" is inside a variable

アンは、util.format.apply部分のおかげで与えられている(私はまさにこれが何をするかについて多くのことを話すことができたが、あなたは私のポイントを取得し、あなたはhere詳細を読むことができます)。

誰かがこの情報を見つけることを望みます。

+0

'stdout.write'の使い方と'% 'の取得を避ける方法を説明したのであれば、非常に役に立ちます –

+0

'% 'を最後に' process.stdout.write( '\ n '); '私のループの最後に(もしあなたが持っていれば) –

17

言及されていない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) 
+0

非常に大きくて重要な違いです。ありがとう! – chriskelly

1

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は、検索時に取得した情報を印刷し、改行を追加します。

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

2

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

これは、ダウンロードまたは処理の割合を唯一の行に表示する場合に便利です。clearLine()を使用すると、console.log()のcursorTo()は\ 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);