javascript - ('B'+'a'++ 'a'+'a') का परिणाम क्यों है। toLowerCase() 'केला'?




type-conversion (6)

का उपयोग करना + किसी भी मान को जावास्क्रिप्ट में संख्या में बदल देगा!

इसलिए...

जावास्क्रिप्ट में किसी भी मूल्य से पहले + का उपयोग करने और जानने से मुख्य बात यह है कि उस मूल्य को एक संख्या में बदल देगा , लेकिन अगर उस मूल्य को परिवर्तित नहीं किया जा सकता है, तो जावास्क्रिप्ट इंजन NaN लौटाएगा, जिसका अर्थ है, संख्या नहीं (और कर सकते हैं) एक नंबर में परिवर्तित नहीं किया जा सकता, दोस्त!) और शेष कहानी नीचे के रूप में:

जब मेरा कोई मित्र इस जावास्क्रिप्ट कोड में आया, तो मैं कुछ जावास्क्रिप्ट का अभ्यास कर रहा था:

document.write(('b' + 'a' + + 'a' + 'a').toLowerCase());

उपरोक्त कोड "banana" जवाब देता है! क्या कोई समझा सकता है क्यों?


कोड की यह रेखा एक अभिव्यक्ति का मूल्यांकन करती है और फिर लौटे मूल्य के आधार पर एक विधि कहती है।

अभिव्यक्ति ('b' + 'a' + + 'a' + 'a') पूरी तरह से स्ट्रिंग शाब्दिक और अतिरिक्त ऑपरेटरों से बना है।

एक निहित कार्रवाई एक स्ट्रिंग पर ToNumber के लिए कॉल है

  • ToNumber स्ट्रिंग प्रकार पर लागू होता है "ToNumber स्ट्रिंग्स पर लागू होता है, इनपुट स्ट्रिंग में व्याकरण लागू होता है। यदि व्याकरण StringNumericLiteral के विस्तार के रूप में स्ट्रिंग की व्याख्या नहीं कर सकता है, तो ToNumber का परिणाम NaN है।"

व्याख्याकार के पास अभिव्यक्ति को पार्स करने का नियम है, इसे बाएं और दाएं हाथ के भावों के अपने घटकों में तोड़कर।

चरण 1: 'b' + 'a'

वाम अभिव्यक्ति: 'b'
बायां मान: 'b'

ऑपरेटर: + (अभिव्यक्ति पक्षों में से एक स्ट्रिंग है, इसलिए स्ट्रिंग संयोजन)

सही अभिव्यक्ति: 'a' राइट वैल्यू: 'ए'

परिणाम: 'ba'

चरण 2: 'ba' + + 'a'

वाम अभिव्यक्ति: 'ba'
बायाँ मूल्य: 'बा'

ऑपरेटर: + (अभिव्यक्ति पक्षों में से एक स्ट्रिंग है, इसलिए स्ट्रिंग संयोजन)

सही अभिव्यक्ति: + 'a' (यह चरित्र के गणित मान का मूल्यांकन करता है 'ए' यह मानते हुए कि यह + चिह्न से एक सकारात्मक संख्या है - शून्य चिह्न ने भी एक नकारात्मक संख्या का संकेत देते हुए यहां काम किया होगा - जिसके परिणामस्वरूप NaN होता है )
सही मान: NaN (क्योंकि संचालक स्ट्रिंग का संघटन है, संघनन के दौरान इस मूल्य पर इसे स्ट्रिंग कहा जाता है)

परिणाम: 'baNaN'

चरण 3: 'baNaN' + 'a'

वाम अभिव्यक्ति: 'baNaN'
बायाँ मूल्य: 'baNaN'

ऑपरेटर: + (अभिव्यक्ति पक्षों में से एक स्ट्रिंग है, इसलिए स्ट्रिंग संयोजन)

सही अभिव्यक्ति: 'a'
सही मूल्य: 'ए'

परिणाम: 'baNaNa'

इसके बाद समूहन अभिव्यक्ति का मूल्यांकन किया गया है, और toLowerCase को कहा जाता है जो हमें केले के साथ छोड़ देता है।


यहां देखें जादू दूसरा प्लस एक गैर-संचालक है जो 'NaN' देता है

console.log(('b' + 'a' + + 'a' + 'a').toLowerCase());
console.log(('b' + 'a' + + 'a' + 'a'));
console.log(('b' + 'a' + 'a' + 'a').toLowerCase());


W3Schools या NaN पर NaN के बारे में और पढ़ें


('b' + 'a' + + 'a' + 'a').toLowerCase()

स्पष्टता के लिए, इसे दो चरणों में विभाजित करते हैं। सबसे पहले, हम कोष्ठक अभिव्यक्ति का मान प्राप्त करते हैं और फिर हम परिणाम पर toLowerCase() फ़ंक्शन लागू करते हैं।

पहला कदम

'b' + 'a' + + 'a' + 'a'

LR जा रहे हैं, हमारे पास:

  • 'b' + 'a' रिटर्न देता है, यह नियमित रूप से सहमति है।
  • ba + + 'a' + 'a' साथ बा को समेटने का प्रयास करता है। हालाँकि, जब से अपर ऑपरेटर + अपने ऑपरेंड को एक संख्या में बदलने का प्रयास करता है, तो मान NaN वापस आ जाता है, जिसे तब मूल स्ट्रिंग के साथ समाप्‍त होने पर एक स्ट्रिंग में परिवर्तित कर दिया जाता है - जिसके परिणामस्वरूप baNaN होता है
  • baNaN + 'a' baNaNa देता है। फिर, यह नियमित रूप से सहमति है।

इस स्तर पर, चरण एक से परिणाम baNaNa है

दूसरा चरण

लागू .toLowerCase() चरण एक से दिए गए मान पर देता है:

केला

जावास्क्रिप्ट में कई समान वाक्य हैं जिन्हें आप देख सकते हैं।


'b' + 'a' + + 'a' + 'a'

... के रूप में मूल्यांकन किया जाता है ...।

('b') + ('a') + (+'a') + ('a')

(देखें: ऑपरेटर पूर्वता )

+'a' को unary plus ऑपरेटर का उपयोग करके 'a' को नंबर में बदलने का प्रयास करता है। क्योंकि 'a' एक संख्या नहीं है, परिणाम NaN ( "Not-A-Number" ) है:

'b'  +  'a'  +  NaN  + 'a'

यद्यपि NaN अर्थ "Not a Number" है, फिर भी यह एक संख्यात्मक प्रकार है ; जब तार में जोड़ा जाता है, तो यह किसी भी अन्य संख्या के समान होगा:

'b'  +  'a'  +  NaN  + 'a'  =>  'baNaNa'

अंत में, इसे नीचे दिया गया है:

'baNaNa'.toLowerCase()      =>  'banana'




type-conversion