JavaScriptで2つの文字列が等しいかどうかを確認する方法

概要: このチュートリアルでは、JavaScriptで2つの文字列が等しいかどうかを確認する方法を学びます。

次の2つの文字列があるとします。

const s1 = 'Hi';
const s2 = 'Hi';Code language: JavaScript (javascript)

s1s2は同じ文字を持っているため、===演算子を使用して比較すると等しくなります。

console.log(s1 === s2); // trueCode language: JavaScript (javascript)

次の例を考えてみましょう。

const s1 = 'café';
const s2 = 'café';
console.log(s1===s2); // falseCode language: JavaScript (javascript)

この例では、s1s2は同じように見えます。しかし、s1 === s2の比較結果はfalseになります。

これがどのように機能するかを理解するには、まず書記素と結合文字の概念を知る必要があります。

書記素とは

書記素とは、書記体系の最小の機能単位です。

たとえば、文字列caféには、café(または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)

ここで、同じ書記素éc1c2を比較すると、それらが等しくないことがわかります。

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)

したがって、正規化後、c1c2は等しくなります。

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文字のみが含まれている場合は、===演算子を使用してそれらが等しいかどうかを確認します。
  • 文字列に結合文字を含む文字が含まれている場合は、等価性を比較する前に最初に正規化します。
このチュートリアルは役に立ちましたか?