স্ট্রিং (মান) বনাম মান। স্ট্রিং () এর মধ্যে পার্থক্য কী


108

জাভাস্ক্রিপ্টে ধরণের রূপ এবং ধরণের রূপান্তরের প্রচুর "কৌশল" রয়েছে তাই আমি ভাবছি যে এই 2 পদ্ধতিগুলি একই কিনা বা এমন কোনও কোণার ক্ষেত্রে রয়েছে যা তাদেরকে আলাদা করে দেয়?

উত্তর:


127

এগুলি পুরোপুরি একরকম নয় এবং প্রকৃতপক্ষে স্ট্রিং কনস্ট্রাক্টরকে একটি ফাংশন (আপনার প্রথম উদাহরণ) হিসাবে ডাকা হয়, শেষে, 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]]অভ্যন্তরীণ অপারেশন।

সংক্ষেপে সংক্ষিপ্তসার হিসাবে, অবজেক্ট- টু- স্ট্রিং থেকে রূপান্তর করার সময় , নিম্নলিখিত পদক্ষেপগুলি নেওয়া হয়:

  1. যদি উপলব্ধ থাকে তবে toStringপদ্ধতিটি কার্যকর করুন ।
    • যদি resultএকটি হয় আদিম , এর বিনিময়ে result, পদক্ষেপ 2 অন্য যান।
  2. যদি উপলব্ধ থাকে তবে valueOfপদ্ধতিটি কার্যকর করুন ।
    • যদি resultএকটি হয় আদিম , এর বিনিময়ে result, ধাপ 3 অন্য যান।
  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অভ্যন্তরীণ অপারেশন।

আমি এই নিবন্ধটি পড়ার পরামর্শ দিচ্ছি:


4
একটি তৃতীয় "উপায়" রয়েছে, আপনি যদি এটি কল করেন: new String(value)যে কোনও মানতেই, এটি সর্বদা একটি স্ট্রিং অবজেক্টকে ফিরিয়ে দেয়।
হারবার্টস

@ হারবার্টাস new String({toString: null})একটি নিক্ষেপ করেছেন TypeError
Ван

প্রতীক যোগ করার সাথে String()এবং + ''এখন একটি যথেষ্ট উল্লেখযোগ্য পার্থক্য রয়েছে। String(Symbol())চলবে, তবে Symbol() + ''একটি ত্রুটি ছুঁড়ে ফেলবে (এবং প্রতীক () নকল এবং অপরিজ্ঞাত বিপরীতে একটি মিথ্যা রক্ষককে পাস করবে, সুতরাং x && (x + '')এখন নিক্ষেপ করতে পারে)।
ইয়ার্ক

24

value.toString()valueশূন্য বা সংজ্ঞায়িত হলে ত্রুটি ঘটবে । String(value)করা উচিত নয়।

উদাহরণ স্বরূপ:

var value = null;
alert(value.toString());

ব্যর্থ হবে কারণ value == null

var value = null;
alert(String(value));

"নাল" (বা অনুরূপ) পড়া কোনও বার্তা প্রদর্শন করা উচিত তবে এটি ক্রাশ হবে না।


4
আমি জাভাস্ক্রিপ্টে কোনও নাল পয়েন্টার ব্যতিক্রম দেখিনি ... আপনি কোথায় তা দেখেছেন?
Dagg Nabbit

সুন্দর এটি উদাহরণ সহ আরও সুন্দর হবে
মাইখাল

@ না, @ ক্যাসাব্ল্যাঙ্কা স্থির। আমি জাভাতে অভ্যস্ত। @ মাইখাল কীভাবে দেখছেন?
জোনাথন

এটি একটি স্ট্রিং ফেরৎ "নাল" :)
moefinley

1

String(value)যেমন একই ফলাফল থাকা উচিত value.toString(), প্রতিটি ক্ষেত্রে মত বৈশিষ্ট্য ছাড়া মানের জন্য ছাড়া nullবা undefined''+valueএকই ফলাফল উত্পাদন করবে।


1

স্ট্রিং () [ কনস্ট্রাক্টর কল ] মূলত .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 () অবজেক্টের অভ্যন্তরে সংজ্ঞায়িত করা হবে যে আমরা বস্তুকে স্ট্রিং হিসাবে বা একটি সংখ্যা হিসাবে পরিচালনা করতে চাই তা বলা হবে

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.