2011-02-12 9 views
185

node.js의 "process.stdout.write"와 "console.log"의 차이점은 무엇입니까?node.js의 "process.stdout.write"와 "console.log"의 차이점은 무엇입니까?

편집 : 변수에 console.log를 사용하면 process.stdout.write를 사용하는 동안 읽을 수없는 문자가 많이 표시되어 개체가 보입니다.

왜 그럴까요?

+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

분명히 단지 끝 부분에 라인 중단으로 process.stdout.write되어 CONSOLE.LOG 노드 문서를 보면 :

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

... 아니. 그냥 v.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 버전이 있습니다. 당신이 볼 수 있듯이,이 .apply(this, arguments)을 말한다 일부이며 그 기능에 큰 차이가

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

:

Here

는 코드입니다. 당신이 마지막에 브레이크 라인을 넣지 않으면

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

: 당신은이 같은 거기에 뭔가를 쓸 수

process.stdout.write은 아주 기본적인 기능이 있습니다 : 예와 그 설명하는 것이 더 쉽습니다 당신이 당신의 문자열 뒤에 이런 일을 이상한 문자를 얻을 것이다 :

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

(나는 그 "프로그램 종료"같은 것을 의미한다고 생각, 그래서 당신은 당신 process.stdout.write가에서 사용 된 경우에만 표시됩니다 당신의 파일의 끝 그리고 당신은 ' t 중단 줄 추가)

반면에 console.log은 더 많은 작업을 수행 할 수 있습니다.

  1. 당신은 이상한 문자가 두 개 이상의 문자열

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

  2. 당신을 작성할 수 있습니다

  3. 사라 않았다 같은 방법으로도

    console.log("Hello World"); //You don't need the break line here because it was already formated과에서 사용할 수 있습니다 협회를 만들 수있다

    기능을 추가예요

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

가의 util.format.apply 부분 덕분에 주어 (I 정확히이가하는 일에 대해 많은 얘기 할 수 있지만, 당신이 내 포인트를 얻을, 당신은 here 자세한 내용을보실 수 있습니다).

누군가가이 정보를 유용하게 사용하기를 바랍니다.

+0

'stdout.write'를 사용하고'% '를 얻는 방법을 설명했다면 매우 도움이 될 것입니다. –

+0

'process.stdout.write ('\ n ')를 호출하여 끝에'%'를 가져 오는 문제를 해결했습니다. ');'내 루프의 끝에서 (예를 들어 있다면) –

17

언급되지 않은 큰 차이점 중 하나는 process.stdout은 문자열 (파이프 된 스트림 일 수도 있음) 만 가져 오는 반면, console.log은 자바 스크립트 데이터 형식을 사용한다는 것입니다.

예컨대 : 포스트 방법에 대한 https.request 도움말보기 후이 연구하면서 내가 뭔가를 발견했습니다

// 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

. 이해를 돕기 위해 의견을 나누었습니다.

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

    는 검색의 지점에서 얻은 새로운 라인을 추가 무슨 정보를 인쇄합니다.

내가 설명 할 수있는 가장 좋은 방법입니다.

2

이 컨텍스트의 또 다른 중요한 차이점은 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); 
관련 문제