Console.log'un bir nesnenin mevcut durumunu göstermesini nasıl sağlayabilirim?


148

Eklenti console.logiçermeyen Safari'de (ve aslında diğer tarayıcıların çoğu), nesneyi console.logçağrıldığı durumda değil, son yürütme durumunda gösterecektir .

console.logNesnenin o satırdaki durumunu elde etmek için nesneyi sadece çıktı olarak klonlamam gerekiyor.

Misal:

var test = {a: true}
console.log(test); // {a: false}
test.a = false; 
console.log(test); // {a: false}

2
jsfiddle sorunun örneği ve aşağıda verilen çeşitli çözümler: jsfiddle.net/luken/M6295
Luke

7
Günlük işlevinin nesneye canlı bir referans çıktısı vermesi son derece mantıksızdır . Buna saat denir ve günlük girişinden çok farklıdır. Bir nesneyi günlüğe kaydederken bunu yapmak, ilkel bir değeri depolayan bir değişkeni günlüğe kaydetmekten daha mantıklı değildir.
faintsignal

2
Bunu daha önce nasıl hiç karşılaşmadım? Bunu korkutucu buluyorum
ErikAGriffin

Yanıtlar:


173

Sanırım arıyorsun console.dir().

console.log()istediğiniz şeyi yapmaz çünkü nesneye bir referans yazdırır ve onu açtığınızda değişir. console.dironu çağırdığınız anda nesnedeki özelliklerin bir dizinini yazdırır.

Aşağıdaki JSON fikri iyi bir fikirdir; JSON dizesini ayrıştırmaya devam edebilir ve .dir () 'nin size vereceği gibi göz atılabilir bir nesne elde edebilirsiniz:

console.log(JSON.parse(JSON.stringify(obj)));


38
Benim için Chrome13'te console.logve arasında fark yokconsole.dir
Andrew D.

Hm, bu şaşırtıcı - Firebug'da çalışıyor. Webkit'te de aynı olduğunu düşünmüştüm.
evan

1
Chrome'da gördüğüm şey, günlük ifadesi çalıştırıldıktan sonra konsolu açarsanız, genişlettiğinizde tembel değerlendirmeyi yapacağıdır. Ancak konsol zaten açıksa (örneğin, konsolu açarsanız ve ardından sayfada yenile tuşuna basarsanız), istekli bir değerlendirme yapacaktır - yani, günlük ifadesinin çalıştırıldığı anda değeri yazdırın.
Polemarch

6
Ayrıca, sığ kopya derin kopya için olduğu gibi, dir JSON içindir. console.dir () yalnızca üst düzey nesnenin özelliklerini değerlendirir (daha derinlemesine iç içe geçmiş diğer nesneler değerlendirilmez), JSON ise yinelemeli olarak devam eder.
Polemarch

9
Aynı şekilde benim için console.dirChrome'da (v33) çalışmıyor. İşte insanların sunduğu çözümlerin bir karşılaştırması: jsfiddle.net/luken/M6295
Luke

70

Günlüğe kaydedildiği andaki durumunu görmek istersem genellikle yaptığım şey onu bir JSON dizesine dönüştürmemdir.

console.log(JSON.stringify(a));

4
Harika, bu benim için güzel bir ipucuydu: Nesnemin tam konsolda olması için onu yeniden ayrıştırmam gerekti. function odump(o){ console.log($.parseJSON(JSON.stringify(o))); }
Chris

1
teşekkürler bu benim için çalışıyor! console.dir yazdırmadı
ah-shiang han

1
ya nesneniz dairesel bir yapı içeriyorsa?
Alex McMillan

1
@AlexMcMillan Şunları kullanabilirsiniz birini arasında birkaç dairesel referanslarla nesnelerin JSON stringification izin kütüphaneler.
Alex Turpin

7
Tanrım. Bu, yapılabilecek basit ve bariz bir şey olmalıdır. Bunun yerine dizgiye dökmek, ayrıştırmak, günlüğe kaydetmek ve özel bir döngüsel referans kitaplığı kullanmak zorundayız!?! Tarayıcıların basit hata ayıklama ihtiyaçlarını desteklemek için daha iyi bir iş çıkarması gerektiğini düşünüyorum.
Mars

27

Vanilya JS:

@ evan'ın cevabı burada en iyi görünüyor. Sadece (ab), nesnenin bir kopyasını etkili bir şekilde oluşturmak için JSON.parse / stringify kullanın.

console.log(JSON.parse(JSON.stringify(test)));

JQuery'ye özel çözüm:

İle belirli bir zamanda bir nesnenin anlık görüntüsünü oluşturabilirsiniz. jQuery.extend

console.log($.extend({}, test));

Burada gerçekte olan şey, jQuery testnesnenin içeriğiyle yeni bir nesne oluşturuyor ve bunu günlüğe kaydetiyor (böylece değişmeyecek).

AngularJS (1) özel çözüm:

Açısal copy, aynı etkiyle kullanılabilecek bir işlev sağlar :angular.copy

console.log(angular.copy(test));

Vanilla JS sarmalayıcı işlevi:

İşte console.logherhangi bir nesneyi sarmalayan ancak oturumu kapatmadan önce bir kopyasını oluşturan bir işlev .

Bunu yanıtlardaki birkaç benzer ancak daha az sağlam işleve yanıt olarak yazdım. Birden fazla argüman destekler ve olacak değil bunlar değilse şeyleri kopyalamak için deneyin düzenli nesneler.

function consoleLogWithObjectCopy () {
  var args = [].slice.call(arguments);
  var argsWithObjectCopies = args.map(copyIfRegularObject)
  return console.log.apply(console, argsWithObjectCopies)
}

function copyIfRegularObject (o) {
  const isRegularObject = typeof o === 'object' && !(o instanceof RegExp)
  return isRegularObject ? copyObject(o) : o
}

function copyObject (o) {
  return JSON.parse(JSON.stringify(o))
}

örnek kullanım :consoleLogWithObjectCopy('obj', {foo: 'bar'}, 1, /abc/, {a: 1})


6

Bu > Object konsoldaki, sadece mevcut durumu gösterilmiyor. Aslında, siz genişletene kadar nesneyi ve özelliklerini okumayı erteliyor.

Örneğin,

var test = {a: true}
console.log(test);
setTimeout(function () {
    test.a = false; 
    console.log(test);
}, 4000);

Sonra ilk aramayı genişletin, ikinci console.logdönüşten önce yaparsanız doğru olacaktır.


2

Xeon06'nın ipucunu kullanarak, JSON'sini bir nesnede ayrıştırabilirsiniz ve şimdi nesnelerimi dökmek için kullandığım günlük işlevi:

function odump(o){
   console.log($.parseJSON(JSON.stringify(o)));
}

1

Bir yardımcı program tanımladım:

function MyLog(text) {
    console.log(JSON.stringify(text));
}

ve konsolda oturum açmak istediğimde şunu yapıyorum:

MyLog("hello console!");

Çok iyi çalışıyor!



1

Hata ayıklayıcı kitaplığı kullanma seçeneği vardır.

https://debugjs.net/

Sadece komut dosyasını web sayfanıza ekleyin ve günlük ifadeleri yerleştirin.

<script src="debug.js"></script>

Kerestecilik

var test = {a: true}
log(test); // {a: true}
test.a = false; 
log(test); // {a: false}

0

Bunu önerdiğim için vurulabilirim ama bu bir adım daha ileri götürülebilir. Daha net hale getirmek için konsol nesnesinin kendisini doğrudan genişletebiliriz.

console.logObject = function(o) {
  (JSON.stringify(o));
}

Bunun uzay-zaman sürekliliğinde bir tür kütüphane çarpışmasına / nükleer erimeye / parçalanmaya neden olup olmayacağını bilmiyorum. Ama qUnit testlerimde güzel çalışıyor. :)


1
Bu hiçbir şeyi kaydetmez. Sadece bir şeyi zorlaştırmanın sonucunu yutar. Olumlu oylar alması komik
Zach Lysobey

0

Konsolu açtıktan sonra sayfayı yenilemeniz veya isteği hedeflenen sayfaya göndermeden önce konsolu açmanız yeterlidir ...


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.