Яка різниця між "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');
};
console.log()здається, додає новий рядок
Дивлячись на документи 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і я просто хочу згадати про це.
Як вказували Мовіс Лефорд і TK-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можна зробити більше.
Ви можете використовувати його таким же чином
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частині (я міг би поговорити багато про те, що саме це робить, але ви зрозуміли, ви можете прочитати більше тут ).
Я сподіваюся, що хтось знайде цю інформацію корисною.
stdout.writeта уникати отримання%
%в кінці, просто зателефонувавши process.stdout.write('\n');в кінці свого циклу (якщо у вас є, наприклад)
%лише спосіб оболонки сказати, що в кінці файлу немає нового рядка.
%у файлі
Велика різниця, про яку не було сказано, полягає в тому, що 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 для публікації методу. Думав, я поділюсь деякими вкладами, щоб допомогти зрозуміти.
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 друкує інформацію, що була отримана в момент пошуку та додає новий рядок.
Це найкращий спосіб пояснити це.
Проста різниця: Методи console.log () автоматично додають символ нового рядка. Це означає, що якщо ми переглядаємо і друкуємо результат, кожен результат надрукується в новому рядку.
Методи process.stdout.write () не додають новий символ рядка. корисна для друку візерунків.
Console.log реалізує process.sdout.write, process.sdout.write - це буфер / потік, який буде безпосередньо виводитися у вашу консоль.
На мою puglin serverline : console = new Console(consoleOptions)ви можете переписати клас Console з вашої власної Readline системи.
Ви можете побачити джерело коду console.log:
Побачити більше :