दिलचस्प पोस्ट
PHP और अपरिभाषित करने के लिए कोणीय HTTP पोस्ट Fill_parent और wrap_content के बीच अंतर क्या है? सी में मैक्रोज़ में कोष्ठकों की आवश्यकता एंड्रॉइड एमुलेटर दृश्य से बाहर है, मैं इसे कैसे स्थानांतरित कर सकता हूं? मजबूत पासवर्ड सत्यापन के लिए PHP नियमित अभिव्यक्ति कैसे सीएसएस में विक्रेता उपसर्गों को मान्य करने के लिए -webkit- और -moz-? फ़्रेम-बाय-फ़्रेम एनीमेशन प्रारंभ करना RegExp के exec () फ़ंक्शन और स्ट्रिंग के मैच () फ़ंक्शन में क्या अंतर है? नियमित अभिव्यक्तियों का उपयोग करते हुए डॉट मैच न्यूलाइन वर्णों को कैसे बनाते हैं नोडजे में समयक्षेत्र ऑफसेट कैसे उपयोग करें? अधिकतम निवेदन लंबाई से अधिक। वर्णों को जावा में पूर्णांक में परिवर्तित करना PyCharm में अनसुलझे संदर्भ मुद्दा JFrames के बीच मूल्यों को पास करना मेरे फुटर फ़्लोट्स

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

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

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

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

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

वेब के समाधान से एकत्रित समाधान "जावास्क्रिप्ट में, "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/