আমি জানি এটি খুব পুরানো প্রশ্ন, তবে উত্তরগুলি যেহেতু সবগুলি অসম্পূর্ণ বলে মনে হচ্ছে আমি তার সাথে 100% খুশি নই। সুতরাং এখানে আমরা প্রথম প্রিন্সিপাল থেকে আবার যাই:
ব্যবহারকারীর সামগ্রিক লক্ষ্য:
কোডটির সংক্ষিপ্তসার: "আমি স্ট্রিংয়ে ক্লাসের নাম যুক্ত করতে চাই optionচ্ছিকভাবে একটি স্ট্রিংয়ের সাথে একটি নেতৃস্থানীয় স্থানের সাথে যদি ইতিমধ্যে স্ট্রিংয়ে শ্রেণীর নাম থাকে।"error
সহজ সমাধান
কোবি যেমন উল্লেখ করেছেন, ৫ বছর আগে, শ্রেণীর নামগুলির শীর্ষস্থানীয় স্থান থাকা কোনও পরিচিত ব্রাউজারে কোনও সমস্যা সৃষ্টি করবে না, তাই সংক্ষিপ্ত সঠিক সমাধানটি হ'ল:
h.className += ' error';
এটি প্রকৃত সমস্যার আসল উত্তর হওয়া উচিত ছিল ।
তা যেমন হয়, প্রশ্নগুলি হ'ল ...
1) কেন এই কাজ?
h.className += h.className ? ' error' : 'error'
শর্তসাপেক্ষ / ত্রৈমাসিক অপারেটর যদি একটি বিবৃতিটির মতো কাজ করে, যা তার চলকের ফলাফল true
বা false
পাথগুলিকে নির্ধারিত করে ।
সুতরাং কোডটি কাজ করেছে কারণ এটি সহজভাবে মূল্যায়ন করা হয়:
if (h.className IS NOT null AND IS NOT undefined AND IS NOT '')
h.className += ' error'
else
h.className += 'error'
2) এবং কেন এই ব্রেক?
h.className = h.className + h.className ? ' error' : 'error'
প্রশ্নটিতে বলা হয়েছে "যা আমার কনসোলে একটি [এন] ত্রুটি দেয়", যা আপনাকে কোডটি কাজ করে না ভেবে ভুল পথে চালিত করতে পারে । বস্তুত নিম্নলিখিত কোড ছাড়াই চালানো হয়, তাহলে এরর , কিন্তু এটা কেবল আয় 'ত্রুটি' STRING যদি হয় নি খালি এবং 'ত্রুটি' যদি স্ট্রিং ছিল খালি এবং তাই প্রয়োজনীয়তা পূরণ করা হয়নি ।
এই কোডটি সর্বদা একটি স্ট্রিংয়ের ফলাফল দেয় যা কেবলমাত্র থাকে ' error'
বা 'error'
কারণ এটি এই সিডো কোডটিতে মূল্যায়ন করে:
if ((h.className + h.className) IS NOT null AND IS NOT undefined AND IS NOT '')
h.className = ' error'
else
h.className = 'error'
এর কারণ হ'ল সংযোজন অপারেটরটির ( +
সাধারণ লোকের কাছে) শর্তসাপেক্ষে / টের্নারি অপারেটর (15) এর চেয়ে বেশি "অগ্রাধিকার" (6) থাকে। আমি জানি সংখ্যাগুলি পিছনের দিকে প্রদর্শিত হবে
অগ্রাধিকারের সহজ অর্থ হল যে কোনও ভাষার প্রতিটি ধরণের অপারেটর একটি নির্দিষ্ট পূর্বনির্ধারিত ক্রমে (এবং কেবল বাম থেকে ডান নয়) মূল্যায়ন করা হয়।
মূল্যায়নের ক্রম কীভাবে পরিবর্তন করবেন:
এখন আমরা জানি এটি কেন ব্যর্থ হয়, কীভাবে এটি কাজ করে তা আপনার জানা দরকার।
আরও কিছু উত্তর অগ্রাধিকার পরিবর্তনের বিষয়ে কথা বলে তবে আপনি তা করতে পারবেন না । প্রাধান্যটি ভাষায় কঠোরভাবে ব্যবহৃত হয়। এটি কেবলমাত্র নিয়মের একটি নির্দিষ্ট সেট ... তবে, আপনি মূল্যায়নের ক্রম পরিবর্তন করতে পারেন ...
আমাদের সরঞ্জামবাক্সের যে সরঞ্জামটি মূল্যায়নের ক্রম পরিবর্তন করতে পারে তা হ'ল গ্রুপিং অপারেটর (ওরফে বন্ধনী)। এটি বন্ধনীগুলির এক্সপ্রেশনগুলি ব্র্যাকেটের বাইরে ক্রিয়াকলাপের আগে মূল্যায়ন করা হয় তা নিশ্চিত করে এটি করে । তারা এগুলিই করে তবে এটি যথেষ্ট।
বন্ধনীগুলি কেবলমাত্র কাজ করে কারণ তাদের (গ্রুপিং অপারেটর) অন্যান্য অপারেটরের তুলনায় উচ্চতর প্রাধান্য রয়েছে ("এখন একটি স্তর 0 রয়েছে")।
কেবল বন্ধনী যুক্ত করে আপনি সাধারণ স্ট্রিং কনটেনটেশনের আগে শর্তসাপেক্ষ পরীক্ষাটি প্রথম সম্পাদিত হয় তা নিশ্চিত করার জন্য মূল্যায়নের ক্রম পরিবর্তন করে :
h.className = h.className + (h.className ? ' error' : 'error')
আমি এখন এই উত্তরটি অন্যদের মধ্যে অদেখা জংয়ের জন্য ছেড়ে দেব :)
h.className += ' error'
, এটি স্ট্রিংয়ের শুরুতে একটি ফাঁকা জায়গা ছেড়ে দেয় যদি এটি প্রাথমিকভাবে খালি ছিল। আমি বিশ্বাস করি যে টার্নারি অপারেশনের মূল বিষয়টি পরিষ্কার-পরিচ্ছন্ন স্ট্রিং উত্পাদন করা।