概要: このチュートリアルでは、JavaScriptで2つの文字列が等しいかどうかを確認する方法を学びます。
次の2つの文字列があるとします。
const s1 = 'Hi';
const s2 = 'Hi';
Code language: JavaScript (javascript)
s1
とs2
は同じ文字を持っているため、===
演算子を使用して比較すると等しくなります。
console.log(s1 === s2); // true
Code language: JavaScript (javascript)
次の例を考えてみましょう。
const s1 = 'café';
const s2 = 'café';
console.log(s1===s2); // false
Code language: JavaScript (javascript)
この例では、s1
とs2
は同じように見えます。しかし、s1 === s2の比較結果はfalse
になります。
これがどのように機能するかを理解するには、まず書記素と結合文字の概念を知る必要があります。
書記素とは
書記素とは、書記体系の最小の機能単位です。
たとえば、文字列café
には、c
、a
、f
、é
(またはe
にアキュート
)の4つの文字があります。各文字が書く単位として表示される方法が書記素と呼ばれます。
そして、いくつかの書記素は、異なる文字の並びを使用して表現することができます。
文字の後に配置すると、前の文字を修飾する文字がいくつかあります。これらの文字は結合文字と呼ばれます。
結合文字とは
結合文字とは、書記素を作成するために先行するベース文字に適用される文字のことです。
この例では、é
は原子書記素です。小文字のe
(ベース文字)と結合文字(◌́)を使用してエンコードできます。
e + ◌́ = é
JavaScriptでは、文字éは次のように表現されます。
const c1 = 'e\u0301';
console.log(c1); //
é
Code language: JavaScript (javascript)
この例では、\u0301
は結合文字◌́のUnicodeエスケープシーケンスです。
さらに、同じ書記素éを、アキュート記号付きの小文字のe
を使用してエンコードすることもできます。
const c2 = 'é';
console.log(c2);
Code language: JavaScript (javascript)
ここで、同じ書記素é
のc1
とc2
を比較すると、それらが等しくないことがわかります。
const c1 = 'e\u0301';
const c2 = 'é';
console.log(c1 === c2); // false
Code language: JavaScript (javascript)
これらの文字列を安全に比較するには、normalize()
メソッドを使用します。このメソッドは、文字列のUnicode正規化形式を返します。たとえば
const c1 = 'e\u0301';
console.log(c1.normalize()); //
é
Code language: JavaScript (javascript)
したがって、正規化後、c1
とc2
は等しくなります。
const c1 = 'e\u0301';
const c2 = 'é';
console.log(c1.normalize() === c2.normalize()); // true
Code language: JavaScript (javascript)
同様に、次の文字列を比較した場合もtrue
が返されます。
const s1 = 'café';
const s2 = 'café';
console.log(s1.normalize() === s2.normalize()); // true
Code language: JavaScript (javascript)
まとめ
- 一般に、文字列にASCII文字のみが含まれている場合は、===演算子を使用してそれらが等しいかどうかを確認します。
- 文字列に結合文字を含む文字が含まれている場合は、等価性を比較する前に最初に正規化します。