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

144

노드 문서를 보면 분명히 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은 오래 전에 사용되었으며 그 이후로 변경되었습니다. :)
Brendan

5
...아니. v0.9.9 문서를 보았을 때 console.log는 여전히 줄 바꿈으로 process.stdout.write의 별칭입니다. 의견을 제시하기 전에 조사하십시오. nodejs.org/docs/v0.9.9/api/process.html#process.stdout
Mauvis Ledford


4
실제로, 문서는 업데이트 된 적이 없으며 여전히 남아 있습니다 (DRY anybody?). 해당 문제를 알려 주셔서 감사합니다. :)
Brendan


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
이것은 %파일 끝에 줄 바꿈이 없다고 말하는 쉘의 방법입니다.
Dave Newton

1
당신이 파일에 프로그램의 출력을 리디렉션하는 경우, 예를 들어, 당신은 그것을 얻을 수 없다는 것을 의미하기 때문에 요점 @DaveNewton, 중요 %파일에
mr.mams

31

언급되지 않은 한 가지 큰 차이점은 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

이 맥락에서 또 다른 중요한 차이점은 process.stdout.clearLine()process.stdout.cursorTo(0) .

한 줄에 다운로드 또는 처리 비율을 표시하려는 경우에 유용합니다. 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는 콘솔에 직접 출력되는 버퍼 / 스트림입니다.

내 puglin serverline 에 따르면 : console = new Console(consoleOptions)자신의 readline 시스템으로 콘솔 클래스를 다시 작성할 수 있습니다 .

console.log의 코드 소스를 볼 수 있습니다.


더보기 :

  • readline.createInterface 를 사용하여 사용자 정의 동작을 수행하거나 콘솔 입력을 사용하십시오.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.