概要: このチュートリアルでは、JavaScriptで2つの文字列が等しいかどうかを確認する方法を学びます。
次の2つの文字列があるとします。
const s1 = 'Hi';
const s2 = 'Hi';Code language: JavaScript (javascript)s1とs2は同じ文字を持っているため、===演算子を使用して比較すると等しくなります。
console.log(s1 === s2); // trueCode language: JavaScript (javascript)次の例を考えてみましょう。
const s1 = 'café';
const s2 = 'café';
console.log(s1===s2); // falseCode 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); // falseCode 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()); // trueCode language: JavaScript (javascript)同様に、次の文字列を比較した場合もtrueが返されます。
const s1 = 'café';
const s2 = 'café';
console.log(s1.normalize() === s2.normalize()); // trueCode language: JavaScript (javascript)まとめ
- 一般に、文字列にASCII文字のみが含まれている場合は、===演算子を使用してそれらが等しいかどうかを確認します。
- 文字列に結合文字を含む文字が含まれている場合は、等価性を比較する前に最初に正規化します。