String: length
Властивість даних значень String
length
(довжина) містить довжину рядка в кодових одиницях UTF-16.
Спробуйте його в дії
Значення
Невід'ємне ціле число.
Атрибути властивості String: length |
|
---|---|
Записна | ні |
Перелічувана | ні |
Налаштовна | ні |
Опис
Ця властивість повертає число кодових одиниць у рядку. JavaScript використовує кодування UTF-16, згідно з яким кожен символ Unicode може бути закодований у вигляді однієї або двох кодових одиниць, тож може статись таке, що значення, повернене length
, не збігатиметься з фактичним числом символів Unicode у ряду. Для поширених систем письма штибу латиниці, кирилиці, загальновідомих китайських, японських і корейських символів тощо це не повинно бути проблемою, але при роботі з певними писемностями, як то емоджі, математичними символами або маловідомими китайськими символами, може знадобитись враховування різниці між кодовими одиницями та символами.
Специфікація мови вимагає, аби рядки мали найбільшу можливу довжину 253 - 1 елементів, що дорівнює верхній межі точних цілих чисел. Проте рядок з такою довжиною потребує 16384 ТіБ місця, а це не вміститься в жодну доцільну пам'ять пристрою, тож реалізації мають тенденцію до заниження цього порогу, так, щоб довжину рядка можна було зручно зберігати як 32-бітове ціле число.
- У V8 (що використовується в Chrome і Node) найбільша можлива довжина – 229 - 24 (~1GiB). На 32-бітових системах найбільша можлива довжина – 228 - 16 (~512MiB).
- У Firefox найбільша можлива довжина – 230 - 2 (~2GiB). До Firefox 65 ця межа дорівнювала 228 - 1 (~512MiB).
- У Safari найбільша можлива довжина – 231 - 1 (~4GiB).
При роботі з великими рядками в інших кодуваннях (наприклад, файлами або згустками у кодуванні UTF-8) слід пам'ятати, що при завантаженні даних у рядок JS кодуванням завжди стає UTF-16. Розмір рядка може відрізнятися від розміру вихідного файлу.
const str1 = "a".repeat(2 ** 29 - 24); // Успіх
const str2 = "a".repeat(2 ** 29 - 23); // RangeError: Invalid string length
const buffer = new Uint8Array(2 ** 29 - 24).fill("a".codePointAt(0)); // Цей буфер має розмір 512МіБ
const str = new TextDecoder().decode(buffer); // Цей рядок має розмір 1ГіБ
В порожнього рядка довжина length
дорівнює 0.
Статична властивість String.length
не має жодного відношення до довжин рядків. Це арність функції String
(в широкому розумінні — число формальних аргументів функції), яка дорівнює 1.
Оскільки довжина length
рахує кодові одиниці, а не символи, то якщо необхідно отримати саме кількість символів, можна спершу розбити рядок за допомогою його ітератора, що працює за символами:
function getCharacterLength(str) {
// Ітератор рядка, який вжито тут, перебирає саме окремі символи,
// а не лише кодові одиниці
return [...str].length;
}
console.log(getCharacterLength("А\uD87E\uDC04Я")); // 3
За потреби порахувати символи за графемними кластерами скористайтесь Intl.Segmenter
. Можна спершу передати рядок, який необхідно розбити, до методу segment()
, а тоді ітерувати по поверненому об'єкту Segments
, щоб отримати довжину:
function getGraphemeCount(str) {
const segmenter = new Intl.Segmenter("en-US", { granularity: "grapheme" });
// Об'єкт-ітератор Segments, який вжито тут, ітерує по символах у вигляді графемних кластерів,
// кожен з яких може складатися з кількох символів Unicode
return [...segmenter.segment(str)].length;
}
console.log(getGraphemeCount("👨👩👧👧")); // 1
Приклади
Базове застосування
const x = "Mozilla";
const empty = "";
console.log(`${x} має довжину ${x.length} кодових одиниць`);
// "Mozilla має довжину 7 кодових одиниць"
console.log(`Порожній рядок має довжину ${empty.length}`);
// Порожній рядок має довжину 0
Рядки з довжиною, що не дорівнює кількості символів
const emoji = "😄";
console.log(emoji.length); // 2
console.log([...emoji].length); // 1
const adlam = "𞤲𞥋𞤣𞤫";
console.log(adlam.length); // 8
console.log([...adlam].length); // 4
const formula = "∀𝑥∈ℝ,𝑥²≥0";
console.log(formula.length); // 11
console.log([...formula].length); // 9
Присвоєння значення властивості довжини
У зв'язку з тим, що рядки є примітивами, спроба присвоїти значення властивості рядка length
не дасть жодного помітного ефекту, а в суворому режимі – викине помилку.
const myString = "дзвоники";
myString.length = 4;
console.log(myString); // "дзвоники"
console.log(myString.length); // 8
Специфікації
Специфікація |
---|
ECMAScript Language Specification (ECMAScript) # sec-properties-of-string-instances-length |
Сумісність із браузерами
desktop | mobile | server | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
length
|
Chrome Full support 1 | Edge Full support 12 | Firefox Full support 1 | Internet Explorer Full support 3 | Opera Full support 3 | Safari Full support 1 | WebView Android Full support 1 | Chrome Android Full support 18 | Firefox for Android Full support 4 | Opera Android Full support 10.1 | Safari on iOS Full support 1 | Samsung Internet Full support 1.0 | Deno Full support 1.0 | Node.js Full support 0.10.0 |