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

Специфікації

Сумісність із браузерами

desktop mobile server
Chrome Edge Firefox Internet Explorer Opera Safari WebView Android Chrome Android Firefox for Android Opera Android Safari on iOS Samsung Internet Deno Node.js
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

Дивіться також