String: length

Baseline Widely available

This feature is well established and works across many devices and browser versions. It’s been available across browsers since July 2015.

length データプロパティは、String オブジェクトの文字列長を UTF-16 コード単位の数で表します。

試してみましょう

非負の整数です。

String: length のプロパティ属性
書込可能不可
列挙可能不可
設定可能不可

解説

このプロパティは、文字列内のコード単位の数を返します。JavaScript では UTF-16 エンコーディングを使用しており、すべての Unicode 文字が 1 つまたは 2 つのコード単位にエンコードされるため、length で返される値は文字列の実際の Unicode 文字数に一致しない可能性があります。よく使われるラテン、キリル、有名な漢字などはこのような問題にはなりませんが、絵文字、数学記号、難しい漢字などのような特定の文字体系では、length で返される値が文字列の実際の文字数と一致しなくなる可能性があるので、コード単位数と文字数の違いを考慮する必要があるかもしれません。

言語の仕様書では、文字列の最大長が 253 - 1 要素と制定されており、これは正確に表せる整数の上限となっています。しかし、この長さの文字列は 16,384TiB のストレージを必要とし、これは一般的な機器のメモリーに収まらないため、実装上はもっと低い閾値を設けている傾向があり、文字列の長さを便宜上 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 のファイルや blob) の巨大な文字列を扱っている場合は、データを JavaScript の文字列にロードすると、エンコーディングは常に UTF-16 になることに注意してください。文字列のサイズはもとのファイルのサイズと異なる可能性があります。

js
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)); // このバッファーのサイズは 512MiB
const str = new TextDecoder().decode(buffer); // この文字列のサイズは 1GiB

空文字列の場合、length は 0 になります。

静的プロパティの String.length は文字列の長さとは関係なく、 String 関数のアリティ(簡単に言えば、それが持つ形式的な引数の数)であり、1 です。

length は文字数ではなくコード単位で数えるため、文字数を取得したい場合は、まず文字列をイテレーターで分割し、文字ごとに反復処理をしてください。

js
function getCharacterLength(str) {
  // ここで使用する文字列イテレーターは、単なるコード単位ではなく、
  // 文字を反復処理します。
  return [...str].length;
}

console.log(getCharacterLength("A\uD87E\uDC04Z")); // 3

書記素単位でカウントしたい場合は、 Intl.Segmenter を使用してください。まず、分割したい文字列を segment() メソッドに渡し、返された Segments オブジェクトを反復処理をして長さを取得してください。

js
function getGraphemeCount(str) {
  const segmenter = new Intl.Segmenter("ja-JP", { granularity: "grapheme" });

  // ここで使用されている Segments オブジェクトのイテレーターは、文字を書記素で反復処理します。
  // 文字は複数の Unicode 文字で構成されている場合があります。
  return [...segmenter.segment(str)].length;
}

console.log(getGraphemeCount("👨‍👩‍👧‍👧")); // 1

基本的な使い方

js
const x = "Mozilla";
const empty = "";

console.log(`${x} は ${x.length} コード単位の長さです`);
/* "Mozilla は 7 コード単位の長さです" */

console.log(`空文字列の長さは ${empty.length} です`);
/* "空文字の長さは 0 です" */

文字列の length は文字数と等しいとは限らない

js
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 への代入

文字列はプリミティブであるため、文字列の length プロパティに値を代入しても目に見える効果はなく、厳格モードでは例外が発生します。

js
const myString = "bluebells";

myString.length = 4;
console.log(myString); // "bluebells"
console.log(myString.length); // 9

仕様書

Specification
ECMAScript Language Specification
# sec-properties-of-string-instances-length

ブラウザーの互換性

BCD tables only load in the browser

関連情報