2011-09-12 12 views
6

मैं सिर्फ Underscore.js की _.isEqual समारोह को देख रहा था और कोड का एक वर्ग कुछ इस तरह चला जाता है:क्या यह लाइन अंडरस्कोर.जेएस से समानता जांच कर रही है?

if (a === b) return true; 

if (typeof a !== typeof b) return false; 

if (a == b) return true; 

मैं बस वहाँ किसी भी मामले में जहां तीसरे बयान पहुंचा जा सकता है, तो सोच रहा हूँ और true का मूल्यांकन?

संपादित करें: बस स्पष्ट होना, यह मेरी अपनी कोड के बारे में मैं, मैं, अंडरस्कोर के स्रोत पढ़ रहा हूँ, विशेष रूप से this line बात कर रहा हूँ नहीं है और मैं क्यों वे वह कर रहे हैं के बारे में उत्सुक था।

+1

कुछ अजीब किनारे का मामला होना चाहिए जहां यह संभव है ... –

+0

@nickf: यह मानते हुए कि '==' और '===' समान हैं जब प्रकार समान हैं, मैं नहीं देख सकता कि पहला और तीसरा परीक्षण कभी भी एक अलग परिणाम प्रदान करेगा। यहां तक ​​कि 'शून्य' के मामले में जहां 'टाइपोफ़' आंतरिक 'टाइप' से भिन्न होता है, यह' अपरिभाषित 'को छोड़कर किसी भी मूल्य पर सहभागिता नहीं करता है, जिसमें एक अलग' टाइपफ़' मान होता है। और यदि वहाँ * कुछ किनारे का मामला है, तो आप कैसे जानते हैं कि आप इसे चाहते हैं? बस एक ही मूल्य के '==' और' === 'परीक्षण के लिए अजीब लगता है। या तो आप प्रकार जबरन करना चाहते हैं या आप नहीं करते हैं। – user113716

+0

... मुझे यह स्पष्ट करना चाहिए कि उपरोक्त टिप्पणी में * "आप" * द्वारा, मेरा मतलब * निक * *, बल्कि * एक व्यक्ति * को इंगित करने का मतलब नहीं था। – user113716

उत्तर

3

मैं अभी अंडरस्कोर रेपो के माध्यम से ब्राउज़ कर रहा हूं और एक छोटी सी चर्चा में आया जहां किसी ने the exact same thing पूछा, और ऐसा लगता है कि यह वास्तव में अनावश्यक है।

section 11.9.6 और section 11.9.3 में ईसीएमएस्क्रिप्ट भाषा विशिष्टता द्वारा परिभाषित एल्गोरिदम के बाद यह दिखाता है कि उपर्युक्त मामले में मूल्यों की कोई भी जोड़ी सही नहीं होनी चाहिए।

तो, संक्षेप में, नहीं, यह स्थिति संभव नहीं है

+0

+1 उस चर्चा पर अच्छा खोजें – user113716

1

केवल उसी परिस्थिति == और === अप्रत्याशित रूप से प्रतिक्रिया है जब एक का निर्माण किया स्ट्रिंग (new String("123")) है, जो पहले टेस्ट विफल हो जाएगा करने के लिए एक शाब्दिक स्ट्रिंग ("123") की तुलना है।

हालांकि, दूसरे परीक्षण पर यह पकड़ा जाता है क्योंकि निर्मित स्ट्रिंग के प्रकार object है, लेकिन शाब्दिक प्रकार string है।

उस पर आधारित, मैं नहीं कहूंगा, तीसरा कथन कभी नहीं पहुंचा जा सकता है, और सत्य का मूल्यांकन कर सकता है।

1

जब आप == ऑपरेटर का उपयोग करते हैं और अभिव्यक्ति विभिन्न प्रकार के होते हैं, तो जावास्क्रिप्ट आमतौर पर तुलना करने से पहले दोनों को एक ही प्रकार में परिवर्तित कर देगा।

उदाहरण के लिए, यह null और undefined के साथ हो सकता है। null == undefined सच है, भले ही null === undefined गलत है। हालांकि typeof null"object" है, जबकि typeof undefined"undefined" है। तो, इस मामले में आपको दूसरे कथन पर झूठी वापसी करनी चाहिए।

आप कल्पना (खंड 11.9.3) में सभी विवरण पढ़ सकते हैं, यह बहुत शामिल है: http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf

1

मेरे प्रारंभिक अनुमान यह एक टूटे हुए ब्राउज़र कार्यान्वयन को हल करने के लिए किया गया था कि था।

हालांकि उस फ़ाइल के लिए गिट लॉग में खोदने के बाद ऐसा लगता है कि इसी पंक्ति को पहले underscore.js चेकइन में था। (मैं पेरेंट डॉक्यूमेंट क्लाउड core.js रेपो में शिकार नहीं कर रहा हूं ...) आप इसे https://github.com/documentcloud/underscore/commit/02ede85b539a89a44a71ce098f09a9553a3a6890 के 334 लाइन पर देख सकते हैं।

तो अब मेरा अनुमान है कि यह सिर्फ क्रूर है जो छोड़ दिया गया है, कभी पूरी तरह से परीक्षण नहीं किया गया है और कभी भी साफ नहीं किया गया है।

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