訳の正確性を保証するものではありませんので必要に応じて原文であるEcma InternationalのECMA-262にある ECMA-262.pdf ( ECMA-262 5.1 Edition )を参照下さい。
訳:2012年04月 webzoit.net
【構文】 EqualityExpression : RelationalExpression EqualityExpression == RelationalExpression EqualityExpression != RelationalExpression EqualityExpression === RelationalExpression EqualityExpression !== RelationalExpression EqualityExpressionNoIn : RelationalExpressionNoIn EqualityExpressionNoIn == RelationalExpressionNoIn EqualityExpressionNoIn != RelationalExpressionNoIn EqualityExpressionNoIn === RelationalExpressionNoIn EqualityExpressionNoIn !== RelationalExpressionNoIn
【セマンティックス】 等価演算子を評価した結果は、常に2つのオペランド間で保持する演算子によって名づけられた関係かどうかに影響するBoolean型です。 EqualityExpressionNoIn プロダクションは、EqualityExpression と RelationalExpressionのそれぞれを含む代わりにEqualityExpressionNoIn と RelationalExpressionNoInを含んで評価される場合を除き、EqualityExpressionプロダクションと同じ方法で評価されます。
プロダクション
EqualityExpression : EqualityExpression == RelationalExpression
は、次のように評価されます。
1. lref は、 EqualityExpressionを評価した結果とする 2. lval は、 GetValue(lref) とする 3. rref は、 RelationalExpressionを評価した結果とする 4. rval は、 GetValue(rref) とする 5.抽象等価比較 rval == lval ( 11.9.3 参照)を実行した結果を返す
プロダクション
EqualityExpression : EqualityExpression != RelationalExpression
は、次のように評価されます。
1. lref は、EqualityExpressionを評価した結果とする 2. lval は、 GetValue(lref) とする 3. rref は、RelationalExpressionを評価した結果とする 4. rval は、 GetValue(rref) とする 5. r は、抽象等価比較 rval == lval ( 11.9.3 参照)を実行した結果とする 6. r が、trueである場合、falseを返し、それ以外の場合、trueを返す
値 x と y における比較 x == y は、true または falseを生成します。 このような比較は、次のように実行されます。
1. Type(x) が、 Type(y)と同じである場合、 a. Type(x) が、Undefinedである場合、trueを返す b. Type(x) が、Nullである場合、trueを返す c. Type(x) が、Numberである場合、 i. x が、 NaNである場合、falseを返す ii. y が、 NaNである場合、falseを返す iii. x が、 yと同じNumber値である場合、trueを返す iv. x が、 +0で且つ y が、-0である場合、trueを返す v. x が、 -0で且つ y が、+0である場合、trueを返す vi. falseを返す d. Type(x) が、Stringである場合、 x と y の文字の並びが全く同じ(一致する位置にある文字が同じ長さの同じ文字)である場合、true を返し、それ以外は、falseを返す e. Type(x) が、Booleanである場合、 x と y が共に true または、共に falseである場合、 true を返し、それ以外の場合、false を返す f. x と y が同じオブジェクトを参照する場合、true を返し、それ以外の場合、false を返す 2. x が、null且つ、 y がundefinedである場合、trueを返す 3. x が、undefined且つ、y がnullである場合、trueを返す 4. Type(x) が、Number且つ、 Type(y) が、Stringである場合、比較 x == ToNumber(y) の結果を返す 5. Type(x) が、String且つ、 Type(y) が、Numberである場合、比較 ToNumber(x) == y の結果を返す 6. Type(x) が、Booleanである場合、比較 ToNumber(x) == y の結果を返す 7. Type(y) が、Booleanである場合、比較 x == ToNumber(y) の結果を返す 8. Type(x) が、Stringまたは、Numberであり、且つ Type(y) が、Objectである場合、比較 x == ToPrimitive(y) の結果を返す 9. Type(x) が、Object且つ Type(y) が、Stringまたは、Numberである場合、比較 ToPrimitive(x) == y の結果を返す 10. falseを返す
[注記 1] 等価についての上記定義について String 比較は、 "" + a == "" + b によって有効にすることが可能です。 Numeric 比較は、 +a == +b によって有効にすることが可能です。 Boolean 比較は、 !a == !b によって有効にすることが可能です。 [注記 2] 等価演算子は、次の不変量を維持しています。 A != B は、 !(A == B) と等価です。 A == B は、 A と Bの評価順を除き B == A と等価です。 [注記 3] 等価演算子は、常に他動詞というわけではありません。 例えば、2つの異なるString型オブジェクトが、それぞれ同一のString値を表している場合、それぞれのString型オブジェクトは、 == 演算子によってString値と等価であると考えられそうな気がしますが、この場合、2つのString型オブジェクトは、それぞれ他方と等価にはなりません。 例えば、 ・ new String("a") == "a" と "a" == new String("a") は、共に trueです。 ・ new String("a") == new String("a") は、 falseです。 [注記 4] 複数のStringの比較は、単にコードユニット値の並びについて等価テストを使用します。 Unicode仕様上で定義した、より複雑な文字や文字列の同一性、照合順といったセマンティックス上の指向定義を使用する為に試すことは何もありません。 その為、Unicode標準規格による正規の等価性のあるString値は、等しくないものとしてテストすることが可能です。 このアルゴリズムの効果においては、正規形の中に両方のString値が既にあることを前提としています。
プロダクション
EqualityExpression : EqualityExpression === RelationalExpression
は、次のように評価されます。
1. lref は、EqualityExpressionを評価した結果とする 2. lval は、 GetValue(lref) とする 3. rref は、RelationalExpressionを評価した結果とする 4. rval は、 GetValue(rref) とする 5.厳密等価比較 rval === lval ( 11.9.6 参照)を実行した結果を返す
プロダクション
EqualityExpression : EqualityExpression !== RelationalExpression
は、次のように評価されます。
1. lref は、EqualityExpressionを評価した結果とする 2. lval は、 GetValue(lref) とする 3. rref は、RelationalExpressionを評価した結果とする 4. rval は、 GetValue(rref) とする 5. r は、厳密等価比較 rval === lval ( 11.9.6 参照)を実行した結果とする 6. r が、trueである場合、falseを返し、それ以外の場合、trueを返す
値 x と y における比較 x === y は、 true または falseを生成します。 このような比較は次のように実行されます。
1. Type(x) が、Type(y)と異なる場合、falseを返す 2. Type(x) が、Undefinedである場合、trueを返す 3. Type(x) が、Nullである場合、trueを返す 4. Type(x) が、Numberである場合、 a. x が、 NaNである場合、 falseを返す b. y が、 NaNである場合、 falseを返す c. x が、 y と同一のNumber値である場合、 trueを返す d. x が、+0且つ、 y が、-0である場合、 trueを返す e. x が、-0且つ、 y が、+0である場合、 trueを返す f. falseを返す 5. Type(x) が、Stringである場合、 x と yが、全く同一の文字の並び(一致する位置にある文字が同じ長さの同じ文字)である場合、 trueを返し、それ以外の場合、falseを返す 6. Type(x) が、Booleanである場合、 x と yが、共に true または、共に falseである場合、 trueを返し、それ以外の場合、falseを返す 7. x と yが、同一のオブジェクトを参照する場合、 true を返し、それ以外の場合、falseを返す
[注釈] このアルゴリズムは、その符号付きゼロとNaNの扱いの中にあるSameValueアルゴリズム(9.12)とは異なります。