Разница между "process.stdout.write" и "console.log" в node.js?

В чем разница между "process.stdout.write" и "console.log" в node.js?

EDIT: Использование console.log для переменной показало много нечитаемых символов, в то время как process.stdout.write показал объект.

Почему это?

Ответ 1

console.log() вызывает process.stdout.write с форматированным выходом. См. format() в console.js для реализации.

В настоящее время (v0.10.ish):

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

Ответ 2

Глядя на 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

Ответ 3

Я знаю, что это очень старый вопрос, но я не видел, чтобы кто-то говорил о главном различии между process.stdout.write и console.log, и я просто хочу упомянуть его.

Как Mauvis Leford и TK-421, console.log добавляет a line-break символ в конце строки (\n), но это не все, что он делает.

Код не изменился с по крайней мере 0.10.X версии, и теперь у нас есть версия a 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 может делать больше.

  • Вы можете использовать его таким же образом

    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

И что он добавил, что добавленная функциональность дается благодаря части util.format.apply (я мог много рассказать о том, что именно это делает, но вы поняли мою точку зрения, вы можете прочитать больше здесь).

Я надеюсь, что кто-нибудь найдет эту информацию полезной.

Ответ 4

Одна большая разница, о которой не упоминалось, заключается в том, что 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)

Ответ 5

Другое важное различие в этом контексте было бы с 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);

Ответ 6

Я только что заметил что-то, исследуя это после получения помощи с https.request для метода post. Думаю, я разделяю некоторые сведения, чтобы помочь понять.

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 печатает информацию, полученную в точке извлечения, и добавляет новую строку.

Это лучший способ объяснить это.