জাভাস্ক্রিপ্টে ধরণের রূপ এবং ধরণের রূপান্তরের প্রচুর "কৌশল" রয়েছে তাই আমি ভাবছি যে এই 2 পদ্ধতিগুলি একই কিনা বা এমন কোনও কোণার ক্ষেত্রে রয়েছে যা তাদেরকে আলাদা করে দেয়?
উত্তর:
এগুলি পুরোপুরি একরকম নয় এবং প্রকৃতপক্ষে স্ট্রিং কনস্ট্রাক্টরকে একটি ফাংশন (আপনার প্রথম উদাহরণ) হিসাবে ডাকা হয়, শেষে, toStringপাস করা অবজেক্টের পদ্ধতিটি কল করবে , উদাহরণস্বরূপ:
var o = { toString: function () { return "foo"; } };
String(o); // "foo"
অন্যদিকে, কোনও সনাক্তকারী যদি উল্লেখ করে nullবা undefined, আপনি toStringপদ্ধতিটি ব্যবহার করতে পারবেন না , এটি আপনাকে একটি TypeErrorব্যতিক্রম দেয় :
var value = null;
String(null); // "null"
value.toString(); // TypeError
Stringকন্সট্রাকটর একটি ফাংশন হিসাবে বলা মোটামুটিভাবে সমতূল্য হবে:
value + '';
থেকে টাইপ রূপান্তর নিয়ম অবজেক্ট -to- আদিম স্পেসিফিকেশন, বর্ণিত বিশদ করছে [[DefaultValue]]অভ্যন্তরীণ অপারেশন।
সংক্ষেপে সংক্ষিপ্তসার হিসাবে, অবজেক্ট- টু- স্ট্রিং থেকে রূপান্তর করার সময় , নিম্নলিখিত পদক্ষেপগুলি নেওয়া হয়:
toStringপদ্ধতিটি কার্যকর করুন ।
resultএকটি হয় আদিম , এর বিনিময়ে result, পদক্ষেপ 2 অন্য যান।valueOfপদ্ধতিটি কার্যকর করুন ।
resultএকটি হয় আদিম , এর বিনিময়ে result, ধাপ 3 অন্য যান।TypeError।উপরোক্ত নিয়মগুলি দেওয়া, আমরা জড়িত শব্দার্থবিদ্যার একটি উদাহরণ তৈরি করতে পারি:
var o = {
toString: function () { return "foo"; },
valueOf: function () { return "bar"; }
};
String(o); // "foo"
// Make the toString method unavailable:
o.toString = null;
String(o); // "bar"
// Also make the valueOf method unavailable:
o.valueOf = null;
try {
String(o);
} catch (e) {
alert(e); // TypeError
}
আপনি এই প্রক্রিয়া দেখছি পরামর্শ দেবেন সম্পর্কে আরো জানতে চান ToPrimitiveএবং ToStringঅভ্যন্তরীণ অপারেশন।
আমি এই নিবন্ধটি পড়ার পরামর্শ দিচ্ছি:
new String({toString: null})একটি নিক্ষেপ করেছেন TypeError।
String()এবং + ''এখন একটি যথেষ্ট উল্লেখযোগ্য পার্থক্য রয়েছে। String(Symbol())চলবে, তবে Symbol() + ''একটি ত্রুটি ছুঁড়ে ফেলবে (এবং প্রতীক () নকল এবং অপরিজ্ঞাত বিপরীতে একটি মিথ্যা রক্ষককে পাস করবে, সুতরাং x && (x + '')এখন নিক্ষেপ করতে পারে)।
value.toString()valueশূন্য বা সংজ্ঞায়িত হলে ত্রুটি ঘটবে । String(value)করা উচিত নয়।
উদাহরণ স্বরূপ:
var value = null;
alert(value.toString());
ব্যর্থ হবে কারণ value == null।
var value = null;
alert(String(value));
"নাল" (বা অনুরূপ) পড়া কোনও বার্তা প্রদর্শন করা উচিত তবে এটি ক্রাশ হবে না।
String(value)যেমন একই ফলাফল থাকা উচিত value.toString(), প্রতিটি ক্ষেত্রে মত বৈশিষ্ট্য ছাড়া মানের জন্য ছাড়া nullবা undefined। ''+valueএকই ফলাফল উত্পাদন করবে।
স্ট্রিং () [ কনস্ট্রাক্টর কল ] মূলত .toString () কে কল করছে
.toString () এবং স্ট্রিং () আদিম মানগুলিতে (সংখ্যা, বুলিয়ান, স্ট্রিং) কল করা যেতে পারে এবং মূলত বিশেষ কিছুই করবে না:
সত্য => 'সত্য'
মিথ্যা => 'মিথ্যা'
17 => '17'
'হ্যালো' => 'হ্যালো'
তবে বস্তুগুলিতে এই ফাংশনগুলি কল করা জিনিসগুলি আকর্ষণীয় হয়ে ওঠে:
যদি অবজেক্টটির নিজস্ব .to স্ট্রিং () ফাংশন থাকে তবে যখনই আপনাকে এই বস্তুকে স্ট্রিং হিসাবে বিবেচনা করা প্রয়োজন (স্পষ্ট / স্পষ্টভাবে)
let obj = {
myName:"some object",
toString:function(){ return this.myName; }
}
//implicitly treating this obj as a string
"hello " + obj; //"hello some object"
//OR (explicitly)
"hello " + String(obj) //calling the existent toString function
//OR
"hello " + obj.toString(); //calling toString directly
যাইহোক আপনি যদি এই অবজেক্টটিকে একটি সংখ্যা হিসাবে বিবেচনা করতে চান তবে এটিতে একটি .valueOf () ফাংশন সংজ্ঞায়িত করা উচিত।
যদি আমাদের উভয়ই এক বস্তুতে থাকে?
যদি আমরা এই বিষয়টিকে স্ট্রিং => ব্যবহার করে। স্ট্রিং () হিসাবে বিবেচনা করতে চাই
যদি আমরা এই অবজেক্টটিকে একটি সংখ্যা হিসাবে ব্যবহার করতে চাই তবে => ব্যবহার করুন। মূল্যবোধ ()
আমাদের যদি কেবল .valueOf () সংজ্ঞায়িত করা হয় তবে কী হবে?
.valueOf () অবজেক্টের অভ্যন্তরে সংজ্ঞায়িত করা হবে যে আমরা বস্তুকে স্ট্রিং হিসাবে বা একটি সংখ্যা হিসাবে পরিচালনা করতে চাই তা বলা হবে
new String(value)যে কোনও মানতেই, এটি সর্বদা একটি স্ট্রিং অবজেক্টকে ফিরিয়ে দেয়।