2017-10-06 14 views
44

मेरे पास अभी एक मामूली सवाल है।अपरिभाषित == अपरिभाषित सत्य है। लेकिन अपरिभाषित> = अपरिभाषित झूठा है?

undefined == undefinedtrue पर वापस लौटें, लेकिन undefined >= undefinedfalse है?

undefinedundefined के बराबर है।

लेकिन यह बराबर या उससे अधिक नहीं है?

+11

मेरा अनुमान है कि 'अपरिभाषित' दोनों को 'NaN' के लिए मजबूर किया गया है जो स्वयं के बराबर नहीं है। – Xufox

+1

'अपरिभाषित === अपरिभाषित || अपरिभाषित> अपरिभाषित 'और' अपरिभाषित> = अपरिभाषित ', या "से अधिक या बराबर" में या इस तरह के समान नहीं है या '||' –

+0

@ दीपककमत'> = 'के दृश्यों के पीछे क्या होता है? मुझे लगता है कि यह सवाल – theonlygusti

उत्तर

2

असमानता ऑपरेटरों (<, >, और इसी तरह) उन मानों की तुलना करने के लिए उपयोग नहीं किया जा सकता है जिन्हें पूर्ण रूप से संख्याओं में परिवर्तित नहीं किया जा सकता है। इसमें undefined शामिल है। जो कुछ आप देख रहे हैं उसके पीछे कारण यह है कि, यदि आप इस तरह कुछ ऐसा करने का प्रयास करते हैं, तो अन्य भाषाओं के विपरीत जो त्रुटि को फेंक देते हैं (यानी TypeError पायथन में), जेएस आपको ऐसा करने देता है। हालांकि, परिणाम हमेशा झूठा होगा।

+0

यह स्पष्ट नहीं करता है कि क्यों "foo"> = "bar" 'सत्य है और इसमें कोई स्पष्टीकरण शामिल नहीं है कि ऑपरेटरों ने अपने ऑपरेटरों को मिलान करने वाले प्रकार के लिए कैसे सहभागिता की है। – Xufox

+1

@Xufox क्योंकि जावास्क्रिप्ट एक शापित ढीली टाइप की गई भाषा है। यह तारों को परिवर्तित कर सकता है जिसमें स्ट्रिंग्स में संख्याएं होती हैं और इसकी तुलना होती है और यह भी "===" ऑपरेटर को सरल रूप से परिवर्तित करने वाले स्ट्रिंग्स को पूर्णांक और फ़्लोट्स के बजाय सख्त तुलना करने के लिए करता है। –

+8

असल में, असमानताओं का उपयोग करते समय, तारों की तुलना [lexicographically] (https://stackoverflow.com/a/7087831/7662085) की तुलना की जाती है। – stybl

46

>= operator अनिवार्य रूप से < operator की अस्वीकृति है। और दोनों Abstract Relational Comparison Algorithm का आह्वान करते हैं जो चरण 0 (ए से सी) में परिभाषित undefined >= undefined के लिए अपरिभाषित लौटाता है। असल में, आप यह भी देख सकते हैं कि अधिक से अधिक (-ऑर-बराबर) और कम से कम (-ऑर-बराबर) ऑपरेटरों का मतलब केवल संख्या या तार के साथ काम करना है।

फिर >= ऑपरेटर के विनिर्देश के 6. चरण में, आप देख सकते हैं कि ऐसा क्यों देता है झूठी:

तो rसच या अपरिभाषित है, झूठी लौट आते हैं। अन्यथा, सच वापस करें।

8

undefined === undefined || undefined > undefined और undefined >= undefined, या "इससे अधिक या बराबर है" में इस या || के रूप में ही नहीं है।

जहां तक ​​यह चिंतित है, तुलनात्मक ऑपरेटरों जैसे >, <, >= आदि संख्याओं के लिए हैं और undefined संख्याएं नहीं हैं, undefined अपरिभाषित है।

10 >= "Hello World" पर वापसी मूल्य के रूप में आप क्या अपेक्षा करेंगे? बेशक एक झूठा, लेकिन फिर 10 >= "10"true देता है क्योंकि 10 == "10" सत्य है और 10 === "10" गलत है। "10" को एक संख्या में परिवर्तित किया जा सकता है, इसलिए हम उस परिणाम को देखते हैं जो वास्तविक संख्या के मामले में वापस किया गया होगा और संख्याओं के साथ स्ट्रिंग नहीं।

वहाँ के रूप में करने का विरोध किया !=>= के लिए कोई सख्त समानता ऑपरेटर संस्करण है जो है !==

कुछ वास्तव में अजीब और भ्रामक बातें होती हैं जब आप null, undefined, NaN की तुलना की कोशिश है - यह कुछ ऐसा है जावास्क्रिप्ट के विनिर्देश सकता है उत्तर देने में सक्षम होने के बाद से और जावास्क्रिप्ट एक बहुत ही कमजोर टाइप की गई भाषा है और प्रकार बहुत लचीला हैं, इसलिए कोई 10 और "10" की तुलना कर सकता है और फिर भी वे परिणाम प्राप्त कर सकते हैं जिन्हें आप केवल तब प्राप्त कर सकते हैं जब आपने अन्य भाषाओं में दो पूर्णांक की तुलना की थी।

प्रश्न और चर्चा प्रत्यक्ष डाउन वोट से अधिक स्वागत है। धन्यवाद।

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