9

मुझे लगता है कि मुझे जावास्क्रिप्ट स्टेटमेंट के लिए आईई (आईई 8) हैंडलिंग में एक बग मिला है। इसे एक छोटे से उदाहरण के लिए उबलने के कई घंटों के बाद, ऐसा लगता है कि आईई विशेष रूप से किसी फॉर-इन लूप में "टूस्ट्रिंग" नामक किसी भी संपत्ति को छोड़ देता है - भले ही यह प्रोटोटाइप में है या ऑब्जेक्ट की "खुद की संपत्ति" है।आईई 8 बग के लिए जावास्क्रिप्ट कथन में?

मैं रखा है मेरी test code here:

function countProps(obj) { 
    var c = 0; 
    for (var prop in obj) { 
     c++; 
    } 
    return c; 
} 

var obj = { 
    toString: function() { 
     return "hello"; 
    } 
}; 

function test() { 
    var o = ""; 
    var d = document.getElementById('output'); 

    o += "<br/>obj.hasOwnProperty('toString') == " + obj.hasOwnProperty('toString'); 
    o += "<br/>countProps(obj) = " + countProps(obj); 
    o += "<br/>obj.toString() = " + obj.toString(); 

    d.innerHTML = o; 
} 

यह चाहिए उत्पादन:

obj.hasOwnProperty('toString') == true 
countProps(obj) = 1 
obj.toString() = hello 

लेकिन IE में, मैं हो रही है:

obj.hasOwnProperty('toString') == true 
countProps(obj) = 0 
obj.toString() = hello 

किसी भी इस विशेष आवरण 'टूस्ट्रिंग' नामक संपत्ति मेरे कोड के साथ विनाशकारी है जो एक फंक्शन.प्रोटोटाइप में विधियों की प्रतिलिपि बनाने की कोशिश करती है - मेरा सीयू स्टॉम टूस्ट्रिंग फ़ंक्शन हमेशा छोड़ा जाता है।

क्या कोई काम के आसपास जानता है? क्या यह किसी प्रकार का क्विर्क-मोड केवल व्यवहार है - या सिर्फ एक बग?

उत्तर

10

हाँ, यह एक बग है। this answer देखें।

का हवाला देते हुए CMS:

एक और अच्छी तरह से ज्ञात JScript बग, "DontEnum बग" है अगर इसके दायरे श्रृंखला में एक वस्तु एक संपत्ति है कि गणनीय नहीं है ({} DontEnum विशेषता है) शामिल हैं, अगर संपत्ति अन्य वस्तु पर आच्छादित है, यह, के रूप में गैर गणनीय रहना होगा उदाहरण के लिए:

var dontEnumBug = {toString:'foo'}.propertyIsEnumerable('toString'); 

यह IE पर गलत पर मूल्यांकन करेंगे, इस समस्याओं का उपयोग करते समय का कारण बनता है के लिए-मैं एन कथन, क्योंकि गुणों का दौरा नहीं किया जाएगा।

+1

धन्यवाद मेरा उत्तर के हवाले के लिए, मैं दूसरे सूत्र में समस्या के लिए कुछ वैकल्पिक हल पोस्ट करेंगे -और शायद अधिक कार्यान्वयन bugs-;) – CMS

+0

धन्यवाद। तो, जावास्क्रिप्ट स्पेक के विपरीत, यह एक ऐसा मामला है जहां उपयोगकर्ता परिभाषित संपत्ति गणना योग्य नहीं है। क्या ऐसी सभी संपत्तियों की एक सूची है, इसलिए मैं अपने कोड में एक विशेष परीक्षण जोड़ सकता हूं जब dontEnumBug सत्य नहीं है? – mckoss

+0

मैंने अपना टेस्ट कोड अपडेट किया: http://startpad.googlecode.com/hg/labs/js/misc/tostring.html चारों ओर एक कार्य विशेष रूप से नामित गुणों की उपस्थिति के लिए परीक्षण करना चाहिए: toString, toLocaleString, valueOf , IE8 के अपने परीक्षणों से, कन्स्ट्रक्टर, और isPrototypeOf है। – mckoss

2

यह आईई में एक बग है, और valueOf नामक गुणों पर भी लागू होता है।

आप इस तरह यह आस-पास काम कर सकते हैं:

if(obj.toString !== Object.prototype.toString || obj.hasOwnProperty("toString")) 
    //Handle it 
if(obj.valueOf !== Object.prototype.valueOf || obj.hasOwnProperty("valueOf")) 
    //Handle it 
+1

यह दूसरों पर भी लागू होता है। यहां एक सूची दी गई है: https://developer.mozilla.org/en/ECMAScript_DontEnum_attribute#JScript_DontEnum_Bug –

+0

में भी यही समस्या थी। अगर (obj.includes! == ऑब्जेक्ट .prototype.includes || obj.hasOwnProperty ("शामिल है")) { // हैंडलिट } –