संख्या और एक सरणी के बीच तुलना एक प्रकार रूपांतरण को ट्रिगर करेगा। एक्मास्क्रिप्ट विनिर्देश section 7.1.3 में इसके लिए नियम निर्धारित करता है। इन नियमों के अनुसार, संख्या एक और डेटा प्रकार में परिवर्तित नहीं किया जाता है, लेकिन वस्तु (एक सरणी एक वस्तु है) एक रूपांतरण है कि इस तरह से चला जाता है के अधीन किया जाएगा:
- चलो primValue ToPrimitive हो (तर्क, संकेत संख्या)।
- वापसी करने के लिए संख्या (primValue)।
ToPrimitive
समारोह section 7.1.1 में वर्णित है:
- exoticToPrim चलो GetMethod हो (इनपुट, @@ toPrimitive)।
@@toPrimitive
एक प्रतीक है, तो आप Symbol.toPrimitive
के रूप में का उपयोग जो है। बात यह है कि Array
इस संपत्ति नहीं है, और इसलिए प्रक्रिया इस कदम के साथ जारी है:
- वापसी OrdinaryToPrimitive (इनपुट, संकेत)।
सार आपरेशन OrdinaryToPrimitive तर्क हे और संकेत के साथ कहा जाता है जब, निम्नलिखित कदम उठाए जाते हैं:
- तो संकेत कि "स्ट्रिंग", तो
ए। विधि नाम हो सकता है «" toString ", मूल्य" »।
- अन्य,
ए। विधि नाम हो सकता है «" वैल्यू "," टूस्ट्रिंग "»।
रूप संकेत कि "संख्या", हम दूसरे मामले में कर रहे हैं। अगले चरण बताते हैं कि इन तरीकों को क्रम में लागू किया गया है।
अब, Array.prototype.valueOf
सिर्फ सरणी स्वयं लौटाता है, इसलिए निम्न उप-चरण वापस नहीं आएगा, क्योंकि टाइप ऑब्जेक्ट (अर्थात् ऐरे) है।
5.c.iii हैं प्रकार (परिणाम) वस्तु नहीं है, परिणाम लौट आते हैं।
परिणामस्वरूप फॉलबैक में प्रवेश होता है, और toString
को ऐरे पर बुलाया जाता है।
तो सरणी स्ट्रिंग में परिवर्तित हो जाती है। यह शीर्ष पर सूचीबद्ध दो चरणों के पहले का परिणाम है:
- primValue हो ToPrimitive चलो (तर्क, संकेत संख्या)।
- वापसी करने के लिए संख्या (primValue)।
दूसरे चरण के लिए आसान है: स्ट्रिंग तो संख्या है, जो section 7.1.3.1 में वर्णन किया गया में बदल जाती है।
Array.prototype.toString
विधि के रूप में एक अल्पविराम से अलग सूची बनाता है, जैसे ही एक सरणी में एक से अधिक तत्व होते हैं, ये स्ट्रिंग निश्चित रूप से अमान्य संख्या बन जाती हैं। जैसा कि चश्मे में उल्लिखित है, तो वापसी मूल्य NaN
है।
NaN
के साथ तुलना false
देता है, जो आपको प्राप्त होने वाले आउटपुट को बताता है।
क्या आपके पास कोई संदर्भ है कि इस मामले में जावास्क्रिप्ट पहले स्ट्रिंग में रूपांतरण करता है, और फिर संख्या में? – trincot
Obligatory [jsF ** * स्पष्टीकरण] (http://thedailywtf.com/articles/bidding-on-security) – ryanyuyu
@trincot, ईसीएमए 262 वी 6 [7.2.11 सार संबंधपरक तुलना] (https://www.ecma-international.org /ecma-262/6.0/#sec-abstract-relational-comparison), यह पहले एक आदिम मान प्राप्त करने का प्रयास करता है, जो टूस्ट्रिंग द्वारा पहुंचा जा सकता है। –