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


575

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

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

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


22
वह दूसरा प्लस एक अपर ऑपरेटर है: +"a"है NaN
गेरार्डो फर्टाडो

8
एक कंसोल में, +'a'अपने आप से लिखें और देखें कि क्या होता है।
कुछ प्रोग्रामर ने

23
और अधिक के लिए उत्सुक लोगों के लिए। पूरी मजेदार सूची
Giddy Naya

4
मजबूती से संबंधित: stackoverflow.com/q/9032856
Kyll

जवाबों:


566

+'a'NaN("संख्या नहीं") को हल करता है, क्योंकि यह एक स्ट्रिंग को एक संख्या के साथ जोड़ता है, जबकि चरित्र aको एक संख्या के रूप में पार्स नहीं किया जा सकता है।

document.write(+'a');
कम करने के लिए यह हो जाता है banana

जोड़ने NaNके लिए "ba"बदल जाता है NaNस्ट्रिंग में "NaN"जैसे रूपांतरण की वजह से, देता है baNaN। और फिर एक aपीछे है, दे रहा है baNaNa

इसके बीच + +का स्थान पहला एक स्ट्रिंग कॉन्फैक्शन और दूसरा एक यूनीरी प्लस (यानी "पॉजिटिव") ऑपरेटर बनाना है। यदि आप उपयोग करते हैं 'ba'+(+'a')+'a', तो इसका परिणाम आपके पास समान है 'ba'+NaN+'a', जो 'ba'+'NaN'+'a'टाइप जुगाड़ के कारण समान है ।

document.write('ba'+(+'a')+'a');


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

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

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

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

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

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

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

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

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

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

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

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

पहला कदम

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

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

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

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

दूसरा चरण

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

केला

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


24

यह सिर्फ + ऑपरेटर के कारण है।

हम इसके बारे में और जानकारी प्राप्त कर सकते हैं।

=> ( ('b') + ('a') + (++) + ('a') + ('a'))
=> ( ('b') + ('a') + (+) + ('a') + ('a')) // Here + + convert it to +operator 
Which later on try to convert next character to the number.

उदाहरण के लिए

const string =  '10';

आप एक स्ट्रिंग को 2 तरीकों से संख्या में बदल सकते हैं:

  1. संख्या (स्ट्रिंग);
  2. + स्ट्रिंग;

इसलिए मूल क्वेरी पर वापस जाएं; यहां यह अगले चार ('ए') को संख्या में बदलने की कोशिश करता है लेकिन अचानक हमें त्रुटि मिल गई,

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

लेकिन यह एक स्ट्रिंग के रूप में व्यवहार करता है क्योंकि पिछला चरित्र स्ट्रिंग में था। तो यह होगा

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

और अंत में यह इसे toLowerCase () में परिवर्तित करता है, इसलिए यह केला होगा

यदि आप इसके बगल में नंबर डालते हैं, तो आपका परिणाम बदल जाएगा।

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

यह 'बा 1 ए' होगा

const example1 = ('b' + 'a' + + 'a' + 'a').toLowerCase(); // 'banana' 
const example2 = ('b' + 'a' + + '1' + 'a').toLowerCase(); // 'ba1a'
console.log(example1);
console.log(example2);


9

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

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

  • स्ट्रिंग लिटरल्स "एक स्ट्रिंग शाब्दिक शून्य या अधिक वर्ण एकल या दोहरे उद्धरणों में संलग्न है।"
  • परिवर्धन ऑपरेटर (+) "अतिरिक्त संचालक या तो स्ट्रिंग संयोजन या संख्यात्मक जोड़ करता है।"

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

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

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


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

वाम अभिव्यक्ति: 'b'
वाम मूल्य: 'बी'

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

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

परिणाम: 'ba'


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

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

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

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

परिणाम: 'baNaN'


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

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

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

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

परिणाम: 'baNaNa'


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


7

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

इसलिए...

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

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



0

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

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.