दिलचस्प पोस्ट
JQuery कैसे href टैग से मूल्य निकालने के लिए? जावा: क्लास.इस बेस 64 एन्कोडिंग छवि स्थानीय डेट को जावा.उटील.डेट और इसके विपरीत सरल रूपांतरण? जावास्क्रिप्ट / jQuery के माध्यम से एंड्रॉइड फोन का पता लगाएं Async कार्य समाप्त होने तक प्रतीक्षा कर रहा है क्या साफ़फ़िक्स नापसंद है? चेक के रूप में रेडियो बटन के लिए प्रारंभिक मान असाइन करें रास्पबेरी पीआई पर जावा एफएस एनसेंबल चेतावनी "PHP के लिए नेटबीन्स 7.4 पर" सुपर ग्लोबल $ _POST सरणी पर सीधे प्रवेश न करें " "अनअसाइन किए गए स्थानीय चर का उपयोग" क्या मतलब है? आप एक डेटाबेस में बहुरूपता से कैसे निपटते हैं? क्या "वापसी झूठी" क्या करता है? एक ज्ञात पैटर्न का उपयोग कर स्ट्रिंग से मूल्य पार्स करने के लिए sscanf के जावा बराबर क्या है? मैं TransactionScope का उपयोग सी # में कैसे करूं?

जावास्क्रिप्ट में, "0" झूठी के बराबर क्यों है, लेकिन जब 'if' द्वारा जांच की जाती है तो यह स्वयं के द्वारा गलत नहीं है?

निम्नलिखित से पता चलता है कि "0" जावास्क्रिप्ट में गलत है:

 >>> "0" == false true >>> false == "0" true 

तो क्यों निम्नलिखित प्रिंट "ha" ?

 >>> if ("0") console.log("ha") ha 

Solutions Collecting From Web of "जावास्क्रिप्ट में, "0" झूठी के बराबर क्यों है, लेकिन जब 'if' द्वारा जांच की जाती है तो यह स्वयं के द्वारा गलत नहीं है?"

इसका कारण यह है कि जब आप स्पष्ट रूप से "0" == false , तो दोनों पक्ष संख्याओं में परिवर्तित हो रहे हैं, और फिर तुलना की जाती है।

जब आप करते हैं: if ("0") console.log("ha") , स्ट्रिंग मान का परीक्षण किया जा रहा है। कोई भी रिक्त स्ट्रिंग true , जबकि एक खाली स्ट्रिंग false

बराबर (==)

यदि दो ऑपरैण्ड समान प्रकार के नहीं हैं , तो जावास्क्रिप्ट ने ऑपरेटर को परिवर्तित कर दिया है, तो सख्त तुलना लागू होती है। अगर कोई ऑपरैंड एक नंबर या बूलियन है , तो ऑपरेंड्स को संभवतः संख्या में बदल दिया जाता है; अन्यथा यदि कोई ऑपरेंड स्ट्रिंग है , तो अन्य ऑपरेंड को संभवतः एक स्ट्रिंग में कनवर्ट किया जाता है। यदि दोनों ऑपेन्ड ऑब्जेक्ट हैं , तो जावास्क्रिप्ट आंतरिक संदर्भों की तुलना करता है, जो समान हैं, जब ऑपरेटर्स स्मृति में समान ऑब्जेक्ट को देखें

(मोज़िला डेवलपर नेटवर्क में तुलना ऑपरेटर्स से)

समस्या प्रदर्शित करने वाले टेबल्स:

सच्चाई अगर बयान

और == जावास्क्रिप्ट में सभी वस्तु प्रकारों की सच्चाई की तुलना

कहानी उपयोग के नैतिक === विवेक प्रदर्शित करने वाला सख्त समानता

तालिका निर्माण क्रेडिट: https://github.com/dorey/JavaScript-Equality-Table

यह कल्पना के अनुसार है

 12.5 अगर स्टेटमेंट 
 .....

 2. यदि ToBoolean (GetValue (exprRef)) सच है, तब 
 ए।  प्रथम वक्तव्य का मूल्यांकन करने के परिणाम पर लौटें 
 3. फिर, 
 ....

टोबोलियन, कल्पना के अनुसार, है

सार ऑपरेशन ToBoolean तालिका 11 के अनुसार अपने तर्क को बूलियन प्रकार के मान में कनवर्ट करता है:

और वह तालिका स्ट्रिंग्स के बारे में यह कहती है:

यहां छवि विवरण दर्ज करें

परिणाम झूठा है यदि तर्क खाली स्ट्रिंग है (इसकी लंबाई शून्य है); अन्यथा परिणाम सच है

अब, यह समझाने के लिए क्यों "0" == false आपको समानता ऑपरेटर को पढ़ना चाहिए, जिसमें कहा गया है कि यह अमूर्त ऑपरेशन GetValue(lref) से इसके मूल्य को दायें-किनारे के लिए समान से मेल खाता है।

जो इस प्रासंगिक हिस्से का वर्णन करता है:

 अगर IsPropertyReference (वी), तो फिर 
 ए।  अगर HasPrimitiveBase (V) झूठी है, तो आइए, [[Get]] आधार की आंतरिक विधि हो, अन्यथा दें
 विशेष [[जाओ]] नीचे परिभाषित आंतरिक विधि हो 
 ख।  आधार के रूप में इसका आधार मान लें और पारित होने के लिए आंतरिक विधि प्राप्त करने का परिणाम लौटाएं 
 तर्क के लिए GetReferencedName (V)

या दूसरे शब्दों में, एक स्ट्रिंग में एक आदिम आधार होता है, जो आंतरिक प्राप्त विधि को वापस कॉल करता है और झूठी दिखती है।

यदि आप GetValue ऑपरेशन उपयोग == उपयोग करके चीजों का मूल्यांकन करना चाहते हैं, यदि आप ToBoolean का उपयोग करके मूल्यांकन करना चाहते हैं, तो === उपयोग करें ("सख्त" समानता ऑपरेटर के रूप में भी जाना जाता है)

यह PHP है जहां स्ट्रिंग "0" झूठी है (झूठी-जब-उपयोग में-बूलियन-संदर्भ)। जावास्क्रिप्ट में, सभी नॉन-रिक्त स्ट्रिंग सत्य हैं।

चाल यही है कि बूलियन के खिलाफ बुलियन के खिलाफ == मूल्यांकन नहीं होता है, यह संख्या में धर्मान्तरित होता है, और स्ट्रिंग के मामले में जो दशमलव के रूप में पार्सिंग द्वारा किया जाता है। तो आपको सत्यता बूलियन true बजाय संख्या 0 मिलता true

यह भाषा डिजाइन का एक बहुत कम खराब है और यह एक कारण है कि हम दुर्भाग्यपूर्ण == ऑपरेटर का उपयोग नहीं करने का प्रयास करते हैं। इसके बजाय === उपयोग करें

 // I usually do this: x = "0" ; if (!!+x) console.log('I am true'); else console.log('I am false'); // Essentially converting string to integer and then boolean. 

0 आसपास के आपके उद्धरण एक स्ट्रिंग बनाते हैं, जो कि सही के रूप में मूल्यांकन किया जाता है।

उद्धरण निकालें और इसे काम करना चाहिए

 if (0) console.log("ha") 

यह सभी ईसीएमए चश्मे के कारण है … "0" == false यहाँ निर्दिष्ट नियमों के कारण "0" == false है http://ecma262-5.com/ELS5_HTML.htm#Section_11.9.3 … और if ('0') यहां निर्दिष्ट नियमों के कारण सत्य का मूल्यांकन करता है http://ecma262-5.com/ELS5_HTML.htm#Section_12.5

"अगर" अभिव्यक्ति सत्यत्व के लिए परीक्षण करते हैं, जबकि टाइप-स्वतंत्र समानता के लिए डबल-बराबर परीक्षण एक स्ट्रिंग हमेशा सच्चाई है, जैसा कि दूसरों ने यहां बताया है। यदि डबल-बराबर दोनों अपने परिचालनों को सत्यत्व के लिए परीक्षण कर रहे हैं और फिर परिणामों की तुलना करते हैं, तो आपको उस परिणाम को प्राप्त करना चाहिए जो आप सोच रहे थे, अर्थात् ("0" == true) === true । जैसे डग क्रॉकरफोर्ड ने अपने उत्कृष्ट जावास्क्रिप्ट: गुड पार्ट्स में कहा है, "जिन नियमों के द्वारा [== अपने ऑपरेंड्स के प्रकार को शामिल करता है] जटिल और बेहिचक हैं …. पारगमन की कमी खतरनाक है।" यह कहने के लिए पर्याप्त है कि एक ऑपरैन्ड दूसरे से मिलान करने के लिए प्रकार-जोर से है, और "0" को अंतराल शून्य के रूप में समझा जा रहा है, जो बदले में बुलियन के बराबर है (या गलत शून्य के बराबर है) जब एक संख्या के लिए मजबूर)

 if (x) 

जावा के आंतरिक से बुलियन (http://es5.github.com/#x9.2) का उपयोग कर coerces x

 x == false 

दोनों पक्षों को आंतरिक सेनंबर मजबूरन (http://es5.github.com/#x9.3) का उपयोग करते हैं या ऑब्जेक्ट्स के लिए पंथीकृत (http://es5.github.com/#x9.1)

पूर्ण विवरण के लिए देखें http://javascriptweblog.wordpress.com/2011/02/07/truth-equality-and-javascript/