জাভাস্ক্রিপ্টে স্ট্রিং আদিম এবং স্ট্রিং অবজেক্টের মধ্যে পার্থক্য কী?


116

এমডিএন থেকে নেওয়া

স্ট্রিং লিটারাল (ডাবল বা একক উদ্ধৃতি দ্বারা চিহ্নিত) এবং স্ট্রিং কলগুলি থেকে একটি অ-কনস্ট্রাক্টর প্রসঙ্গে (যেমন, নতুন কীওয়ার্ড ব্যবহার না করে) স্ট্রিংগুলি আদিম স্ট্রিং। জাভাস্ক্রিপ্ট স্বয়ংক্রিয়ভাবে আদিমকে স্ট্রিং অবজেক্টে রূপান্তরিত করে, যাতে আদিম স্ট্রিংয়ের জন্য স্ট্রিং অবজেক্ট পদ্ধতি ব্যবহার করা সম্ভব। প্রাসঙ্গিক ক্ষেত্রে যেখানে কোনও পদ্ধতিটি আদিম স্ট্রিংয়ের সাথে যুক্ত করা যেতে পারে বা কোনও সম্পত্তি অনুসন্ধান দেখা যায়, জাভাস্ক্রিপ্ট স্বয়ংক্রিয়ভাবে স্ট্রিংটিকে আদিম लपेटবে এবং পদ্ধতিটি কল করবে বা সম্পত্তি অনুসন্ধান করবে।

সুতরাং, আমি ভেবেছিলাম স্ট্রিং অবজেক্টগুলিতে স্ট্রিং আদিমগুলিতে অপারেশনগুলি (পদ্ধতি কল) ধীর হওয়া উচিত কারণ কোনও স্ট্রিং আদিম স্ট্রিংয়ের methodউপর প্রয়োগ হওয়ার আগে স্ট্রিং অবজেক্টে (অতিরিক্ত কাজ) রূপান্তরিত হয় ।

তবে এই পরীক্ষার ক্ষেত্রে ফলাফলটি বিপরীত। কোড ব্লক-1 রানে যতো তাড়াতাড়ি কোড ব্লক-2 , উভয় কোড ব্লক নিচে দেওয়া হল:

কোড ব্লক -১:

var s = '0123456789';
for (var i = 0; i < s.length; i++) {
  s.charAt(i);
}

কোড ব্লক -২:

var s = new String('0123456789');
for (var i = 0; i < s.length; i++) {
    s.charAt(i);
}

ফলাফলগুলি ব্রাউজারগুলিতে পরিবর্তিত হয় তবে কোড ব্লক -১ সর্বদা দ্রুত হয়। যে কেউ দয়া করে এটি ব্যাখ্যা করতে পারেন, কোড ব্লক -১ কোড ব্লক -২ এর চেয়ে দ্রুত কেন ।


6
ব্যবহার করে অবজেক্ট মোড়কের new Stringআরেকটি স্বচ্ছ স্তর পরিচয় করানো হয়েছে। typeof new String(); //"object"
পল এস

কি '0123456789'.charAt(i)?
ইউরি গ্যালান্টার

@ ইউরি গ্যালান্টার, এটি কোনও সমস্যা নয় তবে আমি জিজ্ঞাসা করছি কেন code block-1দ্রুত?
আলফা

2
স্ট্রিং অবজেক্টগুলি বাস্তব জীবনের প্রেক্ষাপটে দেখা অপেক্ষাকৃত বিরল, সুতরাং অনুবাদকদের পক্ষে স্ট্রিং লিটারেলগুলি অনুকূল করা অবাক হওয়ার মতো কিছু নয়। আজকাল, আপনার কোডটি কেবল ব্যাখ্যা করা যায় না, পর্দার আড়ালে অনেকগুলি অপ্টিমাইজেশন স্তর রয়েছে।
ফ্যাব্রেসিও মাট্টি

2
এটি অদ্ভুত: পুনর্বিবেচনা 2
hjpotter92

উত্তর:


149

জাভাস্ক্রিপ্টের দুটি প্রধান ধরণের বিভাগ, প্রাথমিক এবং অবজেক্ট রয়েছে।

var s = 'test';
var ss = new String('test');

একক উদ্ধৃতি / ডাবল উদ্ধৃতি নিদর্শনগুলি কার্যকারিতার দিক থেকে অভিন্ন। এদিকে, আপনি যে আচরণের নামটির চেষ্টা করছেন তার নাম অটো-বক্সিং। সুতরাং প্রকৃতপক্ষে যা ঘটে তা হ'ল র‌্যাপার প্রকারের কোনও পদ্ধতিতে অনুরোধ করা হলে একটি আদিমটিকে তার র‍্যাপার টাইপে রূপান্তর করা হয়। সরল রাখুন:

var s = 'test';

একটি আদিম ডাটা টাইপ। এটির কোনও পদ্ধতি নেই, এটি কোনও কাঁচা ডেটা মেমরি রেফারেন্সের পয়েন্টার ছাড়া আর কিছুই নয়, যা এলোমেলোভাবে অ্যাক্সেসের গতিটি আরও দ্রুত ব্যাখ্যা করে।

সুতরাং আপনি s.charAt(i)উদাহরণস্বরূপ যখন কি ঘটবে ?

যেহেতু sউদাহরণস্বরূপ নয় String, জাভাস্ক্রিপ্ট স্বয়ংক্রিয়-বাক্সটি দেবে sযা typeof stringতার মোড়কের ধরণটির Stringসাথে রয়েছে typeof objectবা আরও সুনির্দিষ্টভাবে s.valueOf(s).prototype.toString.call = [object String]

অটো-বক্সিং আচরণ sপ্রয়োজন অনুসারে তার মোড়কের ধরণটি পিছনে পিছনে ফেলে দেয় তবে আপনি একটি সহজ ডেটা ধরণের সাথে লেনদেন করার কারণে মানক ক্রিয়াকলাপগুলি অবিশ্বাস্যভাবে দ্রুত হয়। তবে অটো-বক্সিং এবং Object.prototype.valueOfবিভিন্ন প্রভাব রয়েছে।

আপনি যদি অটো-বক্সিংকে জোর করতে চান বা তার মোড়কের ধরণের কাছে কোনও আদিম কাস্ট করতে চান তবে আপনি ব্যবহার করতে পারেন Object.prototype.valueOfতবে আচরণটি আলাদা is বিভিন্ন ধরণের পরীক্ষার দৃশ্যের ভিত্তিতে অটো-বক্সিং কেবল ভেরিয়েবলের আদিম প্রকৃতি পরিবর্তন না করে কেবল 'প্রয়োজনীয়' পদ্ধতি প্রয়োগ করে। যে কারণে আপনি আরও ভাল গতি পাবেন।


33

এটি বরং বাস্তবায়ন-নির্ভর, তবে আমি একটি শট নেব। আমি ভি 8 এর উদাহরণ দিয়ে দেব তবে আমি ধরে নিই যে অন্যান্য ইঞ্জিনগুলিও একই পদ্ধতি ব্যবহার করবে।

একটি স্ট্রিং আদিম v8::Stringবস্তুতে পার্স করা হয় । সুতরাং, পদ্ধতিগুলিতে এটিতে সরাসরি আহ্বান করা যেতে পারে jfriend00 দ্বারা উল্লিখিত হিসাবে ।

অন্যদিকে, একটি স্ট্রিং অবজেক্ট একটি অংশে v8::StringObjectবিভক্ত হয় যা প্রসারিত হয় Objectএবং সম্পূর্ণ পরিচ্ছন্ন বস্তু হওয়া ছাড়াও মোড়কের কাজ করে v8::String

এখন এটি একটি কল শুধুমাত্র যৌক্তিক করার জন্য new String('').method()unbox এই হয়েছে v8::StringObject's v8::String, পদ্ধতি চালানোর আগে অত: পর এটা মন্থর।


অন্যান্য অনেক ভাষায়, আদিম মানগুলির কোনও পদ্ধতি নেই।

এমডিএন এটিকে যেভাবে বলেছে তা আদিমদের অটো-বক্সিং কীভাবে কাজ করে (যেমন flav এর উত্তরেও উল্লিখিত হয়েছে ), অর্থাৎ জাভাস্ক্রিপ্টের আদিম- y মানগুলি কীভাবে পদ্ধতিগুলি শুরু করতে পারে তা বোঝানোর সহজতম উপায় বলে মনে হয় ।

যাইহোক, একটি স্মার্ট ইঞ্জিন একটি স্ট্রিং রূপান্তর করা হবে না আদিম-Y প্রত্যেক সময় আপনি একটি পদ্ধতি ফোন করতে হবে স্ট্রিং অবজেক্ট করতে। এটি এনোটোটেটেড ইএস 5 অনুচ্ছেদে তথ্যমূলকভাবে উল্লেখ করা হয়েছে আদিম মানগুলির বৈশিষ্ট্যগুলি (এবং "পদ্ধতি" ¹) সমাধান করার ক্ষেত্রে:

দ্রষ্টব্য 1 পদক্ষেপে তৈরি হওয়া বস্তুটি উপরের পদ্ধতির বাইরে অ্যাক্সেসযোগ্য নয়। একটি বাস্তবায়ন অবজেক্টের আসল সৃষ্টি এড়াতে পছন্দ করতে পারে। [...]

খুব নিম্ন স্তরে, স্ট্রিংগুলি প্রায়শই অপরিবর্তনীয় স্কেলারের মান হিসাবে প্রয়োগ করা হয়। আবরণ কাঠামোর উদাহরণ:

StringObject > String (> ...) > char[]

আপনি আদিম থেকে যত বেশি দূরে, এটি এটি পেতে আরও বেশি সময় লাগবে। অনুশীলনে, Stringআদিমগুলি StringObjects এর চেয়ে অনেক বেশি ঘন ঘন , সুতরাং ইঞ্জিনগুলির জন্য স্ট্রিং আদিমদের সম্পর্কিত (বর্ণিত) অবজেক্টগুলির শ্রেণিতে পিছনে পিছনে পরিবর্তনের পরিবর্তে Stringএবং StringObjectএমডিএন এর ব্যাখ্যা অনুসারে পদ্ধতি যুক্ত করা অবাক হওয়ার কিছু নয় ।


Java জাভাস্ক্রিপ্টে, "পদ্ধতি" হ'ল একটি সম্পত্তি হিসাবে নামকরণের কনভেনশন যা টাইপ ফাংশনের মানকে সমাধান করে।


1
আপনাকে স্বাগতম. =]এখন আমি ভাবছি যে এমডিএন এর ব্যাখ্যা কেবল আছে কারণ এটি অটো-বক্সিং বোঝার সবচেয়ে সহজ উপায় বলে মনে হচ্ছে বা ইএস স্পেশায় এর কোনও রেফারেন্স রয়েছে কিনা তা .. চেক করার জন্য এই মুহুর্তে স্পেকটি জুড়ে পড়া মনে রাখবেন উত্তরটি আপডেট করুন যদি আমি কখনও কোনও রেফারেন্স পাই।
ফ্যাব্রিসিও ম্যাট

ভি 8 এর বাস্তবায়ন সম্পর্কে দুর্দান্ত অন্তর্দৃষ্টি। আমি যুক্ত করব যে বক্সিংটি কেবল ফাংশনটি সমাধান করার জন্য নেই। পদ্ধতিতে এই রেফারেন্সটি পাস করার জন্য এটিও রয়েছে। এখন আমি নিশ্চিত না যে ভি 8 বিল্ট-ইন পদ্ধতিগুলির জন্য এটি এড়িয়ে যায় কিনা তবে আপনি স্ট্রিং.প্রোটোটাইপ বলতে নিজের এক্সটেনশন যুক্ত করলে আপনি যখনই ডাকাবেন তখনই স্ট্রিং অবজেক্টের একটি বক্স সংস্করণ পাবেন।
বেন

17

আক্ষরিক স্ট্রিংয়ের ক্ষেত্রে আমরা বৈশিষ্ট্যগুলি বরাদ্দ করতে পারি না

var x = "hello" ;
x.y = "world";
console.log(x.y); // this will print undefined

স্ট্রিং অবজেক্টের ক্ষেত্রে আমরা সম্পত্তি নির্ধারণ করতে পারি

var x = new String("hello");
x.y = "world";
console.log(x.y); // this will print world

1
অবশেষে কেউ আমাদের কেন Stringপাশাপাশি বস্তুর প্রয়োজন তা অনুপ্রাণিত করে । ধন্যবাদ!
সিপরিয়ান টোমাইয়াজি

1
কারও কেন এটি করার প্রয়োজন হবে?
আদিত্য

11

স্ট্রিং লিটারাল:

স্ট্রিং লিটারালগুলি পরিবর্তনযোগ্য, যার অর্থ একবার তৈরি হয়ে গেলে তাদের অবস্থা পরিবর্তন করা যায় না, যা তাদের থ্রেডকেও নিরাপদ করে তোলে।

var a = 's';
var b = 's';

a==b ফলাফল উভয় স্ট্রিং রেফারেন্স একই বস্তু 'সত্য' হবে।

স্ট্রিং অবজেক্ট:

এখানে দুটি পৃথক বস্তু তৈরি করা হয়েছে এবং তাদের বিভিন্ন উল্লেখ রয়েছে:

var a = new String("s");
var b = new String("s");

a==b ফলাফল মিথ্যা হবে, কারণ তাদের বিভিন্ন উল্লেখ রয়েছে।


1
স্ট্রিং অবজেক্টটি কি অপরিবর্তনীয়?
ইয়াং ওয়াং

@YangWang একটি নিরীহ ভাষা যে, উভয়ের জন্য a& bদায়িত্ব অর্পণ করা চেষ্টা a[0] = 'X'এটা হবে সফলভাবে কার্যকর করা কিন্তু কাজ না আপনি আশা করতে পারে হিসাবে হবে
ruX

আপনি "var a = 's' লিখেছেন; var b = 's'; a == b ফলাফল উভয় স্ট্রিংয়ের একই বস্তুর রেফারেন্স 'সত্য' হবে" " এটি সঠিক নয়: ক এবং খ কোনও একই বস্তুকে উল্লেখ করবেন না, ফলাফল সত্য কারণ তাদের মান একই। এই মানগুলি বিভিন্ন মেমরি লোকেশনে সংরক্ষণ করা হয়, এজন্য আপনি যদি একে একে পরিবর্তন করেন তবে অন্য পরিবর্তন হয় না!
এসসি 1000 1000

9

আপনি যদি ব্যবহার করেন তবে আপনি newস্পষ্ট করে বলছেন যে আপনি কোনও অবজেক্টের উদাহরণ তৈরি করতে চান । অতএব, স্ট্রিং আদিমকে মোড়ানো new Stringএকটি অবজেক্ট তৈরি করছে , যার অর্থ এটিতে কোনও পদক্ষেপের অতিরিক্ত কাজের কাজ জড়িত।

typeof new String(); // "object"
typeof '';           // "string"

যেহেতু এগুলি বিভিন্ন ধরণের হয়, আপনার জাভাস্ক্রিপ্ট ইন্টারপ্রেটার তাদের আলাদা আলাদাভাবে অনুকূল করতে পারে, যেমন মন্তব্যে উল্লিখিত হয়েছে


5

আপনি যখন ঘোষণা করবেন:

var s = '0123456789';

আপনি একটি স্ট্রিং আদিম তৈরি। সেই স্ট্রিং আদিমের এমন পদ্ধতি রয়েছে যা আপনাকে আদিমকে প্রথম শ্রেণির কোনও বস্তুতে রূপান্তর না করেই তার উপর পদ্ধতিগুলি কল করতে দেয়। সুতরাং আপনার অনুমান যে এটি ধীরে ধীরে হবে কারণ স্ট্রিংটিকে কোনও অবজেক্টে রূপান্তর করতে হবে তা সঠিক নয়। এটি কোনও বস্তুতে রূপান্তর করতে হবে না। আদিম নিজেই পদ্ধতিগুলি শুরু করতে পারে।

এটিকে পূর্ণ-বিকশিত অবজেক্টে রূপান্তর করা (যা আপনাকে এতে নতুন বৈশিষ্ট্য যুক্ত করতে দেয়) এটি একটি অতিরিক্ত পদক্ষেপ এবং স্ট্রিং ওপিগ্রেশনগুলি দ্রুততর করে না (প্রকৃতপক্ষে আপনার পরীক্ষা দেখায় যে এটি তাদের ধীর করে তোলে)।


স্ট্রিং আদিম কাস্টমসগুলি সহ সমস্ত প্রোটোটাইপ বৈশিষ্ট্যকে কীভাবে উত্তরাধিকার সূত্রে আসে String.prototype?
ইউরি গ্যালান্টার

1
var s = '0123456789';একটি আদিম মান, এই মানটির কীভাবে পদ্ধতি থাকতে পারে, আমি বিভ্রান্ত!
আলফা

2
@ শিখহীরা - আদিম ভাষাগুলি প্রয়োগের ক্ষেত্রে তৈরি করা হয়েছে যাতে দোভাষী তাদের বিশেষ ক্ষমতা দিতে পারে।
jender00

1
@ শিখহীরা - আপনার শেষ মন্তব্য / প্রশ্ন আমি বুঝতে পারি না। নিজে থেকেই একটি স্ট্রিং আদিম আপনাকে এতে নিজের সম্পত্তি যুক্ত করার পক্ষে সমর্থন করে না। এটি অনুমোদনের জন্য, জাভাস্ক্রিপ্টে একটি স্ট্রিং অবজেক্ট রয়েছে যার স্ট্রিং আদিম হিসাবে একই পদ্ধতি রয়েছে তবে এটি একটি পুরোপুরি প্রসারণযোগ্য বস্তু যা আপনি সমস্ত উপায়ে কোনও বস্তুর মতো আচরণ করতে পারেন। এই দ্বৈত ফর্মটি কিছুটা অগোছালো বলে মনে হচ্ছে, তবে আমার সন্দেহ হয় যে এটি একটি পারফরম্যান্স আপস হিসাবে সম্পন্ন হয়েছিল যেহেতু 99% কেস আদিম ব্যবহার এবং তারা সম্ভবত স্ট্রিং অবজেক্টগুলির চেয়ে দ্রুত এবং আরও মেমরির দক্ষ হতে পারে।
jفر00

1
@ শিখহীরা "স্ট্রিং অবজেক্টে রূপান্তরিত হয়েছে" এমডিএন কীভাবে আদিমরা পদ্ধতিতে সাহায্য করতে সক্ষম তা বোঝাতে এটি প্রকাশ করে। তারা আক্ষরিকভাবে স্ট্রিং অবজেক্টে রূপান্তরিত হয় না।
ফ্যাব্রেসিও ম্যাট

4

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

মূলত দুজনের মধ্যে আরেকটি পার্থক্য হ'ল ইওল ব্যবহার করার সময়। eval ('1 + 1') 2 দেয়, যেখানে eval (নতুন স্ট্রিং ('1 + 1')) '1 + 1' দেয়, সুতরাং যদি কোডের কিছু নির্দিষ্ট ব্লক 'স্বাভাবিকভাবে' বা উভয়ভাবেই কার্যকর করা যায় তবে এটি হতে পারে অদ্ভুত ফলাফল হতে


আপনার ইনপুট জন্য ধন্যবাদ :-)
আলফা

বাহ, এটি কিছু অদ্ভুত আচরণ। এই আচরণটি দেখানোর জন্য আপনার মন্তব্যে আপনার একটি ছোট ইন-লাইন ডেমো যুক্ত করা উচিত - এটি চক্ষু খোলার।
আইয়ুয়েলডিকে

এটি সাধারণ, যদি আপনি এটি সম্পর্কে চিন্তা করেন। new String("")কোনও বস্তুটি ফেরত দিন, এবং কেবল স্ট্রিংকে মূল্যায়ন করুন, এবং অন্য সমস্ত কিছু যেমন রয়েছে তেমন ফিরিয়ে দিন
ফলিক্স ব্রুনেট

3

ECMAScript / জাভাস্ক্রিপ্ট ইঞ্জিনগুলিতে স্ট্রিংয়ের প্রকৃত আচরণের সাথে কোনও বস্তুর অস্তিত্বের খুব কম সম্পর্ক নেই কারণ মূল স্কোপটি কেবল এর জন্য ফাংশন অবজেক্টগুলিকে ধারণ করতে পারে। সুতরাং একটি স্ট্রিং আক্ষরিক ক্ষেত্রে charAt (int) ফাংশনটি অনুসন্ধান এবং সম্পাদন করা হবে।

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

বিটিডব্লু আমি মনে করি না যে আদিমগুলি আসলে বস্তুতে রূপান্তরিত হয় তবে স্ক্রিপ্ট ইঞ্জিনটি কেবল এই পরিবর্তনশীলটিকে স্ট্রিং টাইপ হিসাবে চিহ্নিত করবে এবং সুতরাং এটি এর জন্য সমস্ত সরবরাহিত ফাংশনগুলি খুঁজে পেতে পারে যাতে দেখে মনে হয় আপনি কোনও অবজেক্টকে ডাকছেন। ভুলে যাবেন না এটি একটি স্ক্রিপ্ট রানটাইম যা ওও রানটাইমের চেয়ে ভিন্ন নীতিতে কাজ করে।


3

স্ট্রিং আদিম এবং স্ট্রিং অবজেক্টের মধ্যে সবচেয়ে বড় পার্থক্য হ'ল অবজেক্টগুলি অপারেটরের জন্য== অবশ্যই এই নিয়মটি অনুসরণ করবে :

অবজেক্টগুলির সাথে তুলনা করার একটি অভিব্যক্তি কেবলমাত্র সত্য যদি অপারেন্ডগুলি একই অবজেক্টটির উল্লেখ করে।

সুতরাং, স্ট্রিং আদিমগুলির কাছে ==মানটির সাথে তুলনা করার মতো সুবিধাজনক রয়েছে , অন্য কোনও স্থাবর বস্তু প্রকারের (স্ট্রিং অবজেক্ট সহ) কোনও মান ধরণের মতো আচরণ করার বিষয়টি আপনার ভাগ্য থেকে দূরে।

"hello" == "hello"
-> true
new String("hello") == new String("hello") // beware!
-> false

(অন্যরা উল্লেখ করেছেন যে একটি স্ট্রিং অবজেক্ট প্রযুক্তিগতভাবে পরিবর্তনযোগ্য কারণ আপনি এতে বৈশিষ্ট্য যুক্ত করতে পারেন But তবে এটি কী জন্য দরকারী তা স্পষ্ট নয়; স্ট্রিংয়ের মানটি নিজেই পরিবর্তনযোগ্য নয়))


বেশ দীর্ঘ সময় পরে প্রশ্নের মান যোগ করার জন্য ধন্যবাদ :-)
আলফা

1

জাভাস্ক্রিপ্ট ইঞ্জিন দ্বারা চালানোর আগে কোডটি অনুকূলিত হয়েছে। সাধারণভাবে, মাইক্রো বেঞ্চমার্কগুলি বিভ্রান্তিমূলক হতে পারে কারণ সংকলক এবং দোভাষী আপনার কোডের অংশগুলিতে এটি আরও দ্রুত চালিত করতে পুনরায় সাজান, সংশোধন করতে, মুছে ফেলা এবং সম্পাদন করে। অন্য কথায়, লিখিত কোডটি লক্ষ্যটি কী তা বলে দেয় তবে সংকলক এবং / অথবা রানটাইম কীভাবে সেই লক্ষ্য অর্জন করবে তা সিদ্ধান্ত নেবে।

ব্লক 1 দ্রুত কারণ মূলত: var s = '0123456789'; var s = new স্ট্রিং ('0123456789') এর চেয়ে সর্বদা দ্রুত; কারণ বস্তু তৈরির ওভারহেড।

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

এই ধরণের মাইক্রো বেঞ্চমার্কগুলির জন্য, বাইটকোড বা মেশিন কোডের দিকে তাকানো একটি পরিষ্কার চিত্র সরবরাহ করে।


1
আপনার উত্তরের জন্য ধন্যবাদ.
আলফা

0

জাভাস্ক্রিপ্টে, আদিম ডেটা ধরণের যেমন স্ট্রিং হ'ল একটি অ-সংমিশ্রণ বিল্ডিং ব্লক। এর অর্থ হ'ল এগুলি কেবল মূল্য, আরও কিছু নয়: let a = "string value"; ডিফল্টরূপে টুআপারকেস, টুলওয়ারকেস ইত্যাদির মতো বিল্ট-ইন পদ্ধতি নেই ...

তবে, যদি আপনি লেখার চেষ্টা করেন:

console.log( a.toUpperCase() ); or console.log( a.toLowerCase() );

এটি কোনও ত্রুটি ফেলবে না, পরিবর্তে তারা তাদের যেমনটি করবে তেমন কাজ করবে।

কি হলো ? ওয়েল, যখন আপনি একটি স্ট্রিং এর একটি সম্পত্তি অ্যাক্সেস করতে চেষ্টা aকরে কোন বস্তু জাভাস্ক্রিপ্ট coerces স্ট্রিং new String(a);নামে পরিচিত মোড়কের বস্তুর

এই প্রক্রিয়াটি জাভাস্ক্রিপ্টে ফাংশন কনস্ট্রাক্টর নামে ধারণার সাথে যুক্ত , যেখানে ফাংশনগুলি নতুন অবজেক্ট তৈরি করতে ব্যবহৃত হয়।

যখন আপনি টাইপ new String('String value');এখানে স্ট্রিং ফাংশন কন্সট্রাকটর, যা একটি আর্গুমেন্ট গ্রহণ করা এবং ফাংশন সুযোগ ভিতরে একটি ফাঁকা বস্তুর সৃষ্টি, এটা খালি বস্তুর নির্ধারিত হয় এই এবং এই ক্ষেত্রে, স্ট্রিং সব ফাংশন আমরা আগে উল্লেখ করা সালে নির্মিত পরিচিত সেই সরবরাহ করে। এবং অপারেশন সম্পন্ন হওয়ার সাথে সাথে উদাহরণস্বরূপ বড় হাতের চালনা অপারেশন করুন, মোড়ক বস্তুটি ফেলে দেওয়া হবে।

এটি প্রমাণ করার জন্য, এটি করা যাক:

let justString = 'Hello From String Value';
justString.addNewProperty = 'Added New Property';
console.log( justString );

এখানে ফলাফল নির্ধারিত হবে ined কেন? এই ক্ষেত্রে জাভাস্ক্রিপ্ট মোড়ক স্ট্রিং অবজেক্ট তৈরি করে, নতুন সম্পত্তি অ্যাডনিউপ্রোপার্টি সেট করে এবং তত্ক্ষণাত মোড়ক বস্তুকে বাতিল করে দেয়। এই কারণেই আপনি অপরিশোধিত হন। সিউডো কোডটি দেখতে এমন হবে:

let justString = 'Hello From String Value';
let wrapperObject = new String( justString );
wrapperObject.addNewProperty = 'Added New Property'; //Do operation and discard

0

আমরা স্ট্রিংকে 3-উপায়ে সংজ্ঞায়িত করতে পারি

  1. var a = "প্রথম উপায়";
  2. var b = স্ট্রিং ("দ্বিতীয় উপায়");
  3. var c = নতুন স্ট্রিং ("তৃতীয় উপায়");

// এছাড়াও আমরা 4 ব্যবহার করে তৈরি করতে পারি var var d = a + '';

টাইপফো অপারেটর ব্যবহার করে তৈরি করা স্ট্রিংগুলির ধরন পরীক্ষা করুন Check

  • টাইপ করুন একটি // "স্ট্রিং"
  • typof b // "স্ট্রিং"
  • টাইপ করুন সি // "অবজেক্ট"


যখন আপনি a এবং b var এর তুলনা করেন a==b ( // yes)


আপনি স্ট্রিং অবজেক্ট তুলনা যখন

var StringObj = new String("third way")
var StringObj2 = new String("third way")
StringObj  == StringObj2 // no result will be false, because they have different references
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.