यहां ध्यान देने योग्य बात यह है कि, चूंकि जावास्क्रिप्ट एक गतिशील भाषा है, प्रत्येक वस्तु, अनिवार्य रूप से, बस एक गौरवशाली हैश-मैप ( कुछ अपवादों के साथ ) है। और जावास्क्रिप्ट ऑब्जेक्ट में सब कुछ दो तरीकों से एक्सेस किया जा सकता है - ब्रैकेट नोटेशन और डॉट नोटेशन।
मैं जल्दी से आपके प्रश्न के पहले भाग का उत्तर देने वाली दो सूचनाओं पर जाऊंगा, और फिर मैं दूसरे भाग में पहुँचूँगा।
ब्रैकेट संकेतन
यह मोड अन्य प्रोग्रामिंग भाषाओं में हैशमैप और सरणियों तक पहुंचने के समान है। आप इस सिंटैक्स का उपयोग करके किसी भी घटक (डेटा (अन्य ऑब्जेक्ट्स सहित) या फ़ंक्शन) तक पहुंच सकते हैं ।
यह वही है जो आपके उदाहरण में आप कर रहे हैं। आपके पास 'a'
, जो एक स्ट्रिंग है (और वर्ण शाब्दिक नहीं है, जैसे कि यह C ++ जैसी भाषा में होगा)।
ब्रैकेट नोटेशन का उपयोग करते हुए, आप इसकी toUpperCase
विधि का उपयोग करते हैं। लेकिन इसे एक्सेस करना अभी भी पर्याप्त नहीं है; alert
उदाहरण के लिए, जावास्क्रिप्ट में टाइप करना , विधि को नहीं कहता है। यह सिर्फ एक साधारण बयान है। फ़ंक्शन को कॉल करने के लिए, आपको कोष्ठक जोड़ने की आवश्यकता है: alert()
एक साधारण डायलॉग बॉक्स युक्त दिखाता है undefined
, क्योंकि इसमें कोई पैरामीटर नहीं मिला है। अब हम आपके कोड को समझने के लिए इस ज्ञान का उपयोग कर सकते हैं, जो बन जाता है:
alert('a'.toUpperCase());
जो बहुत अधिक पठनीय है।
वास्तव में, इसे थोड़ा बेहतर समझने का एक अच्छा तरीका निम्नलिखित जावास्क्रिप्ट को निष्पादित करना है:
alert(alert)
यह alert
एक फ़ंक्शन ऑब्जेक्ट को पास करके कॉल करता है, साथ ही alert
, दूसरे अलर्ट को निष्पादित किए बिना भी। क्या दिखाया गया है (Chrome 26 में, कम से कम) निम्नलिखित है:
function alert() { [native code] }
कॉलिंग:
alert(alert())
लगातार दो संदेश बॉक्स दिखाता है undefined
। यह समझाना आसान है: आंतरिक alert()
पहले निष्पादित हो जाता है, दिखाता है undefined
(क्योंकि इसमें कोई पैरामीटर नहीं था) और कुछ भी नहीं देता है। बाहरी चेतावनी को आंतरिक चेतावनी का रिटर्न मान प्राप्त होता है - जो कुछ भी नहीं है, और undefined
संदेश बॉक्स में भी दिखाता है।
JsFiddle पर सभी मामलों की कोशिश करो!
डॉट नोटेशन
यह अधिक मानक दृष्टिकोण है, जो किसी ऑब्जेक्ट के सदस्यों को डॉट ( .
) ऑपरेटर का उपयोग करके एक्सेस करने की अनुमति देता है । यह वही है जो आपका कोड डॉट नोटेशन में दिखाई देगा:
alert('a'.toUpperCase())
बहुत अधिक पठनीय। तो हमें डॉट नोटेशन का उपयोग कब करना चाहिए, और हमें ब्रैकेट नोटेशन का उपयोग कब करना चाहिए?
तुलना
दो तरीकों के बीच मुख्य अंतर शब्दार्थ है। कुछ अन्य विवरण भी हैं, लेकिन मैं एक सेकंड में उन तक पहुँचूँगा। सबसे महत्वपूर्ण यह है कि आप वास्तव में क्या करना चाहते हैं - अंगूठे का एक नियम यह है कि आप अच्छी तरह से स्थापित फ़ील्ड और किसी ऑब्जेक्ट के तरीकों के लिए डॉट नोटेशन का उपयोग करते हैं , और जब आप वास्तव में एक हैश मैप के रूप में अपनी वस्तु का उपयोग कर रहे हैं, तो उसके लिए ब्रैकेट-नोटेशन। ।
यह नियम इतना महत्वपूर्ण क्यों है, इसका एक बड़ा उदाहरण आपके उदाहरण में दिखाया जा सकता है - चूँकि कोड कोष्ठक संकेतन का उपयोग उस स्थान पर किया जाता है जहाँ डॉट संकेतन बहुत अधिक समझदार होता, यह कोड को पढ़ने में कठिन बनाता है। और यह एक बुरी बात है, क्योंकि कोड को लिखे जाने की तुलना में कई गुना अधिक पढ़ा जाता है ।
कुछ मामलों में, आपको ब्रैकेट नोटेशन का उपयोग करना होगा, भले ही डॉट नोटेशन का उपयोग करना अधिक समझदार हो:
यदि किसी वस्तु के सदस्य के नाम में एक या अधिक रिक्त स्थान या कोई अन्य विशेष वर्ण हैं, तो आप डॉट नोटेशन का उपयोग नहीं कर सकते हैं: foo.some method()
यह काम नहीं करता है, लेकिन foo["some method"]()
करता है;
यदि आपको किसी ऑब्जेक्ट के सदस्यों को गतिशील रूप से एक्सेस करने की आवश्यकता है, तो आप ब्रैकेट नोटेशन का उपयोग करके भी अटक जाते हैं;
उदाहरण:
for(var i = 0; i < 10; ++i) {
foo["method" + i]();
}
लब्बोलुआब यह है कि आपको ऑब्जेक्ट को हैश मैप ( foods["burger"].eat()
) और डॉट सिंटैक्स के रूप में "वास्तविक" फ़ील्ड और विधियों ( enemy.kill()
) के साथ काम करते समय ब्रैकेट सिंटैक्स का उपयोग करना चाहिए । जावास्क्रिप्ट को एक गतिशील भाषा होने के साथ, "वास्तविक" फ़ील्ड्स और किसी ऑब्जेक्ट के तरीकों और "अन्य" डेटा के भीतर संग्रहीत लाइन के बीच की रेखा खाली हो सकती है। लेकिन जब तक आप उन्हें भ्रमित करने के तरीकों में मिश्रण नहीं करते हैं, तब तक आपको ठीक होना चाहिए।
अब, आपके शेष प्रश्न पर (अंत में !: P)।
मैं कैसे सुनिश्चित कर सकता हूं कि विधि हमेशा ओब्ज का सदस्य होगी
आप नहीं कर सकते। कोशिश करो। derp
एक स्ट्रिंग पर कॉल करने का प्रयास करें । आपको इसकी पंक्तियों में एक त्रुटि मिलेगी:
Uncaught TypeError: Object a has no method 'derp'
यह किसी भी वस्तु पर किसी भी तरीके को कॉल करने के लिए थोड़े सामान्य कार्य है। लेकिन इसका मतलब यह है कि निर्दिष्ट विधि पहले से ही निर्दिष्ट वस्तु का एक अंतर्निहित सदस्य होगी?
हां, आपके मामले में यह होना चाहिए। अन्यथा आप ऊपर बताई गई त्रुटि के साथ समाप्त होते हैं। हालाँकि, आपको फ़ंक्शन में उपयोग करने की आवश्यकता नहीं है । आप अपनी स्वयं की कार्यक्षमता जोड़ सकते हैं जो तब मानचित्र फ़ंक्शन द्वारा उपयोग की जाती है। यहाँ एक कठिन-कूट विधि है जो सभी अक्षरों को एक बड़े अक्षर में बदल देती है:return obj[method]();
callMethod()
function makeCap()
{
return function(obj) {
return obj.toUpperCase();
}
}
var caps2 = map(['a', 'b', 'c'], makeCap()); // ['A','B','C']
console.log(caps2)
आपके द्वारा लिंक किए गए ट्यूटोरियल में कोड आंशिक कार्यों का उपयोग करता है । वे खुद से एक मुश्किल अवधारणा हैं। उस विषय के बारे में अधिक पढ़ने से मुझे उन चीजों को स्पष्ट करने में मदद करनी चाहिए जो मैं कभी भी बना सकता हूं।
नोट: यह प्रश्न, स्रोत में कोड द्वारा उपयोग किए गए मानचित्र फ़ंक्शन का कोड है ।
function map(arr, iterator) {
var narr = [];
for (var i = 0; i < arr.length; i++) narr.push(iterator(arr[i], i));
return narr;
}
arr[5]
:। यदि संख्या जहाँ मान्य पहचानकर्ता नाम आप डॉट नोटेशन का उपयोग कर सकते हैंarr.5
:।