Bảng điều khiển dành cho nhà phát triển JavaScript của Chrome: Có thể gọi console.log () mà không có dòng mới không?


91

Tôi muốn sử dụng console.log () để ghi nhật ký tin nhắn mà không cần thêm dòng mới sau mỗi lần gọi tới console.log (). Điều này có khả thi không?


10
Một trong những câu trả lời có đúng không?
newenglander

Tôi nghĩ câu trả lời của @ minitech là đúng: điều đó là không thể. Các câu trả lời khác cung cấp độ sâu thú vị, nếu hơi trực giao đối với sự hiểu biết của chúng ta về console.log ().
Dave Land

1
@DaveLand Tôi tin rằng điều đó hoàn toàn có thể thực hiện được bằng cách duy trì bộ đệm hiển thị của riêng bạn và đồng bộ hóa bộ đệm hiển thị đó với bảng điều khiển thực tế bằng cách kết hợp console.clear()và, ví dụ console.log().
John Weisz

1
@JohnWeisz: Cảm ơn, nhưng xóa toàn bộ bảng điều khiển cho mọi bản cập nhật "nội tuyến" không phải là giải pháp cho khoảng 99% ứng dụng. Tuy nhiên, có một cập nhật.
Dave Land

@DaveLand Vâng, nó giống một vụ hack hơn - và bây giờ khi tôi nhìn xung quanh, tôi nhận ra nó đã được đề xuất trước đó. Dù bằng cách nào, đôi khi nó có thể hữu ích.
John Weisz

Câu trả lời:


43

Không, không thể. Bạn sẽ phải giữ một chuỗi và nối nếu bạn muốn tất cả trong một dòng hoặc đặt đầu ra của bạn ở nơi khác (giả sử, một cửa sổ khác).


2
Trên thực tế, nó là có thể, nhưng có lẽ không phải cho việc sử dụng mà mọi người đều nghĩ đến. Trong trường hợp của tôi, tôi chỉ đang cố gắng in một câu hỏi để nhận đầu vào từ một thiết bị đầu cuối dòng lệnh. Xem câu trả lời cho câu hỏi này cho câu trả lời: stackoverflow.com/questions/26683734/...
deltaray

2
@deltaray readline's questionthì không console.log. Câu hỏi cũng là về bảng điều khiển trình duyệt, không phải Node.js.
Ry-

@minitech bạn có thể sử dụng toán tử spread để in trên một dòng. xem trong ví dụ jsfiddle.net/imranqau5373/7m65at9L/2
khan

@imrankhan: Đó không phải là câu hỏi. Toán tử spread không thêm bất cứ điều gì mới ở đây so với việc truyền nhiều đối số / sử dụng apply.
Ry-

40

Trong NodeJS, bạn có thể sử dụng process.stdout.write và bạn có thể thêm '\ n' nếu muốn.

console.log(msg)tương đương với process.stdout.write(msg + '\n').


13
NodeJS không phải là Chrome. Câu trả lời này không liên quan đến câu hỏi 'bạn có thể console.log mà không có dòng mới không?' .
Alex

18

Bạn có thể đặt bao nhiêu thứ argumentstùy thích:

console.log('hi','these','words','will','be','separated','by','spaces',window,document)

Bạn sẽ nhận được tất cả đầu ra đó trên một dòng với các tham chiếu đối tượng nội tuyến và sau đó bạn có thể thả xuống trình kiểm tra của chúng từ đó.


61
Làm thế nào để trả lời câu hỏi này?
JohnAllen

16
Tôi nghĩ câu trả lời này hữu ích.

12
Điều này là hữu ích. Mặc dù nó không trả lời câu hỏi, nhưng nó cung cấp giải pháp cho những gì hầu hết mọi người sẽ tìm kiếm khi họ tìm thấy câu hỏi này.
Sean Lynch

Lý do tại sao bất kỳ muốn in mà không có dòng mới là đầu ra sau không được biết. Hoặc chỉ cần tưởng tượng một "thanh bộ nạp" bằng cách sử dụng ví dụ: dấu chấm.
Karl Adler

Việc sử dụng nhiều đối số sẽ phá vỡ kiểu console.log vì bạn chỉ có thể tạo kiểu trong đối số đầu tiên.
Qwerty

17

Có, hoàn toàn có thể (xem bản demo bên dưới) - bằng cách triển khai bảng điều khiển ảo của riêng bạn trên bảng điều khiển trình duyệt gốc, sau đó đồng bộ hóa nó với bảng điều khiển thực.

Điều này dễ dàng hơn nhiều so với âm thanh:

  1. duy trì bộ đệm hiển thị (ví dụ: một mảng các chuỗi đại diện cho một dòng mỗi dòng)
  2. gọi console.clear()trước khi viết để xóa mọi nội dung trước đó
  3. gọi console.log()(hoặc cảnh báo, lỗi, v.v.) để điền vào bảng điều khiển với nội dung từ bộ đệm hiển thị của bạn

Trên thực tế, tôi đã làm điều này một thời gian. Một triển khai ngắn gọn, thô sơ của ý tưởng sẽ là một cái gì đó dọc theo các dòng sau, nhưng vẫn có khả năng làm sinh động nội dung bảng điều khiển:

// =================================================
// Rudimentary implementation of a virtual console.
// =================================================

var virtualConsole = {
    lines: [],
    currentLine: 0,
    log: function (msg, appendToCurrentLine) {
        if (!appendToCurrentLine) virtualConsole.currentLine++;
      
        if (appendToCurrentLine && virtualConsole.lines[virtualConsole.currentLine]) {
            virtualConsole.lines[virtualConsole.currentLine] += msg;
        } else {
            virtualConsole.lines[virtualConsole.currentLine] = msg;
        }
        
        console.clear();
        
        virtualConsole.lines.forEach(function (line) {
            console.log(line);
        });
    },
    clear: function () {
        console.clear();
        virtualConsole.currentLine = 0;
    }
}

// =================================================
// Little demo to demonstrate how it looks.
// =================================================

// Write an initial console entry.
virtualConsole.log("Loading");

// Append to last line a few times.
var loadIndicatorInterval = setInterval(function () {
    virtualConsole.log(".", true); // <- Append.
}, 500);

// Write a new line.
setTimeout(function () {
    clearInterval(loadIndicatorInterval);
    virtualConsole.log("Finished."); // <- New line.
}, 8000);

Nó chắc chắn có nhược điểm của nó khi trộn với tương tác trực tiếp với bảng điều khiển và chắc chắn có thể trông xấu xí - nhưng nó chắc chắn có những công dụng hợp lệ mà bạn không thể đạt được nếu không có nó.


2
Đây là câu trả lời tốt nhất ở đây. Bạn thậm chí có thể bắt đầu bằng các dòng nói tối đa để giữ cho ngăn xếp nhật ký đủ ngắn, để bạn không phải ghi lại một tập hợp dữ liệu khổng lồ.
Matt Way

12

Câu trả lời ngắn gọn là không.

Nhưng

Nếu trường hợp sử dụng của bạn liên quan đến việc cố gắng ghi nhật ký dữ liệu thay đổi vĩnh viễn trong khi tránh giao diện điều khiển-bloat, thì một cách để đạt được điều này (trong các trình duyệt nhất định) sẽ là sử dụng console.clear()trước mỗi đầu ra.

function writeSingleLine (msg) {

  console.clear();
  console.log(msg);

}

writeSingleLine('this');
setTimeout( function () { writeSingleLine('is'); }, 1000);
setTimeout( function () { writeSingleLine('a'); }, 2000);
setTimeout( function () { writeSingleLine('hack'); }, 3000);

Lưu ý rằng điều này có thể sẽ phá vỡ bất kỳ chức năng ghi nhật ký nào khác đang diễn ra trong ứng dụng của bạn.

Tuyên bố từ chối trách nhiệm: Tôi sẽ coi đây là một vụ hack.


3
Rất nhiều một hack, nhưng thông minh. Nếu bạn theo dõi những gì đã được ghi vào bảng điều khiển (giả sử bằng cách duy trì một số loại bộ đệm ảo), bạn có thể xây dựng lại bộ đệm và thêm một chuỗi mới mỗi khi xóa.
danShumway

2

Nếu mục đích duy nhất của bạn là dừng in trên nhiều dòng, một cách là nhóm các giá trị nếu bạn không muốn chúng lấp đầy bảng điều khiển hoàn chỉnh của mình

Tái bút: - Hẹn gặp lại bảng điều khiển trình duyệt cho đầu ra

let arr = new Array(10).fill(0)


console.groupCollapsed('index')

arr.forEach((val,index) => {
  console.log(index)
})

console.groupEnd()

console.group

console.groupCollapsed


1

Đôi điều về ý tưởng @shennan:


1

thu thập đầu ra của bạn trong một mảng và sau đó sử dụng hàm nối với dấu phân tách ưu tiên

function echo(name, num){
    var ar= [];
    for(var i =0;i<num;i++){
        ar.push(name);
    }
    console.log(ar.join(', '));
}

echo("apple",3)

cũng kiểm tra Array.prototype.join () để biết chi tiết về chế độ

var elements = ['Fire', 'Wind', 'Rain'];

console.log(elements.join());
// expected output: Fire,Wind,Rain

console.log(elements.join(''));
// expected output: FireWindRain

console.log(elements.join('-'));
// expected output: Fire-Wind-Rain

0

Bạn có thể sử dụng toán tử chênh lệch để hiển thị đầu ra trong một dòng. Tính năng mới của javascript ES6. xem ví dụ dưới đây

   for(let i = 1; i<=10; i++){
        let arrData = [];
        for(let j = 1; j<= 10; j++){
            arrData.push(j+"X"+i+"="+(j*i));
        }
        console.log(...arrData);
    }

Điều đó sẽ in từ 1 đến 10 bảng trong một dòng.


0

nếu bạn muốn các phần tử mảng bản ghi bảng điều khiển chẳng hạn mà không có dòng mới, bạn có thể làm như thế này

const arr = [1,2,3,4,5];

Array.prototype.log = (sep='') => {
    let res = '';
    for(let j=0; j<this.lengthl j++){
        res += this[j];
        res += sep;
    }
    console.log(res);
}

// console loging

arr.log(sep=' '); // result is: 1 2 3 4 5 

-3
// Source code for printing 2d array
window.onload = function () {
    var A = [[1, 2], [3, 4]];
    Print(A);
}

function Print(A) {
    var rows = A.length;
    var cols = A[0].length;
    var line = "";
    for (var r = 0; r < rows; r++) {
        line = "";
        for (var c = 0; c < cols; c++) {
            line += A[r][c] + " ";
        }
        console.log(line);
    }
}

1
A.forEach(row => console.log(row.join(' ')))
vp_arth
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.