Різниця між "process.stdout.write" та "console.log" у node.js?


323

Яка різниця між "process.stdout.write" та "console.log" у node.js?

EDIT: Використання console.log для змінної показало багато нечитабельних символів при використанні process.stdout.write показав об'єкт.

Чому так?


4
Чи можете ви навести приклад? console.log () викликає process.stdout.write з відформатованим виходом. Дивіться формат () у console.js щодо реалізації.
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

Дивлячись на документи 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


18
Люди, які збираються пізніше, зауважте, що v0.3.1 був давно і все з того часу змінилося. :)
Брендан

5
... ні. Щойно переглянуті v0.9.9 docs та console.log - це все ще лише псевдонім для обработки.stdout.write з linebreak. Будь ласка, зробіть своє дослідження, перш ніж коментувати. nodejs.org/docs/v0.9.9/api/process.html#process.stdout
Маувіс Ледфорд,

13
1) v0.9.9 - два роки 2), що документація невірна, згідно з v0.9.9 формат інтерполюється через утиліту
Брендан,

4
Насправді, схоже, що ця документація ніколи не оновлювалася і все ще існує (ПОСУХИ хто? Я буду подавати PR, щоб виправити це, дякую, що повідомили про це питання :)
Брендан,


66

Я знаю , що це дуже старе питання , але я не бачив , хто говорив про головне розходження між 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можна зробити більше.

  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та уникати отримання%
Мухаммед Ареф

Я вирішив проблему отримати %в кінці, просто зателефонувавши process.stdout.write('\n');в кінці свого циклу (якщо у вас є, наприклад)
Мухаммед Ареф

2
Це %лише спосіб оболонки сказати, що в кінці файлу немає нового рядка.
Дейв Ньютон

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);

Це те, що я шукаю. Дякую.
Патрік П.

5

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

Це найкращий спосіб пояснити це.


1

Проста різниця: Методи console.log () автоматично додають символ нового рядка. Це означає, що якщо ми переглядаємо і друкуємо результат, кожен результат надрукується в новому рядку.

Методи process.stdout.write () не додають новий символ рядка. корисна для друку візерунків.


0

Console.log реалізує process.sdout.write, process.sdout.write - це буфер / потік, який буде безпосередньо виводитися у вашу консоль.

На мою puglin serverline : console = new Console(consoleOptions)ви можете переписати клас Console з вашої власної Readline системи.

Ви можете побачити джерело коду console.log:


Побачити більше :

  • readline.createInterface, щоб зробити свою власну поведінку або використовувати введення консолі.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.