В чем разница между "process.stdout.write" и "console.log" в node.js?
EDIT: Использование console.log для переменной показало много нечитаемых символов, в то время как process.stdout.write показал объект.
Почему это?
В чем разница между "process.stdout.write" и "console.log" в node.js?
EDIT: Использование console.log для переменной показало много нечитаемых символов, в то время как process.stdout.write показал объект.
Почему это?
console.log()
вызывает process.stdout.write
с форматированным выходом. См. format()
в console.js для реализации.
В настоящее время (v0.10.ish):
Console.prototype.log = function() {
this._stdout.write(util.format.apply(this, arguments) + '\n');
};
Глядя на 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
Я знаю, что это очень старый вопрос, но я не видел, чтобы кто-то говорил о главном различии между 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
(я мог много рассказать о том, что именно это делает, но вы поняли мою точку зрения, вы можете прочитать больше здесь).
Я надеюсь, что кто-нибудь найдет эту информацию полезной.
Одна большая разница, о которой не упоминалось, заключается в том, что 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)
Другое важное различие в этом контексте было бы с 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);
Я только что заметил что-то, исследуя это после получения помощи с 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
печатает информацию, полученную в точке извлечения, и добавляет новую строку.
Это лучший способ объяснить это.