2009-05-14 14 views
21

निम्न कोड कभी-कभी झूठे का मूल्यांकन कैसे कर सकता है?जावास्क्रिप्ट स्ट्रिंग तुलना == कभी-कभी विफल रहता है

(transport.responseText == '1' || 
transport.responseText == 'CARD_VALID') 

मेरे जावा स्क्रिप्ट कोड:

if (transport.responseText == '1' || 
    transport.responseText == 'CARD_VALID') { 
    // do something. 
} 
else if (transport.responseText == 'CARD_INVALID' || 
      transport.responseText == 'INVALID_CHECKSUM') { 
    // do something else.... 
} 
else { 
    new Ajax.Request('/report_error.php?responseText='+transport.responseText); 
    // report error to user 
} 

क्या जावास्क्रिप्ट स्ट्रिंग तुलना == झूठी वापस जाने के लिए जब तार समान हैं का कारण बन सकता?

+1

जावास्क्रिप्ट समानता ऑपरेटर '==' छोटी नहीं है, यह असफल नहीं होता है। यदि बाएं और दाएं स्ट्रिंग में एक ही सामग्री है तो यह सच हो जाएगा। यदि यह झूठी वापसी कर रहा है तो या तो: 1. तार समान नहीं हैं। 2. एक स्ट्रिंग से पहले और बाद में व्हाइटस्पेस है, या 3. एक स्ट्रिंग में छुपे हुए नियंत्रण वर्ण या यूनिकोड वर्ण हैं। –

उत्तर

32

डबल बराबर जावास्क्रिप्ट में तारों की तुलना करने का उचित तरीका है, यह झूठ लौट रहा है तो बाईं ओर और एक स्ट्रिंग के दाएं दाएं स्थान हो सकते हैं।

तार के छोर पर एक .trim() रखो और मेरी तुलना काम करना शुरू करना चाहिए:

var panel = response.substr(0, response.indexOf("<")).trim(); 
if(panel == "combo"){ 
    //do something 
} 
+0

वाह, यह एक पुराना सवाल है , लेकिन उत्तर देने के लिए धन्यवाद। मैंने शायद कोशिश की, लेकिन कौन जानता है ... कि तीन साल पहले था। इस मुद्दे को रखने वाले किसी और के लिए: कृपया इसे आजमाएं। यदि यह काम करता है, तो यहां टिप्पणी करें और मैं इस उत्तर को सही के रूप में चिह्नित करूंगा! – chaimp

+0

हाँ। यह एक अच्छी टिप है। मैं «समान» (यहां तक ​​कि दृश्यमान सफेद जगहों के संबंध में) की तुलना कर रहा था, लेकिन वे मेल नहीं खा रहे थे क्योंकि उनमें से एक की एक नई लाइन या कैरिज रिटर्न (या कुछ) था जो प्रिंट नहीं करता था जब मैं यह पता लगाने की कोशिश कर रहा था कि क्या गलत था। –

+3

वास्तव में समकक्ष तुलना का उपयोग करना चाहिए: यदि (पैनल === "कॉम्बो")। – retrodrone

2

उस कोड ब्लॉक में प्रवेश करने से पहले responseText के मान को एक अलग चर में कैप्चर करने का प्रयास करें, यदि चर वहां कहीं भी अपडेट किया गया हो।

मेरे पास XmlHttpRequest का उपयोग करके सीधे इतना अनुभव नहीं है, लेकिन मुझे पता है कि जावास्क्रिप्ट में कई जगह हैं जहां यह इंटरफ़ेस ऑब्जेक्ट्स के अस्थिर संदर्भों का उपयोग करती है जो निष्पादन के दौरान एक साधारण मूल्य के बजाय बदल सकती हैं।

+0

अच्छा विचार लेकिन क्या यह संभव है? मैंने सोचा कि जेएस मोनो-थ्रेडेड था। – PhiLho

+0

उत्तर के लिए धन्यवाद। यह मुझे समझ में आया, इसलिए मैंने कोशिश की। हालांकि, हम अभी भी त्रुटि लॉग "CARD_VALID" में आ रहे हैं जिसका अर्थ यह है कि जेएस ने मूल्यांकन किया ('CARD_VALID' == 'CARD_VALID') को झूठी। कोई अन्य विचार? सैकड़ों सफल होने में यह प्रति दिन एक या दो है। केवल "पैटर्न" यह है कि उनमें से अधिकांश के लिए उपयोगकर्ता-एजेंट आईई 7 या आईई 7 प्रतीत होता है, हालांकि आईई 6 था ... – chaimp

+0

सुधार: "आईई 7 या आईई 8" – chaimp

10

मैं एक ऐसी ही समस्या है, जहां दो स्पष्ट रूप से समान तार बराबर नहीं होगा था, और मैं इसे हल करने की कोशिश मेरे बाल बाहर खींच रहा था, तो मैं ऐसा किया:

for (var c=0; c<string_1.length; c++) { 
    if (string_1.charCodeAt(c) != string_2.charCodeAt(c)) { 
     alert('c:'+c+' '+string_1.charCodeAt(c)+'!='+string_2.charCodeAt(c)); 
     valid = false; 
    } 
} 

और मैंने पाया कि अंतिम वर्ण एक स्ट्रिंग पर 10 था, और दूसरे पर आखिरी चरित्र 13 था, मैंने सोचा कि दोनों तारों को समाप्त कर दिया गया था, लेकिन वे नहीं थे।

4

बिल्कुल (प्रकार और मूल्य) से मेल खाने के लिए === का उपयोग करने का प्रयास करें। यह जावास्क्रिप्ट में अनुशंसित तुलना ऑपरेटर है।

सुनिश्चित करने के लिए तारों के डेटाटाइप की जांच करें, और दोनों तारों में छुपे हुए यूनिकोड या नियंत्रण वर्णों को देखें।

1

यदि आप चाहते हैं कुछ थोड़ा कम जटिल है और आप संख्यात्मक मान के साथ काम कर रहे हैं, का उपयोग

parseFloat() 

काम करता है एक आकर्षण

1
A1 = "speed" 
A2 = "speed" 

if(A1 == A2) => Error !!! 

उपयोग कंसोल में इस टेस्ट की तरह:

escape("speed") 

परिणाम: "गति"

escape(A1) 

परिणाम: "गति% 0 d" => यह समस्या% 0 d है !!!

escape(A2) 

परिणाम: "गति" => ठीक !!!

उपयोग सही कोड:

if(A1.slice(0, -1) == A2) This is OK! 
+1

एसओ में आपका स्वागत है। अपना उत्तर प्रारूपित करें और कुछ टिप्पणियां प्रदान करने का प्रयास करें। जब संभव हो तो एक छद्म कोड के बजाय एक वास्तविक उत्तर प्रदान करें (अब सहित)। आपके उत्तर को अन्य उपयोगकर्ताओं द्वारा प्रदान किए गए बहुमूल्य उत्तरों में कुछ जोड़ना चाहिए। एक नया दृष्टिकोण या बिंदु अन्यथा यह अनावश्यक है। – Masoud

+0

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

0

जावा सर्वलेट तार भेज सकते हैं अर्थात

out.println ("CARD_VALID");

या

out.print ("CARD_VALID");

ये जावास्क्रिप्ट में समान दिख सकते हैं, लेकिन पहले मामले में अंत में सफेद रिक्त स्थान हैं।

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