क्यों Node.js में {} == {}
false
के बराबर है सही है, लेकिन {} + {} == {} + {}
true
के बराबर है?क्यों {} {} == गलत है, लेकिन {} + {} == {} + {}
> {} == {}
false
> {} + {} == {} + {}
true
क्यों Node.js में {} == {}
false
के बराबर है सही है, लेकिन {} + {} == {} + {}
true
के बराबर है?क्यों {} {} == गलत है, लेकिन {} + {} == {} + {}
> {} == {}
false
> {} + {} == {} + {}
true
+
यहाँ स्ट्रिंग-संयोजन ऑपरेटर है। यह:
{} == {}
का अर्थ है "अगर मैं {}
साथ एक वस्तु, और {}
के साथ एक और वस्तु बनाने, वे एक ही वस्तु है?"; और जवाब नहीं है"।
यह:
{} + {} == {} + {}
का अर्थ है "? आदिम स्ट्रिंग "[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]'
है)
हां, मैंने देखा ["ऑब्जेक्ट ऑब्जेक्ट] [ऑब्जेक्ट ऑब्जेक्ट]" परिणाम {} + {} से, मैं node.js में नया हूं और ध्यान नहीं दिया यह सिर्फ एक स्ट्रिंग है, मैंने सोचा कि यह नोड का आंतरिक डेटा प्रकार है :), अब मैं देखता हूं कि 'typeof ({} + {}) '' string' है। महान उत्तर और स्पष्टीकरण के लिए धन्यवाद – 0xAX
@ruakh: महान स्पष्टीकरण! क्रोम और फ़ायरफ़ॉक्स में '{} + {} == {} + {}' '' '' '' '' '' {'} {{}' '' ''~~~~~~~~~~~~~~~~} –
@ 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
संबंधित:। [WAT?] (Http://destroyallsoftware.com/talks/wat) –
क्रोम में यह बात गलत है, बस दिलचस्पी की वजह से। –
@RichBradshaw क्रोम के साथ परीक्षण नहीं किया, केवल नोड के साथ। – 0xAX