এখানে লক্ষণীয় গুরুত্বপূর্ণ বিষয়টি হ'ল, জাভাস্ক্রিপ্ট যেহেতু একটি গতিশীল ভাষা, তাই প্রতিটি বস্তু মূলত কেবল একটি গৌরবযুক্ত হ্যাশ-মানচিত্র ( কয়েকটি ব্যতিক্রম সহ )। এবং একটি জাভাস্ক্রিপ্ট অবজেক্টের প্রতিটি জিনিস দুটি উপায়ে অ্যাক্সেস করা যেতে পারে - বন্ধনীর চিহ্ন এবং ডট স্বরলিপি।
আপনার প্রশ্নের প্রথম অংশটির উত্তর দিয়ে আমি দুটি স্বরলিপিটি দ্রুত যাব এবং তারপরে আমি দ্বিতীয় অংশে যাব।
বন্ধনী স্বরলিপি
এই মোডটি অন্যান্য প্রোগ্রামিং ভাষাগুলিতে হ্যাশম্যাপ এবং অ্যারে অ্যাক্সেস করার অনুরূপ। আপনি এই সিনট্যাক্সটি ব্যবহার করে যে কোনও উপাদান (ডেটা (অন্যান্য সামগ্রী সহ) বা ফাংশন) অ্যাক্সেস করতে পারেন ।
এটি আপনার উদাহরণে ঠিক কী করছেন। আপনার কাছে 'a'
যা (এবং একটি স্ট্রিং, না , একটি অক্ষর আক্ষরিক মত এটা যেমন সি ++ যেমন একটি ভাষা হতে হবে)।
বন্ধনী স্বরলিপি ব্যবহার করে, আপনি এর toUpperCase
পদ্ধতিটি অ্যাক্সেস করতে পারেন । তবে এটি অ্যাক্সেস এখনও যথেষ্ট নয়; alert
উদাহরণস্বরূপ জাভাস্ক্রিপ্টে টাইপিং পদ্ধতিটিকে কল করে না। এটি কেবল একটি সাধারণ বিবৃতি ফাংশনটি কল করার জন্য, আপনাকে প্রথম বন্ধনী যুক্ত করতে হবে: এতে alert()
একটি সাধারণ ডায়ালগ বক্স রয়েছে undefined
, কারণ এটি কোনও পরামিতি পেয়েছে। আমরা এখন আপনার কোডটি বোঝার জন্য এই জ্ঞানটি ব্যবহার করতে পারি, যা হয়ে ওঠে:
alert('a'.toUpperCase());
যা অনেক বেশি পঠনযোগ্য।
প্রকৃতপক্ষে, এটি আরও খানিকটা ভাল বোঝার একটি ভাল উপায় হ'ল নিম্নলিখিত জাভাস্ক্রিপ্ট কার্যকর করা:
alert(alert)
এটি দ্বিতীয় সতর্কতা কার্যকর না করেও alert
এটি একটি ফাংশন অবজেক্টকে পাস করার মাধ্যমে কল করে alert
। যা দেখানো হয়েছে (ক্রোম 26 এ, কমপক্ষে) নীচে রয়েছে:
function alert() { [native code] }
কল করা হচ্ছে:
alert(alert())
সমন্বিত দুটি বার্তা বার্তা প্রদর্শন করে undefined
। এটি ব্যাখ্যা করা সহজ: অভ্যন্তরটি alert()
প্রথমে কার্যকর হয়ে যায়, দেখায় undefined
(কারণ এটির কোনও পরামিতি ছিল না) এবং কিছুই দেয় না। বাইরের সতর্কতা অভ্যন্তরীণ সতর্কতার রিটার্ন মান গ্রহণ করে - যা কিছুই নয়, এবং undefined
একটি বার্তা বাক্সেও প্রদর্শন করে।
জেসফিডেলে সমস্ত মামলা চেষ্টা করে দেখুন!
ডট স্বরলিপি
এটিই আরও মানসম্পন্ন পদ্ধতির, যা কোনও বস্তুর সদস্যদের বিন্দু ( .
) অপারেটর ব্যবহার করে অ্যাক্সেস করার অনুমতি দেয় । আপনার কোডটি বিন্দু স্বরলিপিতে দেখতে এমন দেখাচ্ছে:
alert('a'.toUpperCase())
আরও অনেক পাঠযোগ্য able সুতরাং কখন আমাদের বিন্দু চিহ্নিতকরণ ব্যবহার করা উচিত এবং কখন বন্ধনী স্বরলিপি ব্যবহার করা উচিত?
তুলনা
দুটি পদ্ধতির মধ্যে মূল পার্থক্যটি শব্দার্থক। এছাড়াও অন্যান্য কিছু বিবরণ রয়েছে, তবে আমি তাদের সাথে এক সেকেন্ডের মধ্যে পৌঁছে দেব। সবচেয়ে গুরুত্বপূর্ণ আপনি যা করতে চান তা হ'ল - থাম্বের একটি নিয়ম হ'ল আপনি সঠিকভাবে প্রতিষ্ঠিত ক্ষেত্র এবং কোনও বস্তুর যে পদ্ধতিগুলির জন্য বদ্ধ স্বরলিপি ব্যবহার করেন, এবং যখন আপনি আপনার বস্তুটিকে হ্যাশ মানচিত্র হিসাবে প্রকৃতপক্ষে ব্যবহার করছেন তখন বন্ধনী - স্বরলিপি ।
এই নিয়মটি কেন এত গুরুত্বপূর্ণ তার একটি দুর্দান্ত উদাহরণ আপনার উদাহরণে দেখানো যেতে পারে - যেহেতু কোডটি এমন জায়গায় ব্র্যাক নোটেশন ব্যবহার করছে যেখানে ডট নোটেশনটি আরও বোধগম্য হত, সুতরাং কোডটি পড়া আরও শক্ত করে তোলে। এবং এটি একটি খারাপ জিনিস, কারণ কোডটি লিখিত হওয়ার চেয়ে অনেক বেশি বার পড়া হয় ।
কিছু ক্ষেত্রে, ডট স্বরলিপি ব্যবহার করা আরও বুদ্ধিমান হলেও আপনার ব্র্যাকেট স্বরলিপি ব্যবহার করতে হবে :
যদি কোনও বস্তুর সদস্যের একটির এক বা একাধিক স্পেস বা অন্য কোনও বিশেষ অক্ষর যুক্ত একটি নাম থাকে, আপনি বিন্দু চিহ্নিতকরণ ব্যবহার করতে পারবেন না: foo.some method()
কাজ করে না foo["some method"]()
;
যদি আপনাকে কোনও বস্তুর সদস্যদের গতিশীলভাবে অ্যাক্সেস করতে হয় তবে আপনি বন্ধনী স্বরলিপি ব্যবহার করে আটকেও গেছেন;
উদাহরণ:
for(var i = 0; i < 10; ++i) {
foo["method" + i]();
}
নীচের লাইনটি হ'ল ম্যাপ ( foods["burger"].eat()
) হিসাবে বস্তুটি ব্যবহার করার সময় এবং "প্রকৃত" ক্ষেত্র এবং পদ্ধতি ( enemy.kill()
) এর সাথে কাজ করার সময় ডট সিনট্যাক্স ব্যবহার করার সময় আপনার বন্ধনী সিনট্যাক্স ব্যবহার করা উচিত । জাভাস্ক্রিপ্ট একটি গতিশীল ভাষা হওয়ার সাথে সাথে "প্রকৃত" ক্ষেত্র এবং কোনও অবজেক্টের পদ্ধতি এবং "অন্যান্য" ডেটার মধ্যে থাকা "ডেটা" র মধ্যে লাইনটি বেশ ঝাপসা হয়ে যেতে পারে। তবে যতক্ষণ আপনি এগুলিকে বিভ্রান্তিকর উপায়ে মিশ্রিত করবেন না ততক্ষণ আপনার ভাল হওয়া উচিত।
এখন, আপনার বাকী অংশে (অবশেষে!: পি)।
আমি কীভাবে নিশ্চিত হতে পারি যে পদ্ধতিটি সর্বদা অবজেক্টের সদস্য হতে পারে
আপনি পারবেন না। চেষ্টা করে দেখুন derp
একটি স্ট্রিং কল করার চেষ্টা করুন । আপনি এর লাইনে একটি ত্রুটি পাবেন:
Uncaught TypeError: Object a has no method 'derp'
যে কোনও বস্তুর যেকোন পদ্ধতিতে কল করা এটি জেনারিক ফাংশন। তবে এর অর্থ কি নির্দিষ্ট পদ্ধতিটি ইতিমধ্যে নির্দিষ্ট বস্তুর অন্তর্নিহিত সদস্য হবে?
হ্যাঁ, আপনার ক্ষেত্রে এটি হতে হবে। অন্যথায় আপনি উপরে উল্লিখিত ত্রুটিটি শেষ করেন। যাইহোক, যদি আপনি না আছে ব্যবহার করতে return obj[method]();
মধ্যে callMethod()
ফাংশন। আপনি নিজের ক্রিয়াকলাপটি যুক্ত করতে পারেন যা মানচিত্রের ফাংশন দ্বারা ব্যবহৃত হবে used এখানে একটি হার্ড-কোডেড পদ্ধতি যা সমস্ত অক্ষরকে বড় হাতের অক্ষরে পরিণত করে:
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
।