ECMAScript関係演算子
関係演算子は比較演算を行います。各関係演算子は布尔値を返します。
一般的な比較方法
関係演算子「<」、「>」、「<=」、および「>=」は、2つの数の比較演算を行います。比較方法は算術比較演算と同じです。
各関係演算子は布尔値を返します:
var bResult1 = 2 > 1 // true var bResult2 = 2 < 1 // false
しかし、2つの文字列に関係演算子を適用すると、その行動は異なります。多くの人が「小さい」が「アルファベット順に前」を、「大きい」が「アルファベット順に後」を意味すると考えていますが、実際にはそうではありません。文字列の場合、第1文字列の各文字のASCIIコードは、第2文字列の対応する位置の文字のASCIIコードと数値的に比較されます。この比較操作が完了すると、Boolean値が返されます。問題は、大文字のASCIIコードが小文字のASCIIコードよりも小さいことです。これは以下のような状況が発生する可能性があることを意味します:
var bResult = "Blue" < "alpha"; alert(bResult); // trueを出力
上記の例では、文字列「Blue」は「alpha」よりも小さいと考えられます。これは、文字BのASCIIコードが66、文字aのASCIIコードが97だからです。実際のアルファベット順で比較するために強制的にするには、2つの数を同じ大小文字形式(全大文字または全小文字)に変換してから比較する必要があります:
var bResult = "Blue".toLowerCase() < "alpha".toLowerCase(); alert(bResult); //falseを输出
二つの演算子をすべて小文字に変換することで、「alpha」が「Blue」の前にアルファベット順に正しく識別されます。
数字と文字列の比較
二つの文字列表現の数字を比較する場合に発生するもう一つの厄介な状況は、以下のようです:
var bResult = "25" < "3"; alert(bResult); //「true」を输出
上記のコードは文字列「25」と「3」を比較しています。二つの演算子はすべて文字列であり、そのため、文字コード(「2」の文字コードは50、「3」の文字コードは51)で比較されます。
しかし、ある演算子が数字に変換される場合、結果が面白くなります:
var bResult = "25" < 3; alert(bResult); //「false」を输出
ここでは、文字列「25」は数字25に変換され、それが数字3と比較され、予想通りです。
数字と文字列を比較する際は、ECMAScriptは常に文字列を数字に変換し、それらの数字の順序で比較します。
しかし、文字列が数字に変換できない場合どうでしょうか?以下の例を考えてみましょう:
var bResult = "a" < 3; alert(bResult);
このコードの输出が予想できるでしょうか?文字「a」は意味のある数字に変換できません。しかし、parseInt()メソッドを呼び出すとNaNが返されます。規則に従って、NaNを含む関係演算子はfalseを返すため、このコードもfalseを输出します:
var bResult = "a" >= 3; alert(bResult);
通常、小于演算の二つの値がfalseを返す場合、大于等于演算はtrueを返す必要がありますが、NaNの値が含まれる場合にはその通りではありません。