Javascript Nesneleri nasıl incelenir


100

Uyarı kutusundaki bir Nesneyi nasıl inceleyebilirim? Normalde bir Nesneyi uyarmak sadece düğüm adını atar:

alert(document);

Ama nesnenin özelliklerini ve yöntemlerini uyarı kutusunda almak istiyorum. Mümkünse bu işlevselliğe nasıl ulaşabilirim? Veya başka öneriler var mı?

Özellikle console.log ve Firebug'ın bulunmadığı bir üretim ortamı için çözüm arıyorum.


9
do console.logfirefox veya chrome
KJYe.Name葉家仁

1
Kafam karıştı. Bir üretim ortamında, gerçek kullanıcılarınız var, değil mi? Öyleyse neden nesne özellikleriyle bir uyarı atmak istersiniz? Belki daha iyi bir çözüm, nesneyi seri hale getirmek ve bir dosyaya kaydetmek veya bir e-posta göndermek olabilir?
Nathan Long

Belki bir araç olarak uyarıya ihtiyacı vardır, ancak başka bir şey yapmak için gerçek işlevselliğe ihtiyacı vardır. İstatistikleri göstermek ya da bir hata oluşumunu göstermek ya da nesneyi incelemek için kullandığı her şeye bir nesneyi basitçe ileterek her ikisini yapmak gibi, bunu yapmak istemesinin pek çok nedeni olabilir.
Christian


Bazen JSON.stringifyfaydalıdır.
BrainSlugs83

Yanıtlar:


56

for- inbir nesne ya da dizi içinde her özellik için döngüler. Değere ulaşmak ve onu değiştirmek için bu özelliği kullanabilirsiniz.

Not: Özel mülkler, bir "casus" kullanmadığınız sürece incelenemez; temel olarak, nesneyi geçersiz kılarsınız ve nesnenin bağlamı içinde bir for-in döngüsü oluşturan bir kod yazarsınız.

Görünüşe göre:

for (var property in object) loop();

Bazı örnek kodlar:

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

Düzenleme: Bir süre önce kendi müfettişimi yazdım, ilgilenirseniz paylaşmaktan mutluluk duyarım.

Düzenleme 2: Yine de bir tane yazdım.


Bir şekilde özyinelemeden korunmalıdır. Bazı dahili html oluşturucu kimlikleri içeren karmalar ( sözlükler )? Çaylakların bu çeki koda itmesi faydalı olabilir.
Nakilon

@Nakilon Özellikle PHP'de sonsuz özyineleme ile her zaman sorun yaşadım. Bunu düzeltmenin iki yolu vardır: bir derinlik parametresi kullanmak veya hash'i değiştirmek ve özyinelemeyi kontrol etmek için kullandığınız kendi özelliğinizi eklemek. Derinlik muhtemelen daha güvenlidir.
Christian

7. satırın bu versiyonunu daha çok beğendim. Biraz daha yakut gibi görünüyor ve güzel bir beyaz boşluk r.push (i + '"' + p + '" =>' + (t == 'nesne'? '{\ N' + xinspect (o [p], i + '') + ('\ n' + i + '},'): o [p] + ''));
BC.

2
Bu kod parçası iPhone'daki Safari Mobile'ı tamamen mahvetti. Daha güvenli bir alternatif için aşağıdaki JSON.stringify çözümünü tercih ederim.
Daniel

1
Bu şey safariye çarptı, krom bir nesneyi inceliyor, tavsiye etmem.
Keno

194

alert(JSON.stringify(object))Modern bir tarayıcıya ne dersiniz ?

Böyle bir durumda TypeError: Converting circular structure to JSON, işte daha fazla seçenek: Döngüsel referanslar olsa bile DOM düğümünü JSON'a nasıl serileştirebilirim?

Belgeler: JSON.stringify()çıktıyı biçimlendirme veya güzelleştirme hakkında bilgi sağlar.


+1 İyi bir öneri. Güzel bir şekilde görmek için jsonview ( jsonviewer.stack.hu ) kullanabileceğini ekledim .
Christian

2
Eğer güzel bir şekilde biçimlendirilmesini istiyorsanız, şunu çağırabilirsiniz: girinti için kullanılan boşluk sayısı alert(JSON.stringify(object, null, 4)nerede 4.
Jan Molak

Bu bana çıktı olarak 'tanımsız' veriyor. Karma testlerinde hata ayıklamaya çalışıyorum.
Alex C

1
Bu yaklaşımla ilgili uyarılar var. OP, nesnenin yöntemlerini incelemek istediğini söylüyor. stringify yöntemleri göstermez: JSON.stringify({f: ()=>{}}) => "{}". Ayrıca, nesne uygular eğer toJSONyöntemle ne olsun nesneyi incelemek istiyorsanız yararsız olduğunu yöntem geri döndüğünde,: JSON.stringify({toJSON: () => 'nothin'}) => '"nothin"'.
Morozov

39

console.dir(object)Firebug eklentisini kullanın


4
Bu bana peşinde olduğum şeyle ilgili en eksiksiz ve yararlı bilgileri verdi. Teşekkürler.
Shon

2
console.dirÖzelliğin farkında değildim . Firebug'da tüm nesneyi neden artık görüntüleyemediğimi çözemedim. Bu şimdi benim için sıraladı. Teşekkürler!
Andrew Newby

Bunun console.loggörüntüleme kolaylığı dışında başka avantajları olup olmadığını bilmem gerekiyor , lütfen
user10089632

17

Birkaç yöntem var:

 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) 

Bir konsol bağlamında, bazen .constructor veya .prototype yararlı olabilir:

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

17

Konsolunuzu kullanın:

console.log(object);

Veya html dom öğelerini inceliyorsanız, console.dir (nesne) kullanın. Misal:

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

Veya kullanabileceğiniz bir dizi js nesneniz varsa:

console.table(objectArr);

Çok sayıda console.log (nesne) çıktısı alıyorsanız, şunu da yazabilirsiniz:

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

Bu, konsola yazılan nesneleri etiketlemenize yardımcı olacaktır.


Görüntülenen bu değerler, gerçek zamanlı olarak dinamik olarak değişir ve hata ayıklama amacıyla yanıltıcı olabilir
user10089632

chrome'da konsol tercihlerinizi kullanın ve günlüğü koru seçeneğini tıklayın. Artık komut dosyanız sizi başka bir sayfaya yönlendirse bile konsolunuz temizlenmez.
Richard Torcato

Görünüşe göre bu sorun Firefox ile ilgili çünkü console.log () 'u yeniden başlatmadığınız sürece Chrome'da görüntülenen değerler hala. Chrome'a ​​geçmeyi önerebilirsiniz, ancak bazen tarayıcı özelliklerinin kullanılabilirliğini test ediyorsunuz. Neyse, yararlı olabilecek ipucu için teşekkürler.
user10089632

Ben kullanamıyorum consoleben stil kullanıyorum çünkü stackoverflow.com/q/7505623/1480391 ve uyumlu olmadığında
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 () bunu nasıl yapar? :)
Christian

Firefox veya Chrome kullanın. Firefox için Firebug edinin. olmalıdır
moe

Alay ediyordum. OP özellikle JS kodunu istedi ve firebug / fox / chrome'u araştırmasını önermediğiniz sürece, cevabını nerede bulacağını bilmiyorum.
Christian

6

Bu, Christian'ın mükemmel cevabının apaçık bir aldatmacasıdır. Sadece biraz daha okunaklı hale getirdim:

/**
 * 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

İşte daha okunaklı olan nesne denetçim. Kodun buraya yazılması uzun sürdüğünden, kodu http://etto-aa-js.googlecode.com/svn/trunk/inspector.js adresinden indirebilirsiniz.

Bunun gibi kullanın:

document.write(inspect(object));

2
Genelde durum böyledir (ve kesinlikle resmi rehberliktir - bağlantı göndermeyin), OTOH, bu şekilde versiyonlanan bir şey için, biraz hoş olabilir, çünkü her zaman bakacağınızı bildiğiniz için en son kod ve yıllar önce yayınlanan ve artık çalışmayabilecek bazı eski şeyler değil ... - Ayrıca, bu büyük kod bloğu, SO cevabı metninin duvarına yapıştırılmış oldukça kötü görünebilirdi ... - Konu dışı:
SO'da
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.