জাভাস্ক্রিপ্ট কি অপরিবর্তনীয় বা পরিবর্তনীয় স্ট্রিং ব্যবহার করে? আমার কি "স্ট্রিং বিল্ডার" দরকার?
জাভাস্ক্রিপ্ট কি অপরিবর্তনীয় বা পরিবর্তনীয় স্ট্রিং ব্যবহার করে? আমার কি "স্ট্রিং বিল্ডার" দরকার?
উত্তর:
এগুলি অপরিবর্তনীয়। আপনি স্ট্রিংয়ের মধ্যে এমন কিছু দিয়ে একটি চরিত্র পরিবর্তন করতে পারবেন না var myString = "abbdef"; myString[2] = 'c'
। যেমন স্ট্রিং ম্যানিপুলেশন পদ্ধতি trim
, slice
নতুন স্ট্রিং ফিরে যান।
একইভাবে, যদি আপনার একই স্ট্রিংয়ের দুটি উল্লেখ থাকে তবে একটি পরিবর্তন করে অন্যটির উপর প্রভাব ফেলবে না
let a = b = "hello";
a = a + " world";
// b is not affected
যাইহোক, আমি সর্বদা শুনেছি যা উত্তর তার উত্তরে উল্লেখ করেছে (যে অ্যারে.জোঁইন ব্যবহার করণীয়ের জন্য দ্রুততর) তাই আমি স্ট্রিংবিল্ডারের মধ্যে দ্রুততম উপায়টি অবিচ্ছেদী করার জন্য বিভিন্ন পদ্ধতি পরীক্ষা করতে চেয়েছিলাম। এটি সত্য কিনা তা দেখার জন্য আমি কয়েকটি পরীক্ষা লিখেছি (এটি নয়!)।
এটিই আমি বিশ্বাস করি যে এটি দ্রুততম পথ হবে, যদিও আমি ভেবেছিলাম যে কোনও মেথড কল যুক্ত করা এটি ধীর করে দেবে ...
function StringBuilder() {
this._array = [];
this._index = 0;
}
StringBuilder.prototype.append = function (str) {
this._array[this._index] = str;
this._index++;
}
StringBuilder.prototype.toString = function () {
return this._array.join('');
}
এখানে পারফরম্যান্স স্পিড টেস্ট রয়েছে। এঁরা তিনজনই "Hello diggity dog"
এক লক্ষ হাজার বার একটি খালি স্ট্রিংয়ে যুক্ত করে তৈরি একটি বিশাল স্ট্রিং তৈরি করেন ।
আমি তিন ধরণের পরীক্ষা তৈরি করেছি
Array.push
এবংArray.join
Array.push
, তারপরে ব্যবহার করাArray.join
তখন আমি তাদের মধ্যে সংক্ষেপ একই তিনটি টেস্ট নির্মিত StringBuilderConcat
, StringBuilderArrayPush
এবং StringBuilderArrayIndex
http://jsperf.com/string-concat-without-sringbuilder/5 দয়া করে সেখানে যেতে এবং চালানোর পরীক্ষা তাই আমরা একটা চমৎকার নমুনা পেতে পারেন। মনে রাখবেন যে আমি একটি ছোট ত্রুটি সংশোধন করেছি, সুতরাং পরীক্ষাগুলির ডেটা মুছে গেল, পর্যাপ্ত পারফরম্যান্সের ডেটা উপস্থিত হলে আমি টেবিলটি আপডেট করব। পুরানো ডেটা টেবিলের জন্য http://jsperf.com/string-concat-without-sringbuilder/5 এ যান ।
আপনি লিঙ্কটি অনুসরণ করতে না চাইলে এখানে কয়েকটি সংখ্যা (সর্বশেষ হালনাগাদ Ma5rch 2018) are প্রতিটি পরীক্ষার সংখ্যা 1000 অপারেশন / সেকেন্ডে হয় ( বেশি ভাল হয় )
| Browser | Index | Push | Concat | SBIndex | SBPush | SBConcat |
---------------------------------------------------------------------------
| Chrome 71.0.3578 | 988 | 1006 | 2902 | 963 | 1008 | 2902 |
| Firefox 65 | 1979 | 1902 | 2197 | 1917 | 1873 | 1953 |
| Edge | 593 | 373 | 952 | 361 | 415 | 444 |
| Exploder 11 | 655 | 532 | 761 | 537 | 567 | 387 |
| Opera 58.0.3135 | 1135 | 1200 | 4357 | 1137 | 1188 | 4294 |
ফলাফল
আজকাল, সমস্ত চিরসবুজ ব্রাউজারগুলি স্ট্রিং কনক্যাটেনশন ভালভাবে পরিচালনা করে। Array.join
শুধুমাত্র আইই 11 সাহায্য করে
সামগ্রিকভাবে, অপেরা দ্রুততম, অ্যারে.জোঁইনের চেয়ে 4 গুণ দ্রুত
ফায়ারফক্স দ্বিতীয় এবং Array.join
এফএফ-তে সামান্য ধীর তবে ক্রোমে যথেষ্ট ধীর (3x)।
ক্রোম তৃতীয় তবে স্ট্রিং কনক্যাটটি অ্যারে.জয়িনের চেয়ে 3 গুণ বেশি দ্রুত
স্ট্রিংবিল্ডার তৈরি করা পারফোমেন্সকে খুব বেশি প্রভাবিত করে না বলে মনে হচ্ছে।
আশা করি অন্য কেউ এটি দরকারী বলে মনে করেন
বিভিন্ন পরীক্ষার কেস
যেহেতু @ রয়টাইঙ্কার ভেবেছিলেন যে আমার পরীক্ষাটি ত্রুটিযুক্ত ছিল, তাই আমি একটি নতুন কেস তৈরি করেছি যা একই স্ট্রিংটিকে কাটা দিয়ে বড় স্ট্রিং তৈরি করে না, এটি প্রতিটি পুনরাবৃত্তির জন্য আলাদা চরিত্র ব্যবহার করে। স্ট্রিং কনটেনটেশন এখনও দ্রুত বা ঠিক তত দ্রুত বলে মনে হয়েছিল। আসুন সেই পরীক্ষাগুলি চালানো যাক।
আমি পরামর্শ দিচ্ছি যে প্রত্যেককে এটি পরীক্ষা করার অন্যান্য উপায় নিয়ে ভাবতে হবে এবং নীচে বিভিন্ন পরীক্ষার ক্ষেত্রে নতুন লিঙ্ক যুক্ত করতে নির্দ্বিধায় কাজ করা উচিত।
join
বনাম স্ট্রিং কনটেনটেশনের সাথে কড়া তুলনা করা , সুতরাং পরীক্ষার আগে অ্যারে তৈরি করা। আমি মনে করি না যে এই প্রতারণাটি যদি সেই লক্ষ্যটি বোঝা যায় তবে (এবং join
অভ্যন্তরীণভাবে অ্যারেটি গণনা করা হয়, সুতরাং এটি পরীক্ষা for
থেকে কোনও লুপ বাদ দিতে প্রতারণা করে না join
)।
Array.join
থেকে গণ্ডার বই :
জাভাস্ক্রিপ্টে স্ট্রিংগুলি অপরিবর্তনীয় বস্তু, যার অর্থ তাদের মধ্যে থাকা অক্ষরগুলি পরিবর্তিত হতে পারে না এবং স্ট্রিংগুলিতে যে কোনও ক্রিয়াকলাপ আসলে নতুন স্ট্রিং তৈরি করে। স্ট্রিংগুলি রেফারেন্স দ্বারা নির্ধারিত হয়, মান দ্বারা নয়। সাধারণভাবে, যখন কোনও বস্তুকে রেফারেন্স দ্বারা নির্ধারিত করা হয়, তখন একটি রেফারেন্সের মাধ্যমে অবজেক্টে করা পরিবর্তনটি বস্তুর অন্যান্য সমস্ত রেফারেন্সের মাধ্যমে দৃশ্যমান হবে। স্ট্রিংগুলি পরিবর্তন করা যায় না, তবে আপনার কাছে স্ট্রিং অবজেক্টের একাধিক উল্লেখ থাকতে পারে এবং চিন্তাই করবেন না যে স্ট্রিংয়ের মানটি আপনার না জেনে পরিবর্তিত হবে worry
null
undefined
number
এবং boolean
। Strings দ্বারা নির্ধারিত হয় মান এবং না রেফারেন্স দ্বারা এবং যেমন পাঠানো হয়। সুতরাং, স্ট্রিংগুলি কেবল অপরিবর্তনীয় নয়, তারা একটি মান । স্ট্রিং পরিবর্তন "hello"
হতে "world"
সিদ্ধান্ত এখন থেকে যে 3 নম্বর মত হলে সংখ্যা 4 ... এটা কোন অর্থে তোলে।
var a = "hello";var b=a;a.x=5;console.log(a.x,b.x);
String
স্ট্রিং কন্সট্রাকটর ব্যবহার করে তৈরি করা বস্তু চাদরে প্রায় জাভাস্ক্রিপ্ট স্ট্রিং মান। আপনি .valueOf()
ফাংশনটি ব্যবহার করে বাক্সযুক্ত ধরণের স্ট্রিং মান অ্যাক্সেস করতে পারেন - এটি Number
বস্তু এবং সংখ্যা মানগুলির ক্ষেত্রেও সত্য । এটি লক্ষ্য করা গুরুত্বপূর্ণ যে String
ব্যবহার করে তৈরি করা বস্তুগুলি new String
প্রকৃত স্ট্রিং নয় তবে স্ট্রিংগুলির চারপাশে মোড়ক বা বাক্স । Es5.github.io/#x15.5.2.1 দেখুন । আমাদের সম্পর্কে কিভাবে যে বস্তু রূপান্তর দেখতে es5.github.io/#x9.9
পারফরম্যান্স টিপ:
আপনার যদি বড় স্ট্রিংগুলি সংহত করতে হয় তবে স্ট্রিং অংশগুলিকে একটি অ্যারেতে রাখুন এবং Array.Join()
সামগ্রিক স্ট্রিংটি পেতে পদ্ধতিটি ব্যবহার করুন । এটি বৃহত সংখ্যক স্ট্রিং সংমিশ্রনের জন্য বহুগুণ দ্রুত হতে পারে।
সেখানে নেই StringBuilder
জাভাস্ক্রিপ্ট হবে।
আমার মতো সাধারণ মনের পক্ষে ( এমডিএন থেকে ) কেবল স্পষ্ট করার জন্য :
অপরিবর্তনীয় হ'ল সেই বস্তু যা একবার রাষ্ট্র তৈরি হয়ে গেলে তার অবস্থার পরিবর্তন করা যায় না।
স্ট্রিং এবং নম্বরগুলি অপরিবর্তনীয়।
অপরিবর্তনীয় মানে:
আপনি একটি ভ্যারিয়েবল নামের পয়েন্টটি একটি নতুন মানের করতে পারেন, তবে আগের মানটি এখনও মেমোরিতে রাখা আছে। তাই আবর্জনা সংগ্রহের প্রয়োজন need
var immutableString = "Hello";
// উপরের কোডে স্ট্রিংয়ের মান সহ একটি নতুন অবজেক্ট তৈরি করা হয়েছে।
immutableString = immutableString + "World";
// আমরা এখন বিদ্যমান মানের সাথে "ওয়ার্ল্ড" যুক্ত করছি।
দেখে মনে হচ্ছে আমরা 'অপরিবর্তনীয় স্ট্রিং' স্ট্রিংটি পরিবর্তন করছি তবে আমরা তা করি না। পরিবর্তে:
স্ট্রিং মান সহ "অপরিবর্তনীয় স্ট্রিং" যুক্ত করার সময়, নিম্নলিখিত ইভেন্টগুলি ঘটে:
- "অপরিবর্তনীয় স্ট্রিং" এর বিদ্যমান মান পুনরুদ্ধার করা হয়েছে
- "অপরিবর্তনীয় স্ট্রিং" এর বিদ্যমান মানটিতে "ওয়ার্ল্ড" যুক্ত করা হয়েছে
- ফলস্বরূপ মানটি মেমরির নতুন ব্লকে বরাদ্দ করা হয়
- "অপরিবর্তনীয় স্ট্রিং" অবজেক্টটি এখন নতুন নির্মিত মেমরি স্পেসকে নির্দেশ করে
- পূর্বে তৈরি মেমরির স্থান এখন আবর্জনা সংগ্রহের জন্য উপলব্ধ।
স্ট্রিং টাইপ মান পরিবর্তনযোগ্য, কিন্তু স্ট্রিং অবজেক্ট, যা স্ট্রিং () কনস্ট্রাক্টর ব্যবহার করে তৈরি করা হয়েছে তা পরিবর্তনযোগ্য, কারণ এটি একটি বস্তু এবং আপনি এতে নতুন বৈশিষ্ট্য যুক্ত করতে পারেন।
> var str = new String("test")
undefined
> str
[String: 'test']
> str.newProp = "some value"
'some value'
> str
{ [String: 'test'] newProp: 'some value' }
এদিকে, আপনি নতুন বৈশিষ্ট্য যুক্ত করতে পারলেও ইতিমধ্যে বিদ্যমান বৈশিষ্ট্যগুলি পরিবর্তন করতে পারবেন না
ক্রোম কনসোলে একটি পরীক্ষার স্ক্রিনশট
উপসংহারে, 1. সমস্ত স্ট্রিং ধরণের মান (আদিম ধরণের) অপরিবর্তনীয়। ২. স্ট্রিং অবজেক্টটি পরিবর্তনীয়, তবে এতে থাকা স্ট্রিং টাইপ মান (আদিম ধরণ) অপরিবর্তনীয়।
new String
অপরিবর্তনীয় স্ট্রিংয়ের চারপাশে একটি পরিবর্তনীয় মোড়ক তৈরি করে
String
কোনও সামগ্রীতে সম্পূর্ণ নতুন বৈশিষ্ট্য যুক্ত করতে পারেন (মোড়ক), এটি স্থাবর নয় (পূর্বনির্ধারিত; অন্য অবজেক্টের মতো আপনি Object.freeze
একে অপরিবর্তনীয় রেন্ডার করতে কল করতে পারেন )। তবে একটি আদিম স্ট্রিং মান ধরণ, কোনও String
অবজেক্ট র্যাপারে অন্তর্ভুক্ত থাকুক বা না থাকুক না কেন, সর্বদা অস্থির।
এএসপি.নেট এজাক্সের স্ট্রিংবিল্ডার সম্পর্কে আপনার প্রশ্নের বিষয়ে (অ্যাশের প্রতিক্রিয়াতে আপনার মন্তব্যে) বিশেষজ্ঞরা এ সম্পর্কে একমত নন বলে মনে করছেন।
ক্রিশ্চিয়ান ওয়েঞ্জ তার বই প্রোগ্রামিং এএসপি.নেট আজাক্স (ও'রেলি) বইয়ে বলেছেন যে "এই পদ্ধতির স্মৃতিতে কোনও পরিমাপযোগ্য প্রভাব নেই (বাস্তবে, বাস্তবায়নটি স্ট্যান্ডার্ড পদ্ধতির চেয়ে টিক ধীর বলে মনে হয়)।"
অন্যদিকে গ্যালো এট তাদের এএসপি.নেট এজ্যাক্স ইন অ্যাকশন বইয়ে বলেছেন (ম্যানিং) এ বলেছেন যে "যখন স্ট্রিং বিল্ডার সংক্ষিপ্তকরণের স্ট্রিংয়ের সংখ্যা বেশি হয়, স্ট্রিং বিল্ডার বিশাল কর্মক্ষমতা হ্রাস এড়ানোর জন্য একটি অপরিহার্য বস্তুতে পরিণত হয়।"
আমার ধারণা আপনার নিজের বেঞ্চমার্কিং করা দরকার এবং ফলাফলগুলি ব্রাউজারগুলির মধ্যেও পৃথক হতে পারে। তবে, এটি কর্মক্ষমতা উন্নত না করলেও এটি সিআর বা জাভার মতো ভাষায় স্ট্রিংবিল্ডারদের সাথে কোডিংয়ের জন্য ব্যবহৃত প্রোগ্রামারদের জন্য এখনও "দরকারী" হিসাবে বিবেচিত হতে পারে।
এটি একটি দেরী পোস্ট, তবে আমি উত্তরের মধ্যে একটি ভাল বইয়ের উদ্ধৃতি পাই না।
একটি নির্ভরযোগ্য বই ব্যতীত এখানে একটি নির্দিষ্ট:
স্ট্রিংগুলি ইসমাস্ক্রিপ্টে অপরিবর্তনীয়, এর অর্থ এটি তৈরি হয়ে গেলে তাদের মানগুলি পরিবর্তন করতে পারে না। কোনও ভেরিয়েবল দ্বারা আটকানো স্ট্রিংটি পরিবর্তন করতে, মূল স্ট্রিংটি অবশ্যই ধ্বংস করতে হবে এবং ভেরিয়েবলটি নতুন মান সহ অন্য স্ট্রিংতে ভরা উচিত ... Web ওয়েব বিকাশকারীদের জন্য পেশাদার জাভাস্ক্রিপ্ট, তৃতীয় এড।, পি .৪3
এখন, গণ্ডার বইয়ের উদ্ধৃতিটি যে উত্তরটি উদ্ধৃত করেছে তা স্ট্রিং অপরিবর্তনীয়তা সম্পর্কে সঠিক তবে "স্ট্রিংসকে মূল্য দিয়ে নয়, রেফারেন্স দ্বারা বরাদ্দ করা হয়েছে।" (সম্ভবত এগুলি শব্দটির বিপরীত উপায়ে বোঝাতে চেয়েছিল)।
"প্রফেশনাল জাভাস্ক্রিপ্ট", "আদিম এবং রেফারেন্স মানগুলি" নামে অধ্যায়টিতে "রেফারেন্স / মান" ভুল ধারণাটি স্পষ্ট করা হয়েছে:
পাঁচটি আদিম ধরণের ... [হ'ল: অপরিজ্ঞাত, নাল, বুলিয়ান, সংখ্যা এবং স্ট্রিং। এই ভেরিয়েবলগুলি মান দ্বারা অ্যাক্সেস করা হয় বলা হয়, কারণ আপনি ভেরিয়েবলে সঞ্চিত প্রকৃত মানটি হেরফের করছেন। Web ওয়েব বিকাশকারীদের জন্য পেশাদার জাভাস্ক্রিপ্ট, তৃতীয় সংস্করণ, পি .85
এটি বস্তুর বিরোধী :
আপনি যখন কোনও বস্তু পরিচালনা করেন, আপনি সত্যিকারের বস্তুর পরিবর্তে object অবজেক্টের কোনও রেফারেন্সে কাজ করছেন working এই কারণে, এই জাতীয় মানগুলি রেফারেন্সের মাধ্যমে অ্যাক্সেস করা হবে বলে জানা যায়। Web ওয়েব বিকাশকারীদের জন্য পেশাদার জাভাস্ক্রিপ্ট, তৃতীয় সংস্করণ, পি .85
জাভাস্ক্রিপ্ট স্ট্রিং প্রকৃতপক্ষে পরিবর্তনযোগ্য।
জাভাস্ক্রিপ্টের স্ট্রিংগুলি পরিবর্তনযোগ্য