2011-10-10 14 views
7

विफल रहता है मेरे पास मेरे जेएस एप्लिकेशन में यादृच्छिक आधार पर एक सुंदर अजीब बग है। असल में, स्क्रिप्ट दो तारों की सटीक तुलना करने में विफल रहता है। अधिक विशेष रूप से, कभी-कभी दो समान तारों को समान नहीं दिखता है: ('blah' == 'blah')false देता है।जावास्क्रिप्ट स्ट्रिंग तुलना यादृच्छिक रूप से

मजाकिया बात यह है कि एक और प्रयास पर, एक ही दो तारों को समान माना जा सकता है (कथन true देता है)। मैंने कभी पैटर्न को समझने में कामयाब नहीं रहा। मैंने == के बजाय === का उपयोग करने का भी प्रयास किया है; यह मदद नहीं की।

मैं स्क्रीनकास्ट रिकॉर्ड करने के अलावा इस हास्यास्पद बग को प्रदर्शित करने और साबित करने का एक बेहतर तरीका नहीं सोच सका। तो यहां यह है: http://www.screenr.com/klOs। मैं उस वीडियो में प्रत्येक प्रश्नोत्तरी के लिए सही उत्तर दे रहा हूं, लेकिन अंत के करीब आप 'जापान' और 'ताइवान' के लिए मेरे उत्तरों को 'गलत' के रूप में कैसे माना जाएगा; कंसोल भी दिए गए उत्तर स्ट्रिंग, सही उत्तर स्ट्रिंग, और उनकी तुलना का परिणाम दिखाएगा (false? !!)।

तो संभवतः इस अजीब व्यवहार का कारण क्या हो सकता है और मैं इसे ठीक करने के लिए कैसे हो सकता हूं?

आप स्क्रीनकास्ट में तुलनात्मक कथन के साथ कोड देख सकते हैं। 'Params.givenAnswer' बटन पाठ लेबल से सीधे आता है:

//*** Options for answering the card quiz 
quizOptions = new Ext.Panel({ 
     id: 'quizOptions', 
     […………] 
     listeners: { 
      el: { 
       scope: this, 
       tap: this.checkAnswer 
      } 
     } 
}); 


checkAnswer: function(container, element) { 

    // Get the text value of the button clicked 
    var answer = Ext.fly(element).dom.innerText; 

    Ext.dispatch({ 
     controller: 'Practice', 
     action: 'checkAnswer', 
     givenAnswer: answer 
    }); 
}, 

अद्यतन आप @JAAulde और @Mike धन्यवाद! क्यों स्ट्रिंग तुलना में विफल रहता है

enter image description here

अब यह स्पष्ट है: वहाँ में एक तरह की एक अतिरिक्त लाइन ब्रेक होने लगते हैं मैं उद्धरण और प्रवेश में वर प्रकार शामिल करने के लिए कोशिश की है और मैं इस परिणाम मिला पहली स्ट्रिंग यह अभी भी बहुत अजीब है, क्योंकि यह पिछले लॉगिंग में एक खाली नई लाइन के रूप में नहीं दिखाई देता था, और सबसे महत्वपूर्ण बात यह है कि यह यादृच्छिक रूप से दिखाई देता है (ध्यान दें कि इस समय बिना किसी समस्या के 'ताइवान' को कैसे स्वीकार किया गया था)।

मैंने उत्तर तारों के लिए एक साधारण लाइन-ब्रेक हटाने का नियम शामिल किया है, और अब सब ठीक काम करने लगते हैं। बहुत बहुत धन्यवाद!

+0

स्क्रीनकास्ट यह स्पष्ट नहीं करता है कि मान 'स्ट्रिंग' और 'स्ट्रिंग' या 'ऑब्जेक्ट' 'toString' विधि के साथ नहीं हैं। हो सकता है कि आपके लॉगिंग में मूल्यों की तुलना में 'टाइपोफ' शामिल होना चाहिए। –

+2

अपने लॉगिंग को समायोजित करें जैसे आउटपुट किए जा रहे स्ट्रिंग उद्धरणों में लिपटे हैं: 'console.log ('' '+ value +' '' ');' यह हो सकता है कि आपके पास कुछ सफेद जगहें हों। लॉगिंग 'टाइपोफ़' भी अच्छा होगा। – JAAulde

+1

यह बहुत अजीब है। क्या आप एन्कोडिंग (आईएसओ -885 9 -1, यूटीएफ -8) या कुछ मिश्रण कर रहे हैं? तुलना से पहले दोनों पर .toString() 'चलने का प्रयास किया? –

उत्तर

0

=== का उपयोग करना एक सख्त समानता तुलना है। इसका मतलब है कि डेटा प्रकार और सामग्री की तुलना की जा रही है। वे दोनों (डेटा और प्रकार) बराबर और सत्य लौटने के समान होना चाहिए।

जब आपने अपनी सख्त तुलना को == पर स्विच किया था तो टेस्ट को काम करना चाहिए था, भले ही डेटा प्रकार अलग थे। यह अतिरिक्त रिक्त स्थान की वजह से विफल रहा।

संबंधित मुद्दे