जावास्क्रिप्ट में "सच" == सच क्यों गलत है?


89

एमडीसी ==ऑपरेटर का वर्णन इस प्रकार है :

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

इसे ध्यान में रखते हुए, मैं "true" == trueइस प्रकार मूल्यांकन करूंगा :

  1. क्या वे एक ही प्रकार के हैं? नहीं
  2. या तो ऑपरेंड एक नंबर है या बूलियन? हाँ
  3. क्या हम दोनों को एक संख्या में बदल सकते हैं? नहीं ( isNaN(Number("true")) // true)
  4. या तो ऑपरेंड एक स्ट्रिंग है? हाँ
  5. क्या हम दूसरे ऑपरेंड को स्ट्रिंग में बदल सकते हैं? हाँ ( String(true) === "true" // true)

मैंने स्ट्रिंग्स के साथ समाप्त किया है "true"और "true", जिसका मूल्यांकन करना चाहिए true, लेकिन जावास्क्रिप्ट गलत दिखाता है।

मुझे क्या याद किया?


प्रासंगिक: es5.github.com/#x11.9.1
zzzzBov

6
चारों ओर इतना जावास्क्रिप्ट के साथ, दुनिया एक डरावनी जगह है: if("true" == true) {console.log("yes")} else {console.log("no")}; if("true") {console.log("yes")} else {console.log("no")}---> "नहीं हां"
user1068352

1
मुझे कहना होगा, मैं हैरान हूँ, और यह बहुत बेवकूफ है कि ऐसा होता है। फिर भी हमेशा हमेशा हमेशा इस्तेमाल करने का एक और कारण ===
बीटी

@ user1068352 अराजकता की जाँच करें :) dorey.github.io/JavaScript-Equality-Table
João Pimentel Ferreira

जवाबों:


89

क्योंकि "true"में परिवर्तित हो जाता है NaN, जबकि trueमें परिवर्तित हो जाता है 1। इसलिए वे अलग हैं।

जैसा आपने बताया, दोनों संख्याओं में परिवर्तित हो जाते हैं, क्योंकि कम से कम true(एरिक रेपेन की टिप्पणी देखें), और फिर तुलना की जा सकती है।


क्या आप बता सकते हैं कि यह कदम Can we convert both to a number?कभी गलत होगा या नहीं? यदि NaNएक संख्या भी है, तो यह कदम कभी कैसे विफल हो सकता है?
इसहाक

5
या तो बनाम। यदि दोनों का परिणाम NaN होता है तो वे स्ट्रिंग मूल्यांकन पर स्विच करेंगे। यदि केवल एक ही परिवर्तित किया जा सकता है, तो अभी भी एक संख्या की तुलना है।
एरिक रिपन

2
जावास्क्रिप्ट में वास्तव में कुछ विषम वस्तुएं हैं जो काफी अजीब तरह से व्यवहार करती हैं। उदाहरण के लिए, IE <9 में XML दस्तावेज एक त्रुटि उठाते हैं जब आप उन्हें संख्याओं में बदलने की कोशिश करते हैं।
मैक्सर्ट

आप स्वयं कर रूपांतरणों को देख सकते हैं Number(true)औरNumber('true')
एरिक रेपेन

10

==तुलना ऑपरेटर है ECMA 5 में परिभाषित के रूप में:

  1. यदि टाइप (x) संख्या है और प्रकार (y) स्ट्रिंग है,
    तो तुलना x == ToNumber (y) के परिणाम को वापस करें ।
  2. यदि टाइप (x) स्ट्रिंग है और टाइप (y) नंबर है,
    तो तुलना करने का परिणाम लौटाएं ToNumber (x) == y।
  3. यदि टाइप (x) बूलियन है, तो तुलना का परिणाम लौटाएं ToNumber (x) == y।
  4. यदि टाइप (y) बूलियन है, तो तुलना x == ToNumber (y) का परिणाम लौटाएं

तो, "सत्य" == सच का मूल्यांकन इस प्रकार किया जाता है:

  1. "सच" == ToNumber (सच)   (नियम 7 के माध्यम से)
  2. "सच" == 1
  3. ToNumber ("सच") == 1   (नियम 5 के माध्यम से)
  4. NaN == 1

===> झूठा


3

सार समानता की तुलना एल्गोरिथम की रिकॉर्डिंग

http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.3

यदि ऑप्रेंड में से एक बूलियन है और अन्य नहीं है, तो बूलियन नंबर 0 या 1. के लिए कन्वर्टर true == "true"है।


क्या मैंने निम्नलिखित तरीके से सही अनुमान लगाया? "true" == सच "true" == 1 हो जाता है और फिर "true" == "1" हो जाता है, इसीलिए वे झूठे हो जाते हैं?
vuquanghoang
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.