javascriptString indexing and lengthاندیس و طول رشته در جاوااسکریپت
اندیس و length رشته در جاوااسکریپت را دقیق بخوانید؛ شروع از صفر، نویسهٔ گریز و تفاوت طول UTF-16 با نشانهٔ قابل مشاهده را در مثال ببینید.
مفهوم به زبان ساده
برای خواندن بخشی کوچک از متن، میتوان از اندیس استفاده کرد. اندیس نخست صفر است و text[0] نخستین واحد متنی را میخواند. length طول رشته را برحسب واحدهای UTF-16 میدهد؛ این تعداد برای همهٔ متنها با شمار نشانههای قابل مشاهده یکی نیست. ایموجیها، علامتهای ترکیبی و بعضی نویسهها این تفاوت را آشکار میکنند.
در مثال، نام سادهٔ لاتین چهار واحد دارد. بیرون از محدوده، دسترسی براکتی undefined میدهد؛ charAt در همان موقعیت رشتهٔ خالی میدهد. رشته تغییرناپذیر است و انتساب به خانهٔ آن راه ویرایش متن نیست؛ برای تغییر، رشتهٔ تازه بسازید. نویسهٔ گریز مانند \n هم در متن کد با چند نویسه نوشته میشود، ولی میتواند یک خط جدید در مقدار رشته ایجاد کند.
دربارهٔ متن فارسی نیز فقط ظاهر را ملاک نگیرید؛ نیمفاصله و اعراب جزئی از دادهاند. برای شمردن نشانههای دیدهشده یا بریدن متن کاربر، روش متناسب با Unicode لازم است و length بهتنهایی کافی نیست. در این سطح، نخست فرق متن نوشتهشدهٔ کد، مقدار واقعی رشته و روش شمارش آن را درک کنید؛ سپس برای محدودیت عنوان، واحد مورد نظر را صریح تعریف کنید.
کجا به کار میآید؟
- خواندن ابتدای متن و تشخیص رسیدن به بیرون محدوده
- تعیین محدودیت طول با شناخت واحد شمارش و متن Unicode
از تعریف تا یک مثال واقعی
const word = 'book';
console.log(word.length);
console.log(word[0]);
console.log(word[4]);
console.log(word.charAt(4) === '');
console.log('😀'.length);
console.log('A\nB'.length);
4 b undefined true 2 3
این مثال چطور کار میکند؟
word چهار واحد دارد و اندیس صفر حرف b را میدهد.
اندیس چهار بیرون متن است؛ براکت و charAt خروجی یکسان ندارند.
ایموجی نمونه دو واحد UTF-16 و رشتهٔ دارای خط جدید سه واحد دارد.
اشتباه رایج
length را شمار بیخطای حروف دیدهشدهٔ کاربر ندانید. بریدن بر اساس اندیس ممکن است بخشی از یک نشانهٔ چندواحدی را جدا کند.
این را به خاطر بسپارید
اندیس از صفر شروع میشود و length واحدهای UTF-16 را میشمارد؛ معنای «حرف» در رابط باید جدا مشخص شود.