2012-12-13 17 views
5

निम्नलिखित तुलना सभी वापसी false जावास्क्रिप्ट में:क्यों [] === [] (और अन्य) जावास्क्रिप्ट में झूठी वापसी करते हैं?

[]===[] 
[]==[] 
{}==={} 
{}=={} 
[0]===[0] 
[0]==[0] 

हालांकि निम्नलिखित वापसी true:

[0]=='0' 
[0]==0 
[]==false //(and all other == that were exampled above) 

इस का कारण क्या है? विशेष रूप से अंतर [0]!=[0] और [0]==0 के बीच

फिडल: http://jsfiddle.net/vnBVj/

उत्तर

9

यह भ्रमित नियमों के कारण है, जावास्क्रिप्ट कैसे दबाव टाइप करता है। आप इस बारे में EcmaScript 5 spec के §11.9.3 में पढ़ सकते हैं।

दो ऑब्जेक्ट (जो सरणी भी कर रहे हैं) समान कभी नहीं कर रहे हैं, इस प्रकार पहले खंड उपज झूठी (§11.9.3.1.c.vi) में सभी अपने तुलना

दूसरे खंड और अधिक कठिन है:

पता करने वाली पहली बात यह है कि == ऑपरेंड की तुलना करने के लिए टाइप जबरन का उपयोग करता है।

जब तुलना में एक बूलियन शामिल होता है, तो यह पहले नंबर पर ले जाता है।

[]==false 
[]==0 

के बाद कि वस्तुओं Object.prototype.toString

"" == 0 

फिर स्ट्रिंग एक नंबर करने के लिए coereced है फोन करके उनके आदिम मूल्यों के लिए मजबूर कर रहे हैं (""0 हो जाता है)

0 == 0 

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

ध्यान दें कि === कभी भी प्रकार का दबाव नहीं पैदा करता है, लेकिन पहले सही प्रकार के लिए जांच करता है और यदि वे बराबर नहीं होते हैं तो झूठी पैदा होती है! केवल अगर प्रकार बराबर हैं, तो यह वास्तविक मानों की तुलना करता है। तो तुलना की यह विधि == से कहीं अधिक विश्वसनीय है।

+0

सबसे अच्छी तरह से समझाया गया उत्तर, धन्यवाद – rickyduck

4

सभी उदाहरण false में परिणाम की आसानी से, इस तथ्य से समझाया जा सकता है कि इस मामले में आप वस्तुओं की तुलना कर रहे हैं (और सरणियों विशेष वस्तुओं रहे हैं), जावास्क्रिप्ट होगा ऑब्जेक्ट संदर्भ की तुलना करें। चूंकि आप उन सभी तुलनाओं के साथ नई वस्तुएं बना रहे हैं, सभी अलग-अलग वस्तुओं को इंगित करेंगे, इसलिए परिणाम false होगा।

[0]=='0' के लिए: जैसे ही एक ऑपरेंड एक स्ट्रिंग है, दूसरा भी स्ट्रिंग में परिवर्तित हो जाता है। [0] का स्ट्रिंग रूपांतरण '0' है, इस प्रकार परिणाम सत्य है।

वही एक ऑपरेंड के लिए एक संख्या या एक बूलियन होता है, जो पिछले दो तुलना परिणामों के बारे में बताता है।

अधिक जानकारी के लिए respective MDN page पर एक नज़र डालें।

महत्वपूर्ण हिस्सा हवाला देते हुए:

समान (==)

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

3

जब आप लिटरल सरणी/ऑब्जेक्ट प्रारंभिकरण का उपयोग करते हैं, भले ही यह खाली हो, फिर भी आप एक नई वस्तु बनाते हैं और इसका संदर्भ वापस आ जाता है। तो जब आप उनकी तुलना करते हैं, तो आप अपनी बनाई गई वस्तुओं के संदर्भ के मूल्य की तुलना करते हैं।

आपके अन्य उदाहरण सत्य लौटते हैं क्योंकि आप विभिन्न प्रकार के चर की तुलना कर रहे हैं, इसलिए ऑब्जेक्ट/सरणी उनके साथ तुलनीय होने के लिए transtyped हैं।

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