2013-07-21 12 views
26

क्यों Node.js में {} == {}false के बराबर है सही है, लेकिन {} + {} == {} + {}true के बराबर है?क्यों {} {} == गलत है, लेकिन {} + {} == {} + {}

> {} == {} 
false 
> {} + {} == {} + {} 
true 
+17

संबंधित:। [WAT?] (Http://destroyallsoftware.com/talks/wat) –

+2

क्रोम में यह बात गलत है, बस दिलचस्पी की वजह से। –

+1

@RichBradshaw क्रोम के साथ परीक्षण नहीं किया, केवल नोड के साथ। – 0xAX

उत्तर

53

+ यहाँ स्ट्रिंग-संयोजन ऑपरेटर है। यह:

{} == {} 

का अर्थ है "अगर मैं {} साथ एक वस्तु, और {} के साथ एक और वस्तु बनाने, वे एक ही वस्तु है?"; और जवाब नहीं है"।

यह:

{} + {} == {} + {} 

का अर्थ है "? आदिम स्ट्रिंग "[object Object][object Object]" आदिम स्ट्रिंग "[object Object][object Object]" रूप में ही है"; और जवाब है हाँ"।


जोड़ने के लिए संपादित: टिप्पणीकर्ताओं का एक नंबर का कहना है कि Chrome की वेब कंसोल में, {} + {} सांख्यिक इसके अलावा, NaN + NaN करता है, ऐसी है कि {} + {} == {} + {} वास्तव में false रिटर्न (क्योंकि यह सच NaN == NaN कि नहीं है)। फ़ायरफ़ॉक्स का वेब कंसोल क्रोम के समान परिणाम देता है, लेकिन यदि आप इसे किसी पृष्ठ के अंदर चलाते हैं, तो यह नोड.जे.एस.

[Redacted: कैसे कल्पना तय है कि {} + {} होना चाहिए स्ट्रिंग संयोजन और {} + {} == {} + {} सच होना चाहिए की लंबी व्याख्या; धन्यवाद एक टिप्पणी करने के लिए jJ' से, मैं अब विसंगति का एक बेहतर स्पष्टीकरण की पेशकश कर सकते हैं: विवरण, जबकि सही, अब बहुत दिलचस्प नीचे दिए गए


संपादित जोड़ने के लिए है,]।।

वेब कंसोल के व्यवहार का कारण यह है कि वेब कंसोल को विशेष रूप से अभिव्यक्ति की आवश्यकता नहीं होती है; यह खुशी से कुछ if(true) { } स्वीकार करेगा। इसलिए, जब यह {} + {} देखता है, तो यह अभिव्यक्ति के रूप में इसकी व्याख्या नहीं करता है; प्रारंभिक {} को नग्न ब्लॉक के रूप में व्याख्या किया जाता है, तो + {} को अभिव्यक्ति के रूप में व्याख्या किया जाता है (एक नई वस्तु बनाना, इसे एक प्राचीन संख्या — अर्थात् NaN — और उस संख्या का मूल्यांकन करना) में परिवर्तित करना है। वेब कंसोल अंतिम अभिव्यक्ति का परिणाम प्रदर्शित करता है (उदाहरण के लिए, इनपुट 3; 4 आउटपुट 4 देगा), जो इस मामले में NaN है।

{} + {} == {} + {}, इसी तरह, के रूप में यानी, "खाली ब्लॉक, NaN == '[object Object][object Object]' के बाद", यानी "खाली ब्लॉक, false के बाद" व्याख्या की है "खाली ब्लॉक, (+{}) == ({} + {}) के बाद",।

यह कोष्ठक का उपयोग करके तय किया जा सकता है; ({} + {} == {} + {}), उदाहरण के लिए, true देता है।

(वैसे, यह व्यवहार वेब कंसोल के लिए बिल्कुल विशिष्ट नहीं है।eval, एक ही नियमों का पालन करती है कि इस तरह के eval('{} + {}')NaN और eval('({} + {})')'[object Object][object Object]' है)

+0

हां, मैंने देखा ["ऑब्जेक्ट ऑब्जेक्ट] [ऑब्जेक्ट ऑब्जेक्ट]" परिणाम {} + {} से, मैं node.js में नया हूं और ध्यान नहीं दिया यह सिर्फ एक स्ट्रिंग है, मैंने सोचा कि यह नोड का आंतरिक डेटा प्रकार है :), अब मैं देखता हूं कि 'typeof ({} + {}) '' string' है। महान उत्तर और स्पष्टीकरण के लिए धन्यवाद – 0xAX

+0

@ruakh: महान स्पष्टीकरण! क्रोम और फ़ायरफ़ॉक्स में '{} + {} == {} + {}' '' '' '' '' '' {'} {{}' '' ''~~~~~~~~~~~~~~~~} –

+2

@ go-oleg क्योंकि एफएफ '{} + {}' 'NaN' में है। और 'NaN == NaN' झूठा है, क्योंकि ** NaN अपने आप के बराबर कभी नहीं है **। यह स्पष्टीकरण देखें: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/NaN?redirectlocale=en-US&redirectslug=JavaScript%2FReference%2FGlobal_Objects%2FNaN – BlackSheep

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