Qual è la differenza tra "process.stdout.write" e "console.log" in node.js?
EDIT: L'uso di console.log per una variabile ha mostrato molti caratteri illeggibili mentre process.stdout.write ha mostrato un oggetto.
Perché?
Qual è la differenza tra "process.stdout.write" e "console.log" in node.js?
EDIT: L'uso di console.log per una variabile ha mostrato molti caratteri illeggibili mentre process.stdout.write ha mostrato un oggetto.
Perché?
Risposte:
console.log()chiamate process.stdout.writecon output formattato. Vedi format()in console.js per l'implementazione.
Attualmente (v0.10.ish):
Console.prototype.log = function() {
this._stdout.write(util.format.apply(this, arguments) + '\n');
};
console.log()sembra aggiungere una nuova riga
Guardare i documenti Node apparentemente console.log è solo process.stdout.write con un'interruzione di riga alla fine:
console.log = function (d) {
process.stdout.write(d + '\n');
};
Fonte: http://nodejs.org/docs/v0.3.1/api/process.html#process.stdout
So che questa è una domanda molto antica, ma non ho visto nessuno parlare della differenza principale tra process.stdout.writee console.loge voglio solo menzionarla.
Come hanno sottolineato Mauvis Leford e TK-421 , console.logaggiunge un line-breakpersonaggio alla fine della linea ( \n) ma non è tutto ciò che fa.
Il codice non è cambiato almeno dalla 0.10.Xversione e ora abbiamo una 5.Xversione.
Ecco il codice:
Console.prototype.log = function() {
this._stdout.write(util.format.apply(this, arguments) + '\n');
};
Come puoi vedere, c'è una parte che dice .apply(this, arguments)e che fa una grande differenza in termini di funzionalità. È più facile spiegarlo con esempi:
process.stdout.write ha una funzionalità di base, puoi semplicemente scrivere qualcosa lì, in questo modo:
process.stdout.write("Hello World\n");
Se non metti la linea di interruzione alla fine otterrai uno strano carattere dopo la tua stringa, qualcosa del genere:
process.stdout.write("Hello World"); //Hello World%
(Penso che significhi qualcosa come "la fine del programma", quindi lo vedrai solo se sei process.stdout.writestato usato alla fine del tuo file e non hai aggiunto la linea di interruzione)
D'altra parte, console.logpuò fare di più.
Puoi usarlo allo stesso modo
console.log("Hello World"); //You don't need the break line here because it was already formated e anche quello strano personaggio è scomparso
Puoi scrivere più di una stringa
console.log("Hello", "World");
Puoi fare delle associazioni
console.log("Hello %s", "World") //Useful when "World" is inside a variable
E questo è tutto, quella funzionalità aggiunta è data grazie alla util.format.applyparte (potrei parlare molto di ciò che esattamente fa, ma ottieni il mio punto, puoi leggere di più qui ).
Spero che qualcuno trovi utile questa informazione.
stdout.writeed evitare di ottenere%
%alla fine semplicemente chiamando process.stdout.write('\n');alla fine del mio ciclo (se hai per esempio)
%è solo modo della shell di dire non c'è alcuna nuova riga alla fine del file.
%nel file
Una grande differenza che non è stata menzionata è che process.stdout accetta solo stringhe come argomenti (può anche essere convogliato in streaming), mentre console.log accetta qualsiasi tipo di dati Javascript.
per esempio:
// 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)
Un'altra importante differenza in questo contesto sarebbe con process.stdout.clearLine()e process.stdout.cursorTo(0).
Ciò sarebbe utile se si desidera mostrare la percentuale di download o elaborazione in una sola riga. Se usi clearLine (), cursoreTo () con console.log()esso non funziona perché si aggiunge anche \ n al testo. Prova questo esempio:
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);
Ho appena notato qualcosa durante la ricerca di questo dopo aver ricevuto aiuto con https.request per il metodo post. Ho pensato di condividere alcuni input per aiutare a capire.
process.stdout.writenon aggiunge una nuova riga mentre lo console.logfa, come altri hanno già detto. Ma c'è anche questo che è più facile da spiegare con esempi.
var req = https.request(options, (res) => {
res.on('data', (d) => {
process.stdout.write(d);
console.log(d)
});
});
process.stdout.write(d);stamperà i dati correttamente senza una nuova riga. Tuttavia console.log(d)stamperà una nuova riga ma i dati non verranno visualizzati correttamente, <Buffer 12 34 56...ad esempio.
Per console.log(d)mostrare correttamente le informazioni, dovrei farlo.
var req = https.request(options, (res) => {
var dataQueue = "";
res.on("data", function (d) {
dataQueue += d;
});
res.on("end", function () {
console.log(dataQueue);
});
});
Quindi in poche parole:
process.stdout.write stampa continuamente le informazioni mentre i dati vengono recuperati e non aggiunge una nuova riga.
console.log stampa le informazioni ottenute al momento del recupero e aggiunge una nuova riga.
Questo è il modo migliore in cui posso spiegarlo.
La differenza semplice è: i metodi console.log () aggiungono automaticamente il carattere di nuova riga. Significa che se stiamo eseguendo il ciclo continuo e stampando il risultato, ogni risultato viene stampato in una nuova riga.
I metodi process.stdout.write () non aggiungono il carattere di nuova riga. utile per la stampa di motivi.
Console.log implement process.sdout.write, process.sdout.write è un buffer / flusso che verrà emesso direttamente nella tua console.
Secondo il mio puglin serverline : console = new Console(consoleOptions)puoi riscrivere la classe Console con il tuo sistema readline .
Puoi vedere l'origine del codice di console.log:
Vedi altro :