2015-05-21 16 views
5

कम से कम JavaScript में निम्न सत्य हैं:0 == [] क्यों है, लेकिन 0 == झूठी और! [] == झूठी?

0 == []  // true 
0 == false // true 
![] == false // true 

कि क्यों है? मुझे पता है कि == का मतलब बराबर है लेकिन प्रकार के बराबर नहीं है, लेकिन false == true कैसे है, तो उस मामले में बोलने के लिए?

+0

'[]' एक स्ट्रिंग के रूप में है, और एक संख्या के रूप में गलत है 0 – dandavis

+7

आपको '[] == सत्य' कहां मिल रहा है, क्योंकि यह 'false' –

+0

@ मैट बुरलैंड होना चाहिए, कंसोल में टाइप करें "console.log (! [])", यह कंसोल पर "झूठा" –

उत्तर

1

जावास्क्रिप्ट में, दो प्रकार की समानता होती है। मूल्य की समानता है जिसे == और मूल्य और प्रकार की समानता का प्रतिनिधित्व किया जाता है, जिसे === द्वारा दर्शाया जाता है। उत्तरार्द्ध सख्त समानता ऑपरेटर है।

आपके मामले में, हम केवल मूल्य के आधार पर समानता की जांच कर रहे हैं, प्रकार नहीं।

[] एक खाली वस्तु का प्रतिनिधित्व करता है, जिसका अर्थ [] और 0 समान मूल्य है।

जावास्क्रिप्ट में, किसी भी करने के लिए 1 true है और 0 के मूल्य false

आशा इस मदद करता है

+1

मैं सब कुछ समझता हूं "[] भी झूठा है और झूठी हमेशा सच नहीं होती है"? –

+0

यह बूलियन तर्क का हिस्सा है। 'झूठी नहीं' के बराबर 'सत्य' –

+0

झूठ नहीं है 'झूठी', जो 'झूठी' के विपरीत है। 'झूठी' के विपरीत 'सत्य' है। इसलिए, '! झूठी === सच'। –

3

जावास्क्रिप्ट जब गैर सख्त का उपयोग कर बूलियन मूल्यों को वस्तुओं coerces है बराबर या उससे अधिक संख्या के मूल्य समानता ऑपरेटर।

0 == [] 

क्योंकि जावास्क्रिप्ट मूल्यों (जो दोनों के हैं एक ही प्रकार के नहीं) बूलियन मूल्यों के दोनों coerces उनकी तुलना करने के। दूसरे शब्दों में, false == false

यदि आप === का उपयोग करते हैं, तो दूसरी ओर, आप ऑब्जेक्ट समानता की जांच कर रहे हैं।

एक दिलचस्प उपयोग के मामले इस होगा:

[] === []; // => false 

इसका कारण यह है === वस्तुओं की स्मृति स्थान जाँच कर रहा है। दो सरणी एक ही स्मृति स्थान साझा नहीं करते हैं। हालांकि:

var arr = []; 

arr === arr; // ==> true 

लेकिन, यहाँ एक और दिलचस्प मोड़ है:

1 === 1; // ==> true 

सरणियों और सादे वस्तुओं के मामले में, JavaScript स्मृति स्थान संदर्भ देता है। लेकिन तारों और संख्याओं जैसे मूल्यों के साथ, जावास्क्रिप्ट जांचता है कि मान === ऑपरेटर के बराबर बराबर हैं या नहीं।

तो बड़ा अंतर == और === में मतभेद के नीचे आता है, और कैसे जावास्क्रिप्ट प्रकार coerces।

सुझाव: यही कारण है कि यह आम तौर पर अनुशंसित है कि आप जब क्रॉस-ब्राउज़र मुद्दों के साथ काम कर रहे उदाहरण के लिए सख्त === ऑपरेटर का उपयोग करता है, तो आप फिर भी, कभी कभी बलात्कार अपने लाभ के लिए काम कर सकते हैं बलात्कार (को रोकने के लिए की जरूरत है, वह जगह है जहाँ एक मूल्य एक ब्राउज़र में undefined हो सकता है लेकिन अन्य ब्राउज़र में null हो सकता है। फिर आप !!thatStrangeValue जैसे कुछ कह सकते हैं, और undefined और null दोनों को एक ही चीज़ पर ले जाया जाएगा)।

संपादित

ओपी लाया एक अच्छा बिंदु:

[] == false; 
![] == false; 

ऊपर बयान दोनों सही जो अजीब है कर रहे हैं। मैं कहूंगा कि पहला कथन खालीपन की जांच कर रहा है, जबकि दूसरा अस्तित्व की जांच कर रहा है। किसी को भी इस आखिरी बिंदु का जवाब पता है?

+1

उत्कृष्ट और अच्छी तरह से विचार पोस्ट। यह याद रखना महत्वपूर्ण है कि समानता और सख्त समानता के बीच एक अंतर है। यह कभी-कभी –

+0

नए लोगों के लिए चुनौतीपूर्ण हो सकता है, जवाब और अंतर्दृष्टि के लिए धन्यवाद, लेकिन यह एक बिंदु याद करता है, क्यों है! [] == झूठी, जब 0 == []? –

+0

@FrederikWitte, धन्यवाद। हाँ आप एक अच्छा मुद्दा बनाते हैं। मैंने लांग-अप कहां से एक विशिष्ट उदाहरण देने के लिए अपना जवाब संपादित किया। मुझे बिल्कुल यकीन नहीं है कि आखिरी बिंदु का जवाब क्या है। –

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