Cách kiểm tra các đối tượng Javascript


100

Làm cách nào tôi có thể kiểm tra một Đối tượng trong hộp cảnh báo? Thông thường, cảnh báo một Đối tượng chỉ cần ném tên nút:

alert(document);

Nhưng tôi muốn lấy các thuộc tính và phương thức của đối tượng trong hộp cảnh báo. Làm cách nào để đạt được chức năng này, nếu có thể? Hoặc có bất kỳ đề xuất nào khác?

Đặc biệt, tôi đang tìm kiếm giải pháp cho môi trường sản xuất không có console.log và Firebug.


9
làm console.logtrên firefox hoặc chrome
KJYe.Name 葉家仁

1
Tôi bối rối. Trong môi trường sản xuất, bạn đã có người dùng thực tế, phải không? Vậy tại sao bạn lại muốn đưa ra một cảnh báo với các thuộc tính đối tượng? Có lẽ một giải pháp tốt hơn là tuần tự hóa đối tượng và đăng nhập nó vào một tệp hoặc gửi email?
Nathan Long

Có thể anh ta / anh ta cần cảnh báo như một công cụ, nhưng chức năng thực sự để làm một việc khác. Có thể có đủ loại lý do khiến anh / anh ta có thể muốn làm điều này, chẳng hạn như hiển thị số liệu thống kê, hoặc xảy ra lỗi, hoặc thực hiện cả hai bằng cách chỉ cần chuyển một đối tượng cho bất kỳ thứ gì anh / chị đang sử dụng để kiểm tra đối tượng.
Christian


Đôi khi JSON.stringifylà hữu ích.
BrainSlugs83

Câu trả lời:


56

for- Các invòng lặp cho mỗi thuộc tính trong một đối tượng hoặc mảng. Bạn có thể sử dụng thuộc tính này để nhận giá trị cũng như thay đổi nó.

Lưu ý: Tài sản riêng không có sẵn để kiểm tra, trừ khi bạn sử dụng "gián điệp"; về cơ bản, bạn ghi đè đối tượng và viết một số mã thực hiện vòng lặp for-in bên trong ngữ cảnh của đối tượng.

Đối với trong trông giống như:

for (var property in object) loop();

Một số mẫu mã:

function xinspect(o,i){
    if(typeof i=='undefined')i='';
    if(i.length>50)return '[MAX ITERATIONS]';
    var r=[];
    for(var p in o){
        var t=typeof o[p];
        r.push(i+'"'+p+'" ('+t+') => '+(t=='object' ? 'object:'+xinspect(o[p],i+'  ') : o[p]+''));
    }
    return r.join(i+'\n');
}

// example of use:
alert(xinspect(document));

Edit: Một thời gian trước, tôi đã viết thanh tra của riêng tôi, nếu bạn quan tâm, tôi rất vui khi được chia sẻ.

Chỉnh sửa 2: Chà, dù sao thì tôi cũng đã viết một bài.


Cần được bảo vệ bằng cách nào đó khỏi đệ quy. Hàm băm ( từ điển ) với một số id trình kết xuất html nội bộ? Có thể hữu ích cho các noobs để đẩy kiểm tra này vào mã.
Nakilon

@Nakilon Tôi luôn gặp vấn đề với đệ quy vô hạn, đặc biệt là trong PHP. Có hai cách để khắc phục điều này: sử dụng tham số độ sâu hoặc sửa đổi hàm băm và thêm thuộc tính của riêng bạn mà bạn sử dụng để kiểm tra đệ quy. Độ sâu có lẽ an toàn hơn.
Christian

Tôi thích phiên bản này của dòng 7 hơn. Nó trông giống ruby ​​hơn một chút và có một số khoảng trắng đẹp r.push (i + '"' + p + '" =>' + (t == 'object'? '{\ N' + xinspect (o [p], i + '') + ('\ n' + i + '},'): o [p] + ''));
BC.

2
Đoạn mã đó đã phá hỏng hoàn toàn Safari Mobile trên iPhone. Tôi muốn sử dụng giải pháp JSON.stringify bên dưới để có một giải pháp thay thế an toàn hơn.
Daniel

1
Điều này đã bị rơi safari, chrome kiểm tra một đối tượng, sẽ không được đề xuất.
Keno

194

Còn alert(JSON.stringify(object))với một trình duyệt hiện đại thì sao?

Trong trường hợp của TypeError: Converting circular structure to JSON, đây là các tùy chọn khác: Làm thế nào để tuần tự hóa nút DOM thành JSON ngay cả khi có các tham chiếu vòng?

Tài liệu: JSON.stringify()cung cấp thông tin về định dạng hoặc kiểm tra đầu ra.


+1 Đề xuất hay. Tôi muốn nói thêm rằng anh ấy có thể sử dụng jsonview ( jsonviewer.stack.hu ) để xem nó độc đáo.
Christian

2
Nếu bạn cũng muốn nó được định dạng đẹp, bạn có thể gọi:, alert(JSON.stringify(object, null, 4)đâu 4là số khoảng trắng được sử dụng để thụt lề.
Jan Molak

Điều này cho tôi 'không xác định' làm đầu ra. Tôi đang cố gắng gỡ lỗi các bài kiểm tra nghiệp chướng.
Alex C

1
Có những lưu ý đối với cách tiếp cận này. OP nói rằng cô ấy muốn kiểm tra các phương thức của đối tượng. stringify sẽ không hiển thị phương pháp: JSON.stringify({f: ()=>{}}) => "{}". Ngoài ra, nếu các dụng cụ đối tượng toJSONphương pháp mà bạn có được những gì mà phương pháp lợi nhuận, mà là vô ích nếu bạn muốn kiểm tra các đối tượng: JSON.stringify({toJSON: () => 'nothin'}) => '"nothin"'.
Morozov

39

Sử dụng console.dir(object)và plugin Firebug


4
Điều này đã cho tôi thông tin đầy đủ và hữu ích nhất cho những gì tôi đang theo đuổi. Cảm ơn.
Shon

2
Tôi không biết về console.dirtính năng này. Tôi không thể tìm ra lý do tại sao tôi không thể xem toàn bộ đối tượng trong Firebug nữa. Điều này bây giờ đã được sắp xếp nó cho tôi. Cảm ơn!
Andrew Newby

Tôi cần phải biết nếu có lợi thế khác của việc này qua console.logbên cạnh sự tiện lợi hiển thị, xin vui lòng
user10089632

17

Có một số phương pháp:

 1. typeof tells you which one of the 6 javascript types is the object. 
 2. instanceof tells you if the object is an instance of another object.
 3. List properties with for(var k in obj)
 4. Object.getOwnPropertyNames( anObjectToInspect ) 
 5. Object.getPrototypeOf( anObject )
 6. anObject.hasOwnProperty(aProperty) 

Trong bối cảnh bảng điều khiển, đôi khi .constructor hoặc .prototype có thể hữu ích:

console.log(anObject.constructor ); 
console.log(anObject.prototype ) ; 

17

Sử dụng bảng điều khiển của bạn:

console.log(object);

Hoặc nếu bạn đang kiểm tra các phần tử html dom, hãy sử dụng console.dir (object). Thí dụ:

let element = document.getElementById('alertBoxContainer');
console.dir(element);

Hoặc nếu bạn có một mảng các đối tượng js, bạn có thể sử dụng:

console.table(objectArr);

Nếu bạn đang xuất ra nhiều console.log (đối tượng), bạn cũng có thể viết

console.log({ objectName1 });
console.log({ objectName2 });

Điều này sẽ giúp bạn gắn nhãn các đối tượng được ghi vào bảng điều khiển.


Những giá trị hiển thị tự động thay đổi theo thời gian thực có thể được gây hiểu lầm cho các mục đích gỡ lỗi
user10089632

trong chrome, sử dụng tùy chọn bảng điều khiển của bạn và nhấp vào giữ nhật ký. Bây giờ, ngay cả khi tập lệnh của bạn chuyển hướng bạn đến một trang khác, bảng điều khiển của bạn vẫn không bị xóa.
Richard Torcato

Có vẻ như vấn đề này liên quan đến Firefox vì trong Chrome trừ khi bạn render console.log (), các giá trị hiển thị vẫn còn. Bạn có thể đề xuất chuyển sang Chrome nhưng đôi khi bạn đang kiểm tra tính khả dụng của các tính năng của trình duyệt. Dù sao, cảm ơn vì mẹo có thể hữu ích.
user10089632

Tôi không thể sử dụng consolevì tôi đang sử dụng tạo kiểu stackoverflow.com/q/7505623/1480391 và nó không tương thích
Yves M.

9
var str = "";
for(var k in obj)
    if (obj.hasOwnProperty(k)) //omit this test if you want to see built-in properties
        str += k + " = " + obj[k] + "\n";
alert(str);

Console.log () làm như thế nào? :)
Christian

sử dụng Firefox hoặc Chrome. Tải xuống Firebug cho Firefox. phải có
moe

Tôi đã bị mỉa mai. OP đã hỏi cụ thể về mã JS và trừ khi bạn đề nghị anh ấy đi sâu vào firebug / fox / chrome, tôi không biết anh ấy sẽ tìm câu trả lời ở đâu.
Christian

6

Đây là câu trả lời tuyệt vời của Christian. Tôi vừa làm cho nó dễ đọc hơn một chút:

/**
 * objectInspector digs through a Javascript object
 * to display all its properties
 *
 * @param object - a Javascript object to inspect
 * @param result - a string of properties with datatypes
 *
 * @return result - the concatenated description of all object properties
 */
function objectInspector(object, result) {
    if (typeof object != "object")
        return "Invalid object";
    if (typeof result == "undefined")
        result = '';

    if (result.length > 50)
        return "[RECURSION TOO DEEP. ABORTING.]";

    var rows = [];
    for (var property in object) {
        var datatype = typeof object[property];

        var tempDescription = result+'"'+property+'"';
        tempDescription += ' ('+datatype+') => ';
        if (datatype == "object")
            tempDescription += 'object: '+objectInspector(object[property],result+'  ');
        else
            tempDescription += object[property];

        rows.push(tempDescription);
    }//Close for

    return rows.join(result+"\n");
}//End objectInspector

4

Đây là trình kiểm tra đối tượng của tôi dễ đọc hơn. Vì mất nhiều thời gian để ghi mã ở đây nên bạn có thể tải xuống tại http://etto-aa-js.googlecode.com/svn/trunk/ins rà.js

Sử dụng như thế này:

document.write(inspect(object));

2
Đó là trường hợp thường xảy ra (và đó chắc chắn là hướng dẫn chính thức - không đăng liên kết), OTOH, đối với một cái gì đó được phiên bản như thế này, nó có thể khá hay, vì bạn biết rằng bạn sẽ luôn xem xét mã mới nhất, và không phải thứ cũ kỹ nào đó đã được đăng cách đây nhiều năm và có thể không hoạt động nữa ... - Ngoài ra, khối mã khổng lồ đó sẽ trông khá khủng khiếp được dán vào một bức tường văn bản SO câu trả lời ... - Lạc đề: nó sẽ được tốt đẹp nếu có một cách trên SO để có "spoiler" -như thẻ cho mã và để có thể liên kết đến một nguồn bên ngoài và có nó tự động cập nhật (nếu có thể),
BrainSlugs83
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.