مقدمه
رشته ها برای نگهداری داده هایی که می توانند به صورت متن نمایش داده شوند مفید هستند. برخی از پرکاربردترین عملیات روی رشته ها، بررسی طول آنها، ساختن و به هم پیوستن آنها با استفاده از عملگرهای رشته + و +=، بررسی وجود یا مکان زیر رشته ها با متد indexOf() یا استخراج زیر رشته ها با رشته فرعی است. () روش.
ایجاد رشته ها
رشته ها را می توان به صورت اولیه، از لفظ رشته، یا به عنوان اشیاء با استفاده از سازنده String() ایجاد کرد:
const string1 = "A string primitive";
const string2 = 'Also a string primitive';
const string3 = `Yet another string primitive`;
const string4 = new String("A String object");
رشتههای اولیه و اشیاء رشتهای رفتارهای مشترک زیادی دارند، اما تفاوتها و اخطارهای مهم دیگری نیز دارند. “String primitives and String objects” را در زیر ببینید.
حرف های رشته ای را می توان با استفاده از گیومه های تک یا دوتایی که به طور یکسان رفتار می شوند یا با استفاده از کاراکتر بک تیک ` مشخص کرد. این فرم آخر یک الگوی واقعی را مشخص می کند: با این فرم می توانید عبارات را درون یابی کنید. برای اطلاعات بیشتر در مورد نحو لفظ رشته ای، به دستور واژگانی مراجعه کنید.
دسترسی به کاراکتر
دو راه برای دسترسی به یک کاراکتر در یک رشته وجود دارد. روش اول متد ()charAt است:
"cat".charAt(1); // gives value "a"
راه دیگر این است که رشته را به عنوان یک شی آرایه مانند در نظر بگیریم، جایی که کاراکترهای جداگانه با یک شاخص عددی مطابقت دارند:
"cat"[1]; // gives value "a"
هنگام استفاده از نماد براکت برای دسترسی به کاراکتر، تلاش برای حذف یا اختصاص یک مقدار به این ویژگی ها موفق نخواهد بود. ویژگی های درگیر نه قابل نوشتن هستند و نه قابل تنظیم. (برای اطلاعات بیشتر به Object.defineProperty() مراجعه کنید.)
مقایسه رشته ها
برای مقایسه رشته ها از عملگرهای کمتر و بزرگتر استفاده کنید:
const a = "a";
const b = "b";
if (a < b) {
// true
console.log(`${a} is less than ${b}`);
} else if (a > b) {
console.log(`${a} is greater than ${b}`);
} else {
console.log(`${a} and ${b} are equal.`);
}
توجه داشته باشید که تمام عملگرهای مقایسه، از جمله === و ==، رشته ها را به حروف بزرگ و کوچک مقایسه می کنند. یک راه متداول برای مقایسه رشتهها با حروف بزرگ و کوچک، تبدیل هر دو به یک حروف (بالا یا پایین) قبل از مقایسه آنهاست.
function areEqualCaseInsensitive(str1, str2) {
return str1.toUpperCase() === str2.toUpperCase();
}
انتخاب تبدیل با ()toUpperCase یا toLowerCase() عمدتاً دلخواه است، و هیچ کدام از آنها در هنگام گسترش فراتر از الفبای لاتین کاملاً قوی نیستند. به عنوان مثال، حروف کوچک آلمانی ß و ss هر دو توسط toUpperCase() به SS تبدیل میشوند، در حالی که حرف ترکی ı به اشتباه به عنوان نامساوی با I توسط toLowerCase() گزارش میشود، مگر اینکه به طور خاص از toLocaleLowerCase (“tr”) استفاده شود.
const areEqualInUpperCase = (str1, str2) =>
str1.toUpperCase() === str2.toUpperCase();
const areEqualInLowerCase = (str1, str2) =>
str1.toLowerCase() === str2.toLowerCase();
areEqualInUpperCase("ß", "ss"); // true; should be false
areEqualInLowerCase("ı", "I"); // false; should be true
یک راه حل منطقی و قوی برای آزمایش برابری غیر حساس به حروف بزرگ، استفاده از API Intl.Collator یا متد ()localeCompare رشته است – آنها رابط یکسانی دارند – با گزینه حساسیت روی “لهجه” یا “پایه” تنظیم شده است.
const areEqual = (str1, str2, locale = "en-US") =>
str1.localeCompare(str2, locale, { sensitivity: "accent" }) === 0;
areEqual("ß", "ss", "de"); // false
areEqual("ı", "I", "tr"); // true
متد localeCompare () مقایسه رشتهها را به روشی مشابه strcmp() امکانپذیر میسازد – این امکان مرتبسازی رشتهها را به شیوهای آگاه از منطقه فراهم میکند.
رشته های اولیه و اشیاء رشته
توجه داشته باشید که جاوا اسکریپت بین اشیاء رشته و مقادیر رشته های اولیه تمایز قائل می شود. (این در مورد Boolean و Numbers نیز صادق است.)
لفظ های رشته ای (که با گیومه های دوتایی یا تکی مشخص می شوند) و رشته هایی که از فراخوانی های رشته در یک زمینه غیر سازنده (یعنی بدون استفاده از کلمه کلیدی جدید فراخوانی می شوند) بازگردانده شده اند، رشته های ابتدایی هستند. در زمینههایی که قرار است یک متد بر روی یک رشته اولیه فراخوانی شود یا جستجوی ویژگی رخ دهد، جاوا اسکریپت بهطور خودکار رشته اولیه را پیچیده میکند و متد را فراخوانی میکند یا به جای آن جستجوی ویژگی را روی شی wrapper انجام میدهد.
const strPrim = "foo"; // A literal is a string primitive
const strPrim2 = String(1); // Coerced into the string primitive "1"
const strPrim3 = String(true); // Coerced into the string primitive "true"
const strObj = new String(strPrim); // String with new returns a string wrapper object.
console.log(typeof strPrim); // "string"
console.log(typeof strPrim2); // "string"
console.log(typeof strPrim3); // "string"
console.log(typeof strObj); // "object
رشته های ابتدایی و اشیاء رشته نیز نتایج متفاوتی را هنگام استفاده از eval() ارائه می دهند. بدوی ارسال شده به eval به عنوان کد منبع تلقی می شود. با برگرداندن شی، با اشیاء رشته ای مانند سایر اشیاء رفتار می شود. مثلا:
const s1 = "2 + 2"; // creates a string primitive
const s2 = new String("2 + 2"); // creates a String object
console.log(eval(s1)); // returns the number 4
console.log(eval(s2)); // returns the string "2 + 2"
به این دلایل، کد ممکن است زمانی که با اشیاء رشتهای مواجه میشود شکسته شود، در حالی که به جای آن انتظار یک رشته ابتدایی را دارد، اگرچه به طور کلی، نویسندگان نیازی به نگرانی در مورد تمایز ندارند.
یک شی String همیشه می تواند با متد valueOf() به همتای اولیه خود تبدیل شود.
console.log(eval(s2.valueOf())); // returns the number 4
اجبار رشته
بسیاری از عملیات داخلی که انتظار رشتهها را دارند، ابتدا آرگومانهای خود را به رشتهها تحمیل میکنند (به همین دلیل است که اشیاء String شبیه به رشتههای اولیه رفتار میکنند). عملیات را می توان به صورت زیر خلاصه کرد:
- رشته ها همانطور که هست برگردانده می شوند.
- تعریف نشده تبدیل به “نامشخص” می شود.
- null به “تهی” تبدیل می شود.
- واقعی به “واقعی” تبدیل می شود. نادرست به “کاذب” تبدیل می شود.
- اعداد با همان الگوریتم toString (10) تبدیل می شوند.
- BigInts با همان الگوریتم toString (10) تبدیل می شوند.
- نمادها یک TypeError ایجاد می کنند.
- اشیاء ابتدا با فراخوانی متدهای [Symbol.toPrimitive]() (با “string” به عنوان راهنمایی)، toString() و valueOf() به ترتیب به یک اولیه تبدیل می شوند. سپس اولیه به دست آمده به یک رشته تبدیل می شود.
راه های مختلفی برای دستیابی به تأثیر تقریباً یکسان در جاوا اسکریپت وجود دارد.
- به معنای واقعی کلمه: `${x}` دقیقاً مراحل اجباری رشته را که در بالا برای عبارت تعبیه شده توضیح داده شد انجام می دهد.
- تابع String(): String(x) از همان الگوریتم برای تبدیل x استفاده میکند، با این تفاوت که Symbols یک TypeError ایجاد نمیکند، اما “Symbol(description)” را برمیگرداند، که در آن توضیحات شرح نماد است.
- با استفاده از عملگر +: “” + x عملوند خود را به جای یک رشته به یک ابتدایی وادار می کند، و برای برخی از اشیا، رفتارهای کاملاً متفاوتی با اجبار رشته معمولی دارد. برای جزئیات بیشتر به صفحه مرجع آن مراجعه کنید.
بسته به مورد استفاده شما، ممکن است بخواهید از `${x}` (برای تقلید رفتار داخلی) یا String(x) (برای مدیریت مقادیر نمادها بدون ایجاد خطا) استفاده کنید، اما نباید از “” + x استفاده کنید. .
نویسههای UTF-16، نقاط کد یونیکد و خوشههای گرافیم
رشته ها اساساً به عنوان دنباله ای از واحدهای کد UTF-16 نشان داده می شوند. در رمزگذاری UTF-16، هر واحد کد دقیقاً 16 بیت طول دارد. این بدان معناست که حداکثر 216 یا 65536 کاراکتر ممکن به عنوان واحد کد UTF-16 منفرد وجود دارد. این مجموعه نویسهها صفحه چندزبانه اصلی (BMP) نامیده میشود و شامل رایجترین نویسهها مانند الفبای لاتین، یونانی، سیریلیک و همچنین بسیاری از نویسههای آسیای شرقی است. هر واحد کد را می توان در یک رشته با \u و به دنبال آن دقیقاً چهار رقم هگز نوشت.
با این حال، کل مجموعه کاراکترهای یونیکد بسیار بسیار بزرگتر از 65536 است. کاراکترهای اضافی در UTF-16 به عنوان جفت جایگزین ذخیره می شوند، که جفت واحدهای کد 16 بیتی هستند که یک کاراکتر واحد را نشان می دهند. برای جلوگیری از ابهام، دو قسمت جفت باید بین 0xD800 و 0xDFFF باشند و این واحدهای کد برای رمزگذاری کاراکترهای تک کد واحد استفاده نمی شوند. (به طور دقیقتر، جانشینهای پیشرو، که واحدهای کد جایگزین بالا نیز نامیده میشوند، دارای مقادیری بین 0xD800 و 0xDBFF هستند، در حالی که جانشینهای بعدی، که واحدهای کد جایگزین پایین نیز نامیده میشوند، دارای مقادیری بین 0xDC00 و 0xDFFF، شامل کاراکتر Unic هستند.) که از یک یا دو واحد کد UTF-16 تشکیل شده است، نقطه کد یونیکد نیز نامیده می شود. هر نقطه کد یونیکد را می توان در یک رشته با \u{xxxxxx} نوشت که xxxxxx نشان دهنده 1 تا 6 رقم هگزاست.
یک “جانشین تنها” یک واحد کد 16 بیتی است که یکی از توضیحات زیر را برآورده می کند:
- در محدوده 0xD800–0xDBFF، شامل (یعنی جانشین پیشرو است)، اما آخرین واحد کد در رشته است، یا واحد کد بعدی یک جانشین آخر نیست.
- در محدوده 0xDC00–0xDFFF، شامل (یعنی یک جانشین آخر است)، اما اولین واحد کد در رشته است، یا واحد کد قبلی جانشین اصلی نیست.
جانشین های تنها نشان دهنده هیچ شخصیت یونیکد نیستند. اگرچه اکثر روشهای جاوا اسکریپت داخلی آنها را به درستی مدیریت میکنند، زیرا همه آنها بر اساس واحدهای کد UTF-16 کار میکنند، جایگزینهای تنها هنگام تعامل با سیستمهای دیگر معمولاً مقادیر معتبری نیستند – به عنوان مثال، encodeURI() یک خطای URIE را برای جایگزینهای تنها ایجاد میکند، زیرا رمزگذاری URI از رمزگذاری UTF-8 استفاده می کند که هیچ کدگذاری برای جانشینان تنها ندارد. رشتههایی که حاوی هیچ جانشین تکی نیستند، رشتههای خوششکلی نامیده میشوند و برای استفاده با توابعی که با UTF-16 سروکار ندارند (مانند encodeURI() یا TextEncoder، بیخطر هستند. میتوانید بررسی کنید که آیا رشتهای با متد isWellFormed() به خوبی شکل گرفته است یا اینکه جایگزینهای تنها را با متد toWellFormed() پاکسازی کنید.
در بالای کاراکترهای یونیکد، توالی خاصی از کاراکترهای یونیکد وجود دارد که باید به عنوان یک واحد بصری در نظر گرفته شوند، که به عنوان خوشه گرافی شناخته می شود. رایجترین مورد، شکلکها هستند: بسیاری از شکلکها که دارای طیف وسیعی از تغییرات هستند، در واقع توسط ایموجیهای متعددی تشکیل میشوند که معمولاً با کاراکتر <ZWJ> (U+200D) به هم میپیوندند.
شما باید مراقب باشید که در کدام سطح از شخصیت ها تکرار می کنید. به عنوان مثال، split(“”) توسط واحدهای کد UTF-16 تقسیم می شود و جفت های جایگزین را از هم جدا می کند. شاخصهای رشتهای نیز به شاخص هر واحد کد UTF-16 اشاره دارد. از سوی دیگر، [Symbol.iterator]() توسط نقاط کد یونیکد تکرار می شود. تکرار از طریق خوشههای grapheme به کد سفارشی نیاز دارد.
"😄".split(""); // ['\ud83d', '\ude04']; splits into two lone surrogates
// "Backhand Index Pointing Right: Dark Skin Tone"
[..."👉🏿"]; // ['👉', '🏿']
// splits into the basic "Backhand Index Pointing Right" emoji and
// the "Dark skin tone" emoji
// "Family: Man, Boy"
[..."👨👦"]; // [ '👨', '', '👦' ]
// splits into the "Man" and "Boy" emoji, joined by a ZWJ
// The United Nations flag
[..."🇺🇳"]; // [ '🇺', '🇳' ]
// splits into two "region indicator" letters "U" and "N".
// All flag emojis are formed by joining two region indicator letters
Constractor
رشته ()
اشیاء رشته ای را ایجاد می کند. هنگامی که به عنوان یک تابع فراخوانی می شود، مقادیر اولیه از نوع String را برمی گرداند.
روش های استاتیک
String.fromCharCode()
رشته ای را که با استفاده از توالی مشخص شده از مقادیر یونیکد ایجاد شده است، برمی گرداند.
String.fromCodePoint()
یک رشته ایجاد شده با استفاده از دنباله مشخص شده از نقاط کد را برمی گرداند.
String.raw()
یک رشته ایجاد شده از یک رشته الگوی خام را برمی گرداند.
خواص نمونه
این ویژگی ها در String.prototype تعریف شده و توسط تمام نمونه های String به اشتراک گذاشته شده است.
String.prototype.constructor
تابع سازنده که شی نمونه را ایجاد می کند. برای نمونه های رشته، مقدار اولیه سازنده رشته است.
این ویژگی ها ویژگی های خاص هر نمونه رشته هستند.
lenght
طول رشته را منعکس می کند. فقط خواندنی.
روش های نمونه
String.prototype.at()
کاراکتر (دقیقاً یک واحد کد UTF-16) را در نمایه مشخص شده برمیگرداند. اعداد صحیح منفی را می پذیرد که از آخرین کاراکتر رشته به عقب می شمارند.
String.prototype.charAt()
کاراکتر (دقیقاً یک واحد کد UTF-16) را در نمایه مشخص شده برمیگرداند.
String.prototype.charCodeAt()
عددی را برمیگرداند که مقدار واحد کد UTF-16 در شاخص داده شده است.
String.prototype.codePointAt()
یک عدد صحیح غیرمنفی را برمیگرداند که مقدار نقطه کد نقطه کد کدگذاری شده UTF-16 است که از پوز مشخص شده شروع میشود.
String.prototype.concat()
متن دو (یا چند) رشته را ترکیب می کند و یک رشته جدید برمی گرداند.
String.prototype.endsWith()
تعیین می کند که آیا یک رشته به کاراکترهای رشته searchString ختم می شود یا خیر.
String.prototype.includes()
تعیین می کند که آیا رشته فراخوان حاوی SearchString است یا خیر.
String.prototype.indexOf()
ایندکس را در این رشته از اولین رخداد searchValue یا -1 در صورت یافت نشدن برمیگرداند.
String.prototype.isWellFormed()
یک بولی را برمیگرداند که نشان میدهد آیا این رشته دارای جایگزینهای تکی است یا خیر.
String.prototype.lastIndexOf()
ایندکس را در این رشته از آخرین رخداد searchValue یا -1 در صورت یافت نشدن برمیگرداند.
String.prototype.localeCompare()
عددی را برمیگرداند که نشان میدهد آیا رشته مرجع compareString به ترتیب مرتبسازی قبل، بعد یا معادل رشته داده شده است.
String.prototype.match()
برای تطبیق عبارت منظم regexp در برابر یک رشته استفاده می شود.
String.prototype.matchAll()
یک تکرار کننده از همه مطابقت های regexp را برمی گرداند.
String.prototype.normalize()
فرم عادی سازی یونیکد مقدار رشته فراخوان را برمی گرداند.
String.prototype.padEnd()
رشته فعلی را از انتها با یک رشته مشخص میکند و یک رشته جدید به طول targetLength را برمیگرداند.
String.prototype.padStart()
رشته فعلی را از ابتدا با یک رشته داده شده پد می کند و یک رشته جدید به طول targetLength را برمی گرداند.
String.prototype.repeat()
رشته ای متشکل از عناصر شیء را که بارها شمارش شده است برمی گرداند.
String.prototype.replace()
برای جایگزینی موارد SearchFor با استفاده از replaceWith استفاده می شود. searchFor ممکن است یک رشته یا عبارت منظم باشد، و replaceWith ممکن است یک رشته یا تابع باشد.
String.prototype.replaceAll()
برای جایگزینی همه موارد SearchFor با استفاده از replaceWith استفاده می شود. searchFor ممکن است یک رشته یا عبارت منظم باشد، و replaceWith ممکن است یک رشته یا تابع باشد.
String.prototype.search()
برای تطابق بین یک عبارت منظم regexp و رشته فراخوان جستجو کنید.
String.prototype.slice()
بخشی از یک رشته را استخراج می کند و یک رشته جدید را برمی گرداند.
String.prototype.split()
آرایه ای از رشته ها را برمی گرداند که با تقسیم رشته فراخوان در موارد زیر رشته sep پر شده اند.
String.prototype.startsWith()
تعیین می کند که آیا رشته فراخوان با کاراکترهای رشته searchString شروع می شود یا خیر.
String.prototype.substr() منسوخ شده است
بخشی از رشته را برمیگرداند که از شاخص مشخص شده شروع میشود و پس از آن برای تعداد معینی از کاراکترها گسترش مییابد.
String.prototype.substring()
یک رشته جدید حاوی کاراکترهای رشته فراخوان از (یا بین) ایندکس (یا شاخص) مشخص شده را برمی گرداند.
String.prototype.toLocaleLowerCase()
کاراکترهای درون یک رشته در حالی که به محلی فعلی احترام می گذارند به حروف کوچک تبدیل می شوند.
برای اکثر زبانها، این همان حالت ()toLowerCase را برمیگرداند.
String.prototype.toLocaleUpperCase()
کاراکترهای درون یک رشته در حالی که به محلی فعلی احترام می گذارند به حروف بزرگ تبدیل می شوند.
برای اکثر زبانها، این همان حالت ()toUpperCase را برمیگرداند.
String.prototype.toLowerCase()
مقدار رشته فراخوان تبدیل شده به حروف کوچک را برمی گرداند.
String.prototype.toString()
رشته ای را برمی گرداند که نشان دهنده شی مشخص شده است. روش Object.prototype.toString() را لغو می کند.
String.prototype.toUpperCase()
مقدار رشته فراخوان تبدیل شده به حروف بزرگ را برمی گرداند.
String.prototype.toWellFormed()
رشتهای را برمیگرداند که در آن همه جانشینهای تنها این رشته با کاراکتر جایگزین یونیکد U+FFFD جایگزین میشوند.
String.prototype.trim()
فضای خالی را از ابتدا و انتهای رشته برش می دهد.
String.prototype.trimEnd()
فضای خالی انتهای رشته را برش می دهد.
String.prototype.trimStart()
فضای خالی را از ابتدای رشته برش می دهد.
String.prototype.valueOf()
مقدار اولیه شی مشخص شده را برمی گرداند. روش Object.prototype.valueOf() را لغو می کند.
String.prototype[Symbol.iterator]()
یک شی تکرار کننده جدید را برمی گرداند که روی نقاط کد یک مقدار رشته تکرار می شود و هر نقطه کد را به عنوان مقدار رشته برمی گرداند.