5

संभव डुप्लिकेट:
Is Chrome's JavaScript console lazy about evaluating arrays?console.log में बग?

मैं निम्नलिखित कोड का प्रयास करें:

var myList = new Object(); 
var item = new Object(); 
item.text = "item-1"; 
myList[3] = item; 

console.log(myList); 
console.log(myList[3].text); 

// Assign another object to the same entry 
var item2 = new Object(); 
item2.text = "item-2"; 
myList[3] = item2; 

console.log(myList); 
console.log(myList[3].text); 

परिणाम काफी अजीब है:

* Object 
    * 3: Object 
     text: "item-2" 

item-1 

* Object 
    * 3: Object 
     text: "item-2" 

item-2 

, लेकिन - अगर मैं कुछ समय (setTimeout का प्रयोग करके) के बाद दूसरे भाग पर अमल, और पहली वस्तु उधेड़ना, मैं उसे सही करना, अर्थात्:

* Object 
    * 3: Object 
     text: "item-1" 

item-1 

* Object 
    * 3: Object 
     text: "item-2" 

item-2 

मैं यह महत्वपूर्ण साझा करने के लिए मिल जाए, के बाद से मुझे लगता है कि एक कर सकते हैं अपने कोड में क्या गलत है यह समझने की कोशिश कर रहे बहुत समय बर्बाद करें। और यदि किसी के पास खुली बग या कुछ का कुछ संदर्भ है - तो कृपया इस टिकट का उत्तर दें। धन्यवाद!

+2

क्रोम का कौन सा संस्करण उपयोग कर रहे हैं? किस मंच पर? मैंने अपने कंसोल में अपना कोड चलाने की कोशिश की और मुझे सही/तार्किक उत्तर मिला –

+0

आपने इसे 'सेटटाइमआउट' के साथ बिल्कुल कैसे कहा? मैंने इसे भी आजमाया और अपेक्षित परिणाम प्राप्त किए। – jsalonen

+0

यह एक बग नहीं है, यह एक सुविधा है! Console.log लॉग ऑब्जेक्ट का संदर्भ रखता है, ताकि आप रनटाइम में ऑब्जेक्ट का पूर्वावलोकन कर सकें। यदि आपने ऑब्जेक्ट की विशेषता को बदल दिया है, स्वाभाविक रूप से यह परिवर्तन इस वास्तविक समय पूर्वावलोकन में भी प्रदर्शित होता है। आप ऑब्जेक्ट ब्राउज़ करने का प्रयास कर सकते हैं, यह देखने के लिए कि इसका "पदानुक्रम" असीम रूप से गहरा है, इसलिए इसे कैश करना असंभव है। – Kasztan

उत्तर

0

मुझे किसी और चीज की तुलना में दौड़ की स्थिति की तरह लगता है। चूंकि आप केवल console.log() का संदर्भ पारित कर रहे हैं, इसलिए यह मानता है कि यह वास्तव में लॉग इन होने तक मूल्य बदल गया है। फिर जब आप setTimeout() का उपयोग करते हैं, तो लॉग इन होने के बाद मान बदल जाता है। console.log() के संदर्भ को पारित करने के बजाय, मान के क्लोन को पास करें।

0

यह कुछ ब्राउज़रों में कंसोल लॉग के साथ एक ज्ञात समस्या/सुविधा है।

जब आप कुछ लॉग करते हैं, तो इसे तुरंत टेक्स्ट प्रारूप में नहीं बदला जा सकता है। यदि लॉग आपके द्वारा लॉग किए गए ऑब्जेक्ट का संदर्भ संग्रहीत करता है, तो इसे वास्तव में लॉग में दिखाए जाने पर टेक्स्ट प्रारूप में बदल दिया जाएगा।

इसका लाभ यह है कि कुछ लॉगिंग करने पर प्रदर्शन पर बहुत कम प्रभाव पड़ता है, जब तक कि आप वास्तव में लॉग दिखाने के लिए लॉग विंडो नहीं खोलते।

यदि आपके पास कोड चलाने के दौरान लॉग विंडो खुलती है, तो आपके फ़ंक्शन चलने के दौरान कोई अपडेट नहीं हो रहा है (जैसा कि जावास्क्रिप्ट एकल थ्रेडेड है), इसलिए कंसोल विंडो मूल्यों को दिखाएगी क्योंकि वे अंत में हैं फ़ंक्शन का, जब विंडो अपडेट हो जाती है।

3
इस

एक known bug (50316) है कि बार-बार रिपोर्ट करने क्योंकि लोगों को रिपोर्ट करने के पहले बगट्रैकर पर एक नज़र डालें नहीं है:

दुख की बात है, इस बारे में कोई जानकारी नहीं है कि यह कब हल हो जाएगा। उस पल तक, आपको console.log() पर जाने से पहले वस्तुओं को क्लोन करना होगा।

5

मेरा विचार यह है कि यह एक बेहद परेशान करने वाला 'फीचर' है जो मैं वास्तव में चाहता हूं कि मैं बंद कर सकूं, यह एक दुःस्वप्न को डिबग कर देता है, यह नहीं जानता कि किस समय किसी वस्तु ने किसी ऑब्जेक्ट को अपडेट किया हो, जबकि सटीक स्थापित करने की कोशिश की जा रही है कोड में एक बिंदु बिंदु पर वस्तु स्थिति। सुविधा 'घड़ी बिंदु' आदि के लिए उपयोगी हो सकती है, लेकिन 'LOG' नामक किसी चीज़ में नहीं (सुराग नाम में है)।

var person = {'name':'Tom'}; 
console.log(person); //output the entire object variable 
person.name = 'Thomas'; 
//the output is an object, whose 'name' value is 'Thomas', even though the log statement was placed before the value was changed to 'Thomas'. 

और फिर:

इस कोड टुकड़ा पर विचार करें

var person = {'name':'Tom'}; 
console.log(person.name); //changed to output a string variable 
person.name = 'Thomas'; 
//the output here, however, has not dynamically updated and correctly outputs 'Tom' 
+1

बकवास, और मैंने सोचा कि मेरे पास क्वांटम कंप्यूटर था जो अपडेट होने से पहले मूल्य अपडेट कर सकता था! – FlavorScape

0

मैं क्रोम 20.0.1132.57 m.To के नवीनतम संस्करण पर इस "समस्या" के साथ कुछ प्रयोग किया है संक्षेप में प्रस्तुत मुख्य बिंदु: -

  • console.log() कोड को निष्पादित करते समय ऑब्जेक्ट का संदर्भ "> ऑब्जेक्ट" के रूप में संदर्भित करता है
  • जब आप त्रिभुज पर क्लिक करते हैं तो ऑब्जेक्ट की स्थिति प्रदर्शित होती है, चाहे कोड की रेखा के बावजूद console.log() को
  • यदि आप ऑब्जेक्ट को अपने वर्तमान स्थिति में प्रिंट करना चाहते हैं, तो क्लोन प्रिंट करें console.log(JSON.parse(JSON.stringify(obj)));

आप अपनी खुद की ब्राउज़र पर इस परीक्षण करने के लिए कोड के इस बिट इस्तेमाल कर सकते हैं:

window.onload = function() {chto = {a : 10, b : 20}; 
console.log('Open this object after 5 seconds') 
console.log(chto); 
console.log('Open this object before 5 seconds') 
console.log(chto); 
console.log('Console of the cloned object') 
console.log(JSON.parse(JSON.stringify(chto))); 
setTimeout(function(){ console.log('5 seconds up'); chto['b'] = 30; },5000) ; };