জাভাস্ক্রিপ্টে স্ট্রিং এ কাস্টিং


184

আমি Stringজাভাস্ক্রিপ্টে একটি ভেরিয়েবল কাস্ট করার তিনটি উপায় পেয়েছি ।
আমি jQuery উত্স কোডে এই তিনটি বিকল্পের জন্য অনুসন্ধান করেছি এবং সেগুলি সমস্ত ব্যবহৃত
তাদের মধ্যে কোনও মতপার্থক্য রয়েছে কিনা তা জানতে চাই:

value.toString()
String(value)
value + ""

ডেমো

তারা সবাই একই আউটপুট উত্পাদন করে তবে তাদের মধ্যে একটির কি অন্যের চেয়ে ভাল হয়?
আমি বলব + ""এটির একটি সুবিধা রয়েছে যা এটি কিছু অক্ষর সংরক্ষণ করে, তবে এটি এত বড় সুবিধা নয়, অন্য কিছু?


1
আমার কাছে মনে হয় যে যদি সমস্ত জিনিস সমান হয় তবে স্ট্যান্ডার্ডটি toString()সেই পথে যাওয়ার উপায় হবে।
asawyer

1
@asawyer। এবং এটা কেন? যদি তারা সবাই একই আউটপুট উত্পাদন করে এবং একই কাজ করে তবে একটি বাছাই করুন এবং এটির সাথে যান। এখানে যদি সত্যিই এটি হয় তবে এটি আমার মতামত ।
gdoron মনিকা

1
প্রথম দুটি পদ্ধতি সমতুল্য হওয়া উচিত (আপনার স্ট্যান্ডার্ডটি পরীক্ষা করা উচিত তবে কনস্ট্রাক্টর টু স্ট্রিংকে কল করবেন)। তৃতীয়টি সর্বদা একই আউটপুট উত্পাদন করে তবে এটির মধ্যে একটি খুব আলাদা প্রক্রিয়া জড়িত (গতির পাশাপাশি এটিতে বিভিন্ন কল জড়িত থাকে তাই এটি আপনি প্রতিটি ধরণের অবজেক্টের জন্য প্রত্যাশা নাও করতে পারেন)।
অ্যাড্রিয়ানো রেপিটি

6
আমার মতে toStringশব্দার্থগতভাবে স্ব নথির স্বচ্ছতম উপায় হ'ল আপনি কোনও বস্তুর সমতুল্য স্ট্রিং পাওয়ার চেষ্টা করছেন। String(...)এটি একটি সামান্য অবাস্তব, এবং value + ""একটি হ্যাক কিছুটা। এটি আপনাকে toStringএকটি স্বল্প পার্শ্ব সুবিধা হিসাবে আমার মনে করার প্রয়োজন হয় যদি কাস্টম প্রয়োগের সাথে ডিফল্টকে ওভাররাইড করার ক্ষমতাও দেয় ।
asawyer

2
@Adriano। তবে + ""জেএসপিআইপি অনুসারে দ্রুততম, তাই ... এটি আমার অনুমান অনুসারে এটি কোনওভাবেই হয় না।
জিডোরন মনিকে

উত্তর:


212

তারা ভিন্নভাবে আচরণ যখন valueহয় null

  • null.toString()একটি ত্রুটি নিক্ষেপ করে - নালটির 'টু স্ট্রিং' পদ্ধতিতে কল করা যায় না
  • String(null)রিটার্ন - "নাল"
  • null + ""এছাড়াও ফিরে আসে - "নাল"

অত্যন্ত অনুরূপ আচরণ যদি এমন ঘটে তাহলে valueহয় undefined(দেখুন jbabey এর উত্তর )।

এগুলি ছাড়াও, এখানে একটি তুচ্ছ পারফরম্যান্স পার্থক্য রয়েছে, যা আপনি যদি এগুলিকে বিশাল লুপগুলিতে ব্যবহার না করেন তবে চিন্তার মতো নয়।


এটি আসলে একটি আকর্ষণীয় পার্থক্য। সুতরাং আপনি toString()যখন nullএখনও চেক করেন নি তখন ব্যবহার করা থেকে বিরত থাকা উচিত ।
স্যামি এস

@SammyS। জানেন না যে মুদ্রণ nullবা undefinedস্ক্রিনে আরও আকাঙ্ক্ষিত আচরণ হয় তবে জাভাস্ক্রিপ্ট ত্রুটি ...
জাস্টাস রোমিজন

@ জাস্টাসরোমিজন: সত্যই। এর মধ্যে, আমি এই জাতীয় ত্রুটিগুলি পরিচালনা করতে অপশন প্রকারটি ব্যবহার করতে শুরু করেছি।
স্যামি এস

স্ট্রিং চেক করতে আপনি টাইপফের সাথে এই পোষ্ট করা ভেরিয়েবলগুলির যে কোনওটি পরীক্ষা করতে পারেন। typof (নাল + '') == 'স্ট্রিং'
ব্রুস লিম

4
তারা অন্যরকম আচরণ করার সময় আরও একটি মামলা রয়েছে। v + ''যদি ভিতে উভয় স্ট্রিং () এবং মানফল () পদ্ধতি থাকে তবে ভুল ফলাফল প্রদান করে। সংঘটন টু স্ট্রিং () উপেক্ষা করবে এবং মান ওফ () ব্যবহার করবে। সংক্ষেপণ
মিকিতা বেলাহলাজাউ

26

পার্থক্য রয়েছে, তবে এগুলি সম্ভবত আপনার প্রশ্নের সাথে প্রাসঙ্গিক নয়। উদাহরণস্বরূপ, টসস্ট্রিং প্রোটোটাইপ অপরিজ্ঞাত ভেরিয়েবলগুলিতে বিদ্যমান নেই তবে আপনি অন্য দুটি পদ্ধতি ব্যবহার করে স্ট্রিংয়ে অপরিজ্ঞাত কাস্ট করতে পারেন:

var foo;

var myString1 = String(foo); // "undefined" as a string

var myString2 = foo + ''; // "undefined" as a string

var myString3 = foo.toString(); // throws an exception

http://jsfiddle.net/f8YwA/


3
যদি কোনও ভেরিয়েবলটি সংজ্ঞায়িত না হয় তবে আপনি এর জন্য ত্রুটি পাবেন String()। উদাহরণ: String(test);নিক্ষেপ Uncaught ReferenceError: test is not defined, যখন var test; String(test);ফলাফল হবে "undefined"
অ্যান্থনি

17

তারা একই আচরণ করে তবে toStringএকটি সংখ্যা বাইনারি, অক্টাল বা হেক্সাডেসিমাল স্ট্রিং রূপান্তর করার একটি উপায়ও সরবরাহ করে:

উদাহরণ:

var a = (50274).toString(16)  // "c462"
var b = (76).toString(8)      // "114"
var c = (7623).toString(36)   // "5vr"
var d = (100).toString(2)     // "1100100"

9

এই জেএসপিফার পরীক্ষা অনুসারে , তারা গতিতে আলাদা। তবে যতক্ষণ না আপনি এগুলিকে বিপুল পরিমাণে ব্যবহার করতে যাচ্ছেন, তাদের মধ্যে কোনওরই ভাল কাজ করা উচিত।

সম্পূর্ণতার জন্য: asawyer ইতিমধ্যে উল্লিখিত হিসাবে , আপনি এছাড়াও .toString()পদ্ধতি ব্যবহার করতে পারেন ।


2
এই জেএসপিফার দু'বার একই পরীক্ষা হয়েছে, আমি এটি সম্পাদনা করেছি এবং যে new String()বস্তুটি নয়String
জিডোরন মনিকাকে

new String()হ্যাঁ একটি বস্তু ফেরত দেয়। String()যাইহোক, একটি স্ট্রিং প্রদান করে, যা প্রশ্নের মধ্যে একটি।
কনেল

2
এই সম্পূর্ণ সত্য নয়। ফলাফল থেকে আপনি দেখতে পাচ্ছেন যে, একটি খালি স্ট্রিং এবং একটি অবজেক্টকে একত্রিত করার ফলে কোনও বস্তু এবং খালি স্ট্রিং সংযুক্ত করে একই ফল পাওয়া যায় না । তদ্ব্যতীত, new String(blarg)আপনাকে Stringকল করতে পারে এমন একটি সামগ্রী দেয় toString()। আমার ক্রোম ডিবাগারে, তারা পার্থক্য ছাড়াই কার্যকর পার্থক্য বাদে একই ধরণের অবজেক্টকে কার্যকরভাবে ফল দেয়।
স্যামি এস

@SammyS। আপনি দয়া করে আপনার উত্তরে উদাহরণস্বরূপ পারফরম্যান্স ফলাফল যুক্ত করতে পারেন? Jsperf লিঙ্কটি বর্তমানে নিচে রয়েছে এবং অবশ্যই পরবর্তী 5+ বছরে আবার হবে।
mxMLnkn

9

উপরের সমস্তটি ছাড়াও, একটি লক্ষ করা উচিত যে, একটি সংজ্ঞায়িত মানটির জন্য v:

  • String(v) কল v.toString()
  • '' + vv.valueOf()অন্য কোনও ধরণের কাস্টের আগে কল

সুতরাং আমরা যেমন কিছু করতে পারে:

var mixin = {
  valueOf:  function () { return false },
  toString: function () { return 'true' }
};
mixin === false;  // false
mixin == false;    // true
'' + mixin;       // "false"
String(mixin)     // "true"

এফএফ 34.0 এবং নোড 0.10 এ পরীক্ষিত


8

যদি আপনি নাল, অপরিজ্ঞাত, NaN, 0, এবং মিথ্যা সমস্ত কাস্টিং '' এর সাথে ঠিক থাকেন তবে (s ? s+'' : '')দ্রুত হয়।

দেখতে http://jsperf.com/cast-to-string/8

দ্রষ্টব্য - ব্রাউজারগুলিতে এই মুহুর্তে উল্লেখযোগ্য পার্থক্য রয়েছে।


4

বাস্তব জগতে উদাহরণ: আমি যে প্যারামিটার একটি অবাধ নম্বর দিয়ে বলা যেতে পারে একটি লগ ফাংশন আছে: log("foo is {} and bar is {}", param1, param2)। যদি একটি DEBUGপতাকা সেট করা থাকে true, বন্ধনীগুলি প্রদত্ত প্যারামিটারগুলি দ্বারা প্রতিস্থাপিত হয় এবং স্ট্রিংটি পাস করা হয় console.log(msg)। পরামিতি এবং স্ট্রিং, নাম্বার হতে হবে পারে এবং যাই হোক না কেন, তাদেরকে JSON / AJAX এর কল দ্বারা ফিরে যেতে পারে এমনকি null

  • arguments[i].toString()সম্ভাব্য nullমানগুলির কারণে কোনও বিকল্প নয় (কনেল ওয়াটকিন্সের উত্তর দেখুন)
  • জেএসলিন্ট অভিযোগ করবেন arguments[i] + ""। এটি কী ব্যবহার করবেন সে সম্পর্কে সিদ্ধান্তে প্রভাব ফেলতে পারে বা নাও পারে। কিছু লোক জেএসলিন্টের কঠোরভাবে অনুসরণ করে।
  • কিছু ব্রাউজারগুলিতে স্ট্রিং ফাংশন বা স্ট্রিং কনস্ট্রাক্টর ব্যবহার করার চেয়ে খালি স্ট্রিংগুলি সংঘবদ্ধ করা কিছুটা দ্রুত হয় (স্যামিস এস এর উত্তরে জেএসপিআইপি পরীক্ষাটি দেখুন)। অপেরা 12 এবং ফায়ারফক্স 19-তে, খালি স্ট্রিংগুলি সংঘবদ্ধ করা দ্রুততরভাবে দ্রুততর হয় (ফায়ারফক্স ১৯-এ 95%) - বা কমপক্ষে জেএসপিফারফ তা বলেছে।

1

এই পৃষ্ঠায় আপনি প্রতিটি পদ্ধতির কর্মক্ষমতা নিজেই পরীক্ষা করতে পারেন :)

http://jsperf.com/cast-to-string/2

এখানে, সমস্ত মেশিন এবং ব্রাউজারগুলিতে, "" + স্ট্রিং " দ্রুততম, (স্ট্রিং) স্ট্রেম সবচেয়ে ধীর

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