Sự khác biệt giữa "process.stdout.write" và "console.log" trong node.js là gì?
EDIT: Sử dụng console.log cho một biến cho thấy rất nhiều ký tự không thể đọc được trong khi sử dụng process.stdout.write hiển thị một đối tượng.
Tại sao vậy?
Sự khác biệt giữa "process.stdout.write" và "console.log" trong node.js là gì?
EDIT: Sử dụng console.log cho một biến cho thấy rất nhiều ký tự không thể đọc được trong khi sử dụng process.stdout.write hiển thị một đối tượng.
Tại sao vậy?
Câu trả lời:
console.log()các cuộc gọi process.stdout.writevới đầu ra được định dạng. Xem format()trong console.js để thực hiện.
Hiện tại (v0.10.ish):
Console.prototype.log = function() {
this._stdout.write(util.format.apply(this, arguments) + '\n');
};
console.log()dường như để thêm một dòng mới
Nhìn vào các tài liệu Node rõ ràng console.log chỉ là process.stdout.write với một ngắt dòng ở cuối:
console.log = function (d) {
process.stdout.write(d + '\n');
};
Nguồn: http://nodejs.org/docs/v0.3.1/api/ process.html # process.stdout
Tôi biết đây là một câu hỏi rất cũ nhưng tôi không thấy ai nói về sự khác biệt chính giữa process.stdout.writevà console.logvà tôi chỉ muốn đề cập đến nó.
Như Mauvis Leford và TK-421 đã chỉ ra, nhân vật này console.logthêm một line-breakký tự ở cuối dòng ( \n) nhưng đó không phải là tất cả những gì nó làm.
Mã đã không thay đổi kể từ ít nhất là 0.10.Xphiên bản và bây giờ chúng tôi có một 5.Xphiên bản.
Đây là mã:
Console.prototype.log = function() {
this._stdout.write(util.format.apply(this, arguments) + '\n');
};
Như bạn có thể thấy, có một phần nói .apply(this, arguments)và điều đó tạo ra sự khác biệt lớn về chức năng. Nó dễ dàng hơn để giải thích rằng với các ví dụ:
process.stdout.write có một chức năng rất cơ bản, bạn có thể viết một cái gì đó trong đó, như thế này:
process.stdout.write("Hello World\n");
Nếu bạn không đặt dòng ngắt ở cuối, bạn sẽ nhận được một ký tự lạ sau chuỗi của mình, đại loại như thế này:
process.stdout.write("Hello World"); //Hello World%
(Tôi nghĩ điều đó có nghĩa là "kết thúc chương trình", vì vậy bạn sẽ chỉ thấy nó nếu bạn process.stdout.writeđược sử dụng ở cuối tệp của mình và bạn đã không thêm dòng ngắt)
Mặt khác, console.logcó thể làm nhiều hơn nữa.
Bạn có thể sử dụng nó theo cùng một cách
console.log("Hello World"); //You don't need the break line here because it was already formated và nhân vật kỳ lạ đó đã biến mất
Bạn có thể viết nhiều hơn một chuỗi
console.log("Hello", "World");
Bạn có thể làm cho các hiệp hội
console.log("Hello %s", "World") //Useful when "World" is inside a variable
Một phần, đó là chức năng bổ sung được đưa ra nhờ util.format.applymột phần (tôi có thể nói rất nhiều về chính xác điều này làm gì nhưng bạn hiểu ý tôi, bạn có thể đọc thêm ở đây ).
Tôi hy vọng ai đó tìm thấy thông tin này hữu ích.
stdout.writevà tránh nhận%
%ở cuối bằng cách gọi process.stdout.write('\n');vào cuối vòng lặp của tôi (nếu bạn có ví dụ)
%chỉ là cách của shell để nói rằng không có dòng mới ở cuối tập tin.
%trong tệp
Một sự khác biệt lớn chưa được đề cập là process.stdout chỉ lấy các chuỗi làm đối số (cũng có thể là các luồng được truyền), trong khi console.log lấy bất kỳ loại dữ liệu Javascript nào.
ví dụ:
// 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)
Một sự khác biệt quan trọng trong bối cảnh này sẽ với process.stdout.clearLine()và process.stdout.cursorTo(0).
Điều này sẽ hữu ích nếu bạn muốn hiển thị phần trăm tải xuống hoặc xử lý trong một dòng duy nhất. Nếu bạn sử dụng ClearLine (), con trỏTo () với console.log()nó không hoạt động vì nó cũng nối thêm \ n vào văn bản. Chỉ cần thử ví dụ này:
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);
Tôi vừa nhận thấy điều gì đó trong khi nghiên cứu vấn đề này sau khi nhận trợ giúp với https.request cho phương thức đăng bài. Nghĩ rằng tôi chia sẻ một số đầu vào để giúp hiểu.
process.stdout.writekhông thêm một dòng mới trong khi console.logđó, như những người khác đã đề cập. Nhưng cũng có điều này dễ giải thích hơn với các ví dụ.
var req = https.request(options, (res) => {
res.on('data', (d) => {
process.stdout.write(d);
console.log(d)
});
});
process.stdout.write(d);sẽ in dữ liệu đúng cách mà không cần một dòng mới. Tuy nhiên console.log(d)sẽ in một dòng mới nhưng dữ liệu sẽ không hiển thị chính xác, <Buffer 12 34 56...ví dụ như vậy.
Để console.log(d)hiển thị thông tin chính xác, tôi sẽ phải làm điều này.
var req = https.request(options, (res) => {
var dataQueue = "";
res.on("data", function (d) {
dataQueue += d;
});
res.on("end", function () {
console.log(dataQueue);
});
});
Nên về cơ bản:
process.stdout.write liên tục in thông tin khi dữ liệu được lấy và không thêm một dòng mới.
console.log in thông tin những gì thu được tại điểm truy xuất và thêm một dòng mới.
Đó là cách tốt nhất tôi có thể giải thích nó.
Sự khác biệt đơn giản là: các phương thức console.log () tự động nối thêm ký tự dòng mới. Điều đó có nghĩa là nếu chúng ta lặp qua và in kết quả, mỗi kết quả sẽ được in trong dòng mới.
Các phương thức process.stdout.write () không nối thêm ký tự dòng mới. hữu ích cho việc in các mẫu.
Console.log triển khai process.sdout.write, process.sdout.write là bộ đệm / luồng sẽ trực tiếp xuất ra trong bảng điều khiển của bạn.
Theo puglin tôi serverline : console = new Console(consoleOptions)bạn có thể viết lại lớp Console của riêng bạn readline hệ thống.
Bạn có thể thấy nguồn mã của console.log:
Xem thêm: