TLDR
টাইপ জবরদস্তি, বা অন্তর্নিহিত ধরণের রূপান্তর, দুর্বল টাইপিং সক্ষম করে এবং জাভাস্ক্রিপ্ট জুড়ে ব্যবহৃত হয়। বেশিরভাগ অপারেটর (কঠোর সমতা অপারেটরগুলির উল্লেখযোগ্য ব্যতিক্রম ===এবং !==), এবং মান পরীক্ষা করার ক্রিয়াকলাপগুলি (উদাহরণস্বরূপ if(value)...) তাদের সরবরাহকৃত মানকে বাধ্য করবে, যদি সেই মানগুলির প্রকারগুলি অপারেশনের সাথে তাত্ক্ষণিকভাবে সামঞ্জস্য না করে।
কোনও মানকে বাধ্য করার জন্য ব্যবহৃত যথাযথ প্রক্রিয়াটি মূল্যায়নের প্রকাশের উপর নির্ভর করে। প্রশ্নে, সংযোজন অপারেটরটি ব্যবহার করা হচ্ছে।
সংযোজন অপারেটর প্রথমে উভয় অপারেশনগুলিকে আদিম বলে নিশ্চিত করবে, যা এই ক্ষেত্রে valueOfপদ্ধতিটি কল করার সাথে জড়িত । toStringপদ্ধতি এই ইনস্ট্যান্সের মধ্যে বলা হয় না কারণ উপেক্ষা করা হয় valueOfবস্তুর উপর পদ্ধতি xএকটি আদিম মান ফেরায়।
তারপরে, যেহেতু প্রশ্নের অপারেটরগুলির মধ্যে একটি স্ট্রিং, উভয় অপারেন্ডগুলি স্ট্রিতে রূপান্তরিত হয়। এই প্রক্রিয়াটি বিমূর্ত, অভ্যন্তরীণ অপারেশন ToString(নোট: মূলধন) toStringব্যবহার করে এবং বস্তুর (বা এর প্রোটোটাইপ চেইন) পদ্ধতি থেকে পৃথক ।
অবশেষে, ফলাফলযুক্ত স্ট্রিংগুলি সংক্ষিপ্ত করা হয়।
বিস্তারিত
জাভাস্ক্রিপ্টে প্রতিটি ভাষার ধরণের সাথে সম্পর্কিত প্রতিটি কন্সট্রাক্টর ফাংশন অবজেক্টের প্রোটোটাইপে (যেমন, সংখ্যা, বিগিয়ান্ট, স্ট্রিং, বুলিয়ান, সিম্বল এবং অবজেক্ট) দুটি পদ্ধতি রয়েছে: valueOfএবং toString।
এর উদ্দেশ্য valueOfহ'ল কোনও বস্তুর সাথে সম্পর্কিত আদিম মানটি পুনরুদ্ধার করা (যদি এটির একটি থাকে)। যদি কোনও অবজেক্টের অন্তর্নিহিত আদিম মান না থাকে তবে অবজেক্টটি কেবল সহজভাবে ফিরে আসে।
যদি valueOfকোনও আদিমতার বিরুদ্ধে ডাকা হয়, তবে আদিমটি স্বাভাবিক উপায়ে স্বয়ংক্রিয়ভাবে বাক্সযুক্ত হয় এবং অন্তর্নিহিত আদিম মান ফিরে আসে। নোট করুন যে স্ট্রিংয়ের জন্য অন্তর্নিহিত আদিম মান (অর্থাত্ প্রদত্ত মান valueOf) হ'ল স্ট্রিং প্রতিনিধিত্ব।
নিম্নলিখিত কোডটি দেখায় যে valueOfপদ্ধতিটি একটি মোড়কের বস্তু থেকে অন্তর্নিহিত আদিম মানটি ফিরিয়ে দেয় এবং এটি দেখায় যে কীভাবে অপরিবর্তিত অবজেক্টের উদাহরণগুলি আদিমগুলির সাথে সামঞ্জস্যপূর্ণ নয়, তাদের কোনও আদিম মান ফিরে আসে না, তাই তারা কেবল নিজেরাই ফিরে আসে।
console.log(typeof new Boolean(true)) // 'object'
console.log(typeof new Boolean(true).valueOf()) // 'boolean'
console.log(({}).valueOf()) // {} (no primitive value to return)
উদ্দেশ্য toString, অন্য দিকে, একটি অবজেক্ট একটি স্ট্রিং উপস্থাপনা আসতে হয়।
উদাহরণ স্বরূপ:
console.log({}.toString()) // '[object Object]'
console.log(new Number(1).toString()) // '1'
বেশিরভাগ ক্রিয়াকলাপের জন্য, জাভাস্ক্রিপ্ট চুপচাপ এক বা একাধিক অপরেন্ড (গুলি) প্রয়োজনীয় ধরণের রূপান্তর করার চেষ্টা করবে। জাভাস্ক্রিপ্ট ব্যবহার করা সহজ করার জন্য এই আচরণটি বেছে নেওয়া হয়েছিল। প্রাথমিকভাবে জাভাস্ক্রিপ্টের ব্যতিক্রম ছিল না এবং এটি এই নকশার সিদ্ধান্তে ভূমিকাও নিতে পারে। এই জাতীয় অন্তর্নিহিত ধরণের রূপান্তরকে টাইপ জোর করে বলা হয়, এবং এটি জাভাস্ক্রিপ্টের আলগা (দুর্বল) টাইপ সিস্টেমের ভিত্তি। এই আচরণের পিছনে জটিল বিধিগুলি টাইপকাস্টিংয়ের জটিলতাটি ভাষাতে এবং আপনার কোডের বাইরে নিয়ে যাওয়া।
জবরদস্তি প্রক্রিয়া চলাকালীন, রূপান্তর দুটি मोड আছে যা ঘটতে পারে:
- কোনও বস্তুর কোনও আদিম রূপান্তরকরণ (এতে কোনও ধরণের রূপান্তর নিজেই জড়িত থাকতে পারে) এবং
- একটি নির্দিষ্ট ধরনের দৃষ্টান্ত সরাসরি রূপান্তর, আদিম ধরনের এক কন্সট্রাকটর ফাংশন বস্তুর ব্যবহার (অর্থাত।
Number(), Boolean(), String()ইত্যাদি)
আদিম রূপান্তর
অপ-আদিম প্রকারকে অপারেশন করার জন্য আদিমগুলিতে রূপান্তর করার চেষ্টা করার সময় বিমূর্ত অপারেশনটিকে ToPrimitive'সংখ্যা', বা 'স্ট্রিং' এর anচ্ছিক "ইঙ্গিত" দিয়ে ডাকা হয়। যদি ইঙ্গিতটি বাদ দেওয়া হয়, তবে ডিফল্ট ইঙ্গিতটি 'সংখ্যা' হয় (যদি না @@toPrimitiveপদ্ধতিটি ওভাররাইড না করা থাকে)। যদি ইঙ্গিতটি 'স্ট্রিং' হয় তবে toStringপ্রথমে চেষ্টা করা হয় এবং valueOfদ্বিতীয়টি যদি toStringকোনও আদিম ফিরে না আসে। অন্যথায়, তদ্বিপরীত। ইঙ্গিতটি রূপান্তরটির অনুরোধ করা অপারেশনের উপর নির্ভর করে।
সংযোজন অপারেটর কোনও ইঙ্গিত সরবরাহ করে না, তাই valueOfপ্রথমে চেষ্টা করা হয়। বিয়োগ অপারেটর 'সংখ্যার' একটি ইঙ্গিত সরবরাহ করে, তাই valueOfপ্রথমে চেষ্টা করা হয়। ইঙ্গিতটি 'স্ট্রিং' হ'ল এমন একমাত্র পরিস্থিতিটিতে আমি সুনির্দিষ্টভাবে দেখতে পাচ্ছি:
Object#toString
- বিমূর্ত ক্রিয়াকলাপ
ToPropertyKey, যা একটি যুক্তিটিকে একটি মান হিসাবে রূপান্তর করে যা সম্পত্তি কী হিসাবে ব্যবহৃত হতে পারে
ডাইরেক্ট টাইপ রূপান্তর
প্রতিটি অপারেটর তাদের অপারেশন সম্পন্ন করার জন্য নিজস্ব বিধি রয়েছে। সংযোজন অপারেটর প্রথমে ToPrimitiveপ্রতিটি অপারেন্ডকে আদিম হিসাবে নিশ্চিত করে ব্যবহার করবে ; তারপরে, যদি উভয় অপরেন্দ্র একটি স্ট্রিং হয়, তবে এটি ToStringস্ট্রিংগুলির সাথে আমরা প্রত্যাশা করা স্ট্রিং কনটেনটেশন আচরণটি সরবরাহ করতে ইচ্ছাকৃতভাবে প্রতিটি অপারেন্ডে বিমূর্ত অপারেশনকে অনুরোধ করবে । যদি, ToPrimitiveপদক্ষেপের পরে , উভয় অপারেন্ডগুলি স্ট্রিং না হয়, তবে গাণিতিক সংযোজন করা হয়।
সংযোজনগুলির বিপরীতে, বিয়োগ অপারেটরের ওভারলোডের আচরণ নেই এবং তাই toNumericপ্রতিটি অপারেন্ডকে প্রথমে তাদের ব্যবহার করে আদিমগুলিতে রূপান্তরিত করার জন্য আহ্বান জানাবে ToPrimitive।
তাই:
1 + 1 // 2
'1' + 1 // '11' Both already primitives, RHS converted to string, '1' + '1', '11'
1 + [2] // '12' [2].valueOf() returns an object, so `toString` fallback is used, 1 + String([2]), '1' + '2', 12
1 + {} // '1[object Object]' {}.valueOf() is not a primitive, so toString fallback used, String(1) + String({}), '1' + '[object Object]', '1[object Object]'
2 - {} // NaN {}.valueOf() is not a primitive, so toString fallback used => 2 - Number('[object Object]'), NaN
+'a' // NaN `ToPrimitive` passed 'number' hint), Number('a'), NaN
+'' // 0 `ToPrimitive` passed 'number' hint), Number(''), 0
+'-1' // -1 `ToPrimitive` passed 'number' hint), Number('-1'), -1
+{} // NaN `ToPrimitive` passed 'number' hint', `valueOf` returns an object, so falls back to `toString`, Number('[Object object]'), NaN
1 + 'a' // '1a' Both are primitives, one is a string, String(1) + 'a'
1 + {} // '1[object Object]' One primitive, one object, `ToPrimitive` passed no hint, meaning conversion to string will occur, one of the operands is now a string, String(1) + String({}), `1[object Object]`
[] + [] // '' Two objects, `ToPrimitive` passed no hint, String([]) + String([]), '' (empty string)
1 - 'a' // NaN Both are primitives, one is a string, `ToPrimitive` passed 'number' hint, 1-Number('a'), 1-NaN, NaN
1 - {} // NaN One primitive, one is an object, `ToPrimitive` passed 'number' hint, `valueOf` returns object, so falls back to `toString`, 1-Number([object Object]), 1-NaN, NaN
[] - [] // 0 Two objects, `ToPrimitive` passed 'number' hint => `valueOf` returns array instance, so falls back to `toString`, Number('')-Number(''), 0-0, 0
নোট করুন যে Dateঅন্তর্নিহিত অবজেক্টটি অনন্য, কারণ এটি কেবলমাত্র ডিফল্ট @@toPrimitiveপদ্ধতিটিকে ওভাররাইড করার জন্য অন্তর্নিহিত , যেখানে ডিফল্ট ইঙ্গিতটি 'স্ট্রিং' ('সংখ্যার পরিবর্তে') বলে মনে করা হয়। এটি থাকার কারণ Date, প্রোগ্রামারটির সুবিধার্থে উদাহরণগুলি তাদের সংখ্যাসূচক মানের পরিবর্তে ডিফল্টরূপে পঠনযোগ্য স্ট্রিংগুলিতে অনুবাদ করা উচিত। আপনি @@toPrimitiveনিজের জিনিসগুলিতে ব্যবহার করে ওভাররাইড করতে পারেন Symbol.toPrimitive।
নিম্নলিখিত গ্রিডটি বিমূর্ত সমতা অপারেটর ( ==) ( উত্স ) এর জন্য জবরদস্তির ফলাফলগুলি দেখায় :

এছাড়াও দেখুন ।
window.console.log (x);নাকিalert (x);?