0x0b
js-grammer04
最終更新:
0x0b
-
view
11.6 加減演算子 (Additive Operators)
Syntax
AdditiveExpression :
MultiplicativeExpression
AdditiveExpression + MultiplicativeExpression
AdditiveExpression - MultiplicativeExpression
11.6.1 加法演算子 (The Addition operator) ( + )
AdditiveExpression :
MultiplicativeExpression
AdditiveExpression + MultiplicativeExpression
AdditiveExpression - MultiplicativeExpression
11.6.1 加法演算子 (The Addition operator) ( + )
加法演算子は、文字列の連結、または数の加法のいずれかを行う。
生成規則 AdditiveExpression : AdditiveExpression + MultiplicativeExpression は、次のように評価される:
AdditiveExpression を評価。
GetValue(Result(1)) を呼出す。
MultiplicativeExpression を評価。
GetValue(Result(3)) を呼出す。
ToPrimitive(Result(2)) を呼出す。
ToPrimitive(Result(4)) を呼出す。
Type(Result(5)) が String または Type(Result(6)) が String ならば、 ステップ 12 へ。 (このステップは、関係演算子の比較アルゴリズムのステップ 3 とは異なり、 かつ ではなく または であることに注意。)
ToNumber(Result(5)) を呼出す。
ToNumber(Result(6)) を呼出す。
Result(8) と Result(9) に、加法演算を適用する。下記ノート参照 (セクション 11.6.3)。
Result(10) を返す。
ToString(Result(5)) を呼出す。
ToString(Result(6)) を呼出す。
Result(12) に Result(13) を連結する。
Result(14) を返す。
NOTE ステップ 5 と 6 における ToPrimitive 呼出しではヒントを提供しない。全ネイティブ ECMAScript オブジェクトは Date オブジェクトを除き、ヒントの欠如をヒント Number が与えられたように扱う; Date オブジェクトは、ヒントの欠如をヒント String が与えられたように扱う。
ホストオブジェクトは、ヒントの欠如を他の方法で扱ってよい。
11.6.2 減法演算子 (The Subtraction Operator) ( - )
生成規則 AdditiveExpression : AdditiveExpression + MultiplicativeExpression は、次のように評価される:
AdditiveExpression を評価。
GetValue(Result(1)) を呼出す。
MultiplicativeExpression を評価。
GetValue(Result(3)) を呼出す。
ToPrimitive(Result(2)) を呼出す。
ToPrimitive(Result(4)) を呼出す。
Type(Result(5)) が String または Type(Result(6)) が String ならば、 ステップ 12 へ。 (このステップは、関係演算子の比較アルゴリズムのステップ 3 とは異なり、 かつ ではなく または であることに注意。)
ToNumber(Result(5)) を呼出す。
ToNumber(Result(6)) を呼出す。
Result(8) と Result(9) に、加法演算を適用する。下記ノート参照 (セクション 11.6.3)。
Result(10) を返す。
ToString(Result(5)) を呼出す。
ToString(Result(6)) を呼出す。
Result(12) に Result(13) を連結する。
Result(14) を返す。
NOTE ステップ 5 と 6 における ToPrimitive 呼出しではヒントを提供しない。全ネイティブ ECMAScript オブジェクトは Date オブジェクトを除き、ヒントの欠如をヒント Number が与えられたように扱う; Date オブジェクトは、ヒントの欠如をヒント String が与えられたように扱う。
ホストオブジェクトは、ヒントの欠如を他の方法で扱ってよい。
11.6.2 減法演算子 (The Subtraction Operator) ( - )
生成規則 AdditiveExpression : AdditiveExpression - MultiplicativeExpression は、次のように評価される:
AdditiveExpression を評価。
GetValue(Result(1)) を呼出す。
MultiplicativeExpression を評価。
GetValue(Result(3)) を呼出す。
ToNumber(Result(2)) を呼出す。
ToNumber(Result(4)) を呼出す。
Result(5) と Result(6) に、減法演算を適用する。下記ノート参照 (セクション 11.6.3)。
Result(7) を返す。
11.6.3 加減演算子の数への適用 (Applying the Additive Operators ( +,- ) to Numbers)
AdditiveExpression を評価。
GetValue(Result(1)) を呼出す。
MultiplicativeExpression を評価。
GetValue(Result(3)) を呼出す。
ToNumber(Result(2)) を呼出す。
ToNumber(Result(4)) を呼出す。
Result(5) と Result(6) に、減法演算を適用する。下記ノート参照 (セクション 11.6.3)。
Result(7) を返す。
11.6.3 加減演算子の数への適用 (Applying the Additive Operators ( +,- ) to Numbers)
数型の 2 個の項に適用されるとき、 + 演算子は加法を行い、項の和を生成する。
- 演算子は減法を行い、 2 個の数項の差を生成する。
加法は可換的演算 (commutative operation) であるが、常に結合的 (associative) ということではない。
加法の結果は、 IEEE 754 倍精度計算規則を使用して決定される:
どちらの項も NaN ならば、結果は NaN である。
異符号の 2 個の無限大の和は、 NaN である。
同符号の 2 個の無限大の和は、その符号の無限大である。
1 個の無限大と有限数の和は、無限大の項と等しい。
2 個の負符号の 0 の和は、 -0 である。2 個の正符号の 0、また 2 個の異符号の 0 の和は、 +0 である。
0 と 0 以外の有限数の和は、 0 以外の項と等しい。
異符号で同じ大きさの 2 個の 0 以外の有限数の和は、 +0 である。
無限大でも 0 でも NaN でもなく、項が同符号であるかまたは異なる大きさを持つ残りのケースでは、和が算出され、 IEEE 754 直近への丸めモードを使用して、直近の表現可能な値へ丸められる. 大きさが表せないほど大きいならば、演算はオーバーフローし、結果は適切な符合の無限大となる。 ECMAScript 言語は、 IEEE 754 に定義される段階的アンダーフロー (gradual underflow) のサポートを必須とする。
数型の 2 個の項に適用されるとき、 - 演算子は減法を行い、項の差を生成する; 左項が被減数で、右項が減数である。数項 a と b を与えられると、常に a-b は a+(-b) と同じ結果を生成する。
11.7 ビット幅シフト演算子 (Bitwise Shift Operators)
加法の結果は、 IEEE 754 倍精度計算規則を使用して決定される:
どちらの項も NaN ならば、結果は NaN である。
異符号の 2 個の無限大の和は、 NaN である。
同符号の 2 個の無限大の和は、その符号の無限大である。
1 個の無限大と有限数の和は、無限大の項と等しい。
2 個の負符号の 0 の和は、 -0 である。2 個の正符号の 0、また 2 個の異符号の 0 の和は、 +0 である。
0 と 0 以外の有限数の和は、 0 以外の項と等しい。
異符号で同じ大きさの 2 個の 0 以外の有限数の和は、 +0 である。
無限大でも 0 でも NaN でもなく、項が同符号であるかまたは異なる大きさを持つ残りのケースでは、和が算出され、 IEEE 754 直近への丸めモードを使用して、直近の表現可能な値へ丸められる. 大きさが表せないほど大きいならば、演算はオーバーフローし、結果は適切な符合の無限大となる。 ECMAScript 言語は、 IEEE 754 に定義される段階的アンダーフロー (gradual underflow) のサポートを必須とする。
数型の 2 個の項に適用されるとき、 - 演算子は減法を行い、項の差を生成する; 左項が被減数で、右項が減数である。数項 a と b を与えられると、常に a-b は a+(-b) と同じ結果を生成する。
11.7 ビット幅シフト演算子 (Bitwise Shift Operators)
Syntax
ShiftExpression :
AdditiveExpression
ShiftExpression << AdditiveExpression
ShiftExpression >> AdditiveExpression
ShiftExpression >>> AdditiveExpression
11.7.1 左シフト演算子 (The Left Shift Operator) ( << )
ShiftExpression :
AdditiveExpression
ShiftExpression << AdditiveExpression
ShiftExpression >> AdditiveExpression
ShiftExpression >>> AdditiveExpression
11.7.1 左シフト演算子 (The Left Shift Operator) ( << )
右項で指定される量により、左項上にビット幅左シフト演算を行う。
生成規則 ShiftExpression : ShiftExpression << AdditiveExpression は、次のように評価される:
ShiftExpression を評価。
GetValue(Result(1)) を呼出す。
AdditiveExpression を評価。
GetValue(Result(3)) を呼出す。
ToInt32(Result(2)) を呼出す。
ToUint32(Result(4)) を呼出す。
Result(6) の下位 5 ビット以外をマスクする。 つまり、 Result(6) & 0x1F を算出する。
Result(5) を Result(7) ビット左シフトする。結果は符号付き 32 ビット整数である。
Result(8) を返す。
11.7.2 符号付き右シフト演算子 (The Signed Right Shift Operator) ( >> )
生成規則 ShiftExpression : ShiftExpression << AdditiveExpression は、次のように評価される:
ShiftExpression を評価。
GetValue(Result(1)) を呼出す。
AdditiveExpression を評価。
GetValue(Result(3)) を呼出す。
ToInt32(Result(2)) を呼出す。
ToUint32(Result(4)) を呼出す。
Result(6) の下位 5 ビット以外をマスクする。 つまり、 Result(6) & 0x1F を算出する。
Result(5) を Result(7) ビット左シフトする。結果は符号付き 32 ビット整数である。
Result(8) を返す。
11.7.2 符号付き右シフト演算子 (The Signed Right Shift Operator) ( >> )
右項で指定される量により、左項上に符号を伴うビット幅右シフト演算を行う。
生成規則 ShiftExpression : ShiftExpression >> AdditiveExpression は、次のように評価される:
ShiftExpression を評価。
GetValue(Result(1)) を呼出す。
AdditiveExpression を評価。
GetValue(Result(3)) を呼出す。
ToInt32(Result(2)) を呼出す。
ToUint32(Result(4)) を呼出す。
Result(6) の下位 5 ビット以外をマスクする。 つまり、 Result(6) & 0x1F を算出する。
Result(5) を Result(7) ビット符号拡張右シフトする。最上位ビットは伝播する。結果は符号付き 32 ビット整数である。
Result(8) を返す。
11.7.3 符号なし右シフト演算子 (The Unsigned Right Shift Operator) ( >>> )
生成規則 ShiftExpression : ShiftExpression >> AdditiveExpression は、次のように評価される:
ShiftExpression を評価。
GetValue(Result(1)) を呼出す。
AdditiveExpression を評価。
GetValue(Result(3)) を呼出す。
ToInt32(Result(2)) を呼出す。
ToUint32(Result(4)) を呼出す。
Result(6) の下位 5 ビット以外をマスクする。 つまり、 Result(6) & 0x1F を算出する。
Result(5) を Result(7) ビット符号拡張右シフトする。最上位ビットは伝播する。結果は符号付き 32 ビット整数である。
Result(8) を返す。
11.7.3 符号なし右シフト演算子 (The Unsigned Right Shift Operator) ( >>> )
右項で指定される量により、左項上に 0 を伴うビット幅右シフト演算を行う。
生成規則 ShiftExpression : ShiftExpression >>> AdditiveExpression は、次のように評価される:
ShiftExpression を評価。
GetValue(Result(1)) を呼出す。
AdditiveExpression を評価。
GetValue(Result(3)) を呼出す。
ToUint32(Result(2)) を呼出す。
ToUint32(Result(4)) を呼出す。
Result(6) の下位 5 ビット以外をマスクする。 つまり、 Result(6) & 0x1F を算出する。
Result(5) を Result(7) ビット分だけ 0 拡張右シフトする。空ビットは 0 で埋められる。結果は符号なし 32 ビット整数である。
Result(8) を返す。
11.8 関係演算子 (Relational Operators)
生成規則 ShiftExpression : ShiftExpression >>> AdditiveExpression は、次のように評価される:
ShiftExpression を評価。
GetValue(Result(1)) を呼出す。
AdditiveExpression を評価。
GetValue(Result(3)) を呼出す。
ToUint32(Result(2)) を呼出す。
ToUint32(Result(4)) を呼出す。
Result(6) の下位 5 ビット以外をマスクする。 つまり、 Result(6) & 0x1F を算出する。
Result(5) を Result(7) ビット分だけ 0 拡張右シフトする。空ビットは 0 で埋められる。結果は符号なし 32 ビット整数である。
Result(8) を返す。
11.8 関係演算子 (Relational Operators)
Syntax
RelationalExpression :
ShiftExpression
RelationalExpression < ShiftExpression
RelationalExpression > ShiftExpression
RelationalExpression <= ShiftExpression
RelationalExpression >= ShiftExpression
RelationalExpression instanceof ShiftExpression
RelationalExpression in ShiftExpression
RelationalExpressionNoIn :
ShiftExpression
RelationalExpressionNoIn < ShiftExpression
RelationalExpressionNoIn > ShiftExpression
RelationalExpressionNoIn <= ShiftExpression
RelationalExpressionNoIn >= ShiftExpression
RelationalExpressionNoIn instanceof ShiftExpression
NOTE NoIn 変化形は、for 文の中の in 演算子を含む関係式内の in 演算子の混乱の回避に必要である。
Semantics
関係演算子の評価の結果は常に Boolean 型であり、演算子に名づけられた関係がその 2 項間に維持されているかどうかを反映する。
RelationalExpressionNoIn 生成規則は RelationalExpression 生成規則と同様に評価されるが、内部の RelationalExpression の代わりに、RelationalExpressionNoIn が評価される。
11.8.1 Less-than 演算子 (The Less-than Operator) ( < )
RelationalExpression :
ShiftExpression
RelationalExpression < ShiftExpression
RelationalExpression > ShiftExpression
RelationalExpression <= ShiftExpression
RelationalExpression >= ShiftExpression
RelationalExpression instanceof ShiftExpression
RelationalExpression in ShiftExpression
RelationalExpressionNoIn :
ShiftExpression
RelationalExpressionNoIn < ShiftExpression
RelationalExpressionNoIn > ShiftExpression
RelationalExpressionNoIn <= ShiftExpression
RelationalExpressionNoIn >= ShiftExpression
RelationalExpressionNoIn instanceof ShiftExpression
NOTE NoIn 変化形は、for 文の中の in 演算子を含む関係式内の in 演算子の混乱の回避に必要である。
Semantics
関係演算子の評価の結果は常に Boolean 型であり、演算子に名づけられた関係がその 2 項間に維持されているかどうかを反映する。
RelationalExpressionNoIn 生成規則は RelationalExpression 生成規則と同様に評価されるが、内部の RelationalExpression の代わりに、RelationalExpressionNoIn が評価される。
11.8.1 Less-than 演算子 (The Less-than Operator) ( < )
生成規則 RelationalExpression : RelationalExpression < ShiftExpression は、次のように評価される:
RelationalExpression を評価。
GetValue(Result(1)) を呼出す。
ShiftExpression を評価。
GetValue(Result(3)) を呼出す。
比較 Result(2) < Result(4) を実行する。 (セクション 11.8.5.)
Result(5) が undefined ならば、 false を返す。そうでなければ、 Result(5) を返す。
11.8.2 Grater-than 演算子 (The Greater-than Operator) ( > )
RelationalExpression を評価。
GetValue(Result(1)) を呼出す。
ShiftExpression を評価。
GetValue(Result(3)) を呼出す。
比較 Result(2) < Result(4) を実行する。 (セクション 11.8.5.)
Result(5) が undefined ならば、 false を返す。そうでなければ、 Result(5) を返す。
11.8.2 Grater-than 演算子 (The Greater-than Operator) ( > )
生成規則 RelationalExpression : RelationalExpression > ShiftExpression は、次のように評価される:
RelationalExpression を評価。
GetValue(Result(1)) を呼出す。
ShiftExpression を評価。
GetValue(Result(3)) を呼出す。
比較 Result(4) < Result(2) を実行する。 (セクション 11.8.5.)
Result(5) が undefined ならば、 false を返す。そうでなければ、 Result(5) を返す。
11.8.3 Less-than-or-equal 演算子 (The Less-than-or-equal Operator) ( <= )
RelationalExpression を評価。
GetValue(Result(1)) を呼出す。
ShiftExpression を評価。
GetValue(Result(3)) を呼出す。
比較 Result(4) < Result(2) を実行する。 (セクション 11.8.5.)
Result(5) が undefined ならば、 false を返す。そうでなければ、 Result(5) を返す。
11.8.3 Less-than-or-equal 演算子 (The Less-than-or-equal Operator) ( <= )
生成規則 RelationalExpression : RelationalExpression <= ShiftExpression は、次のように評価される:
RelationalExpression を評価。
GetValue(Result(1)) を呼出す。
ShiftExpression を評価。
GetValue(Result(3)) を呼出す。
比較 Result(4) < Result(2) を実行する (セクション 11.8.5.)
Result(5) が true または undefinedならば、 false を返す。そうでなければ、 true を返す。
11.8.4 Greater-than-or-equal 演算子 (The Greater-than-or-equal Operator) ( >= )
RelationalExpression を評価。
GetValue(Result(1)) を呼出す。
ShiftExpression を評価。
GetValue(Result(3)) を呼出す。
比較 Result(4) < Result(2) を実行する (セクション 11.8.5.)
Result(5) が true または undefinedならば、 false を返す。そうでなければ、 true を返す。
11.8.4 Greater-than-or-equal 演算子 (The Greater-than-or-equal Operator) ( >= )
生成規則 RelationalExpression : RelationalExpression >= ShiftExpression は、次のように評価される:
RelationalExpression を評価。
GetValue(Result(1)) を呼出す。
ShiftExpression を評価。
GetValue(Result(3)) を呼出す。
比較 Result(2) < Result(4) を実行する。 (セクション 11.8.5.)
Result(5) が true または undefined ならば、 false を返す。そうでなければ、 true を返す。
11.8.5 抽象的関係比較アルゴリズム (The Abstract Relational Comparison Algorithm)
RelationalExpression を評価。
GetValue(Result(1)) を呼出す。
ShiftExpression を評価。
GetValue(Result(3)) を呼出す。
比較 Result(2) < Result(4) を実行する。 (セクション 11.8.5.)
Result(5) が true または undefined ならば、 false を返す。そうでなければ、 true を返す。
11.8.5 抽象的関係比較アルゴリズム (The Abstract Relational Comparison Algorithm)
x と y を値として、比較 x < y は、 true, false, または undefined を生成する (少なくとも一方の項が NaN であることを示す)。 この比較は次のように実行される:
ToPrimitive(x, hint Number) を呼出す。
ToPrimitive(y, hint Number) を呼出す。
If Type(Result(1)) が String かつ Type(Result(2)) が String ならば、ステップ 16 へ。 (このステップが or の代わりに and を使い、加法演算子 + のためのアルゴリズムにおいてステップ 7 から異なることに注意。)
ToNumber(Result(1)) を呼出す。
ToNumber(Result(2)) を呼出す。
Result(4) が NaN ならば、 undefined を返す。
Result(5) が NaN ならば、 undefined を返す。
Result(4) と Result(5) が同じ数値ならば、 false を返す。
Result(4) が +0 かつ Result(5) が -0 ならば、 false を返す。
Result(4) が -0 かつ Result(5) が +0 ならば、 false を返す。
Result(4) が +∞ ならば、 false を返す。
Result(5) が +∞ ならば、 true を返す。
Result(5) が -∞ ならば、 false を返す。
Result(4) が -∞ ならば、 true を返す。
Result(4) の数学値が Result(5) の数学値より小さければ、 true を返す。 -- これらの数学値は共に有限な 0 以外の値であることに注意 -- そうでなければ、 false を返す。
Result(2) が Result(1) の接頭辞ならば、 false を返す。 (q が p と他の文字列 r の連結結果でありえるならば、文字列値 p は文字列値 q の接頭辞である。r を空文字列とすれば任意の文字列はそれ自身の接頭辞であることに注意。)
Result(1) が Result(2) の接頭辞ならば、 true を返す。
Result(1) の位置 k の文字が Result(2) の位置 k の文字と異なるような負でない最小整数を k とする。 (どちらの文字列も互いの接頭辞とならないような k が存在しなければならない。)
m を Result(1) の位置 k の文字のコードポイント値である整数とする。
n を Result(2) の位置 k の文字のコードポイント値である整数とする。
m < n ならば true を返し、そうでなければ、 false を返す。
NOTE 文字列比較は、単純な辞書的序列をコードポイント値のシーケンスの値に用いる。文字や文字列の等価性、および Unicode 仕様 で定義される順序の照合の、これ以上複雑で意味論的に指向した定義を用いる試みはない。それゆえ、 Unicode 標準によって規準的に等しい文字列が不等価と検査されるかもしれない。効果においてこのアルゴリズムは、双方の文字列が既に正規化形式であることを想定する。
11.8.6 instanceof 演算子 (The instanceof operator)
ToPrimitive(x, hint Number) を呼出す。
ToPrimitive(y, hint Number) を呼出す。
If Type(Result(1)) が String かつ Type(Result(2)) が String ならば、ステップ 16 へ。 (このステップが or の代わりに and を使い、加法演算子 + のためのアルゴリズムにおいてステップ 7 から異なることに注意。)
ToNumber(Result(1)) を呼出す。
ToNumber(Result(2)) を呼出す。
Result(4) が NaN ならば、 undefined を返す。
Result(5) が NaN ならば、 undefined を返す。
Result(4) と Result(5) が同じ数値ならば、 false を返す。
Result(4) が +0 かつ Result(5) が -0 ならば、 false を返す。
Result(4) が -0 かつ Result(5) が +0 ならば、 false を返す。
Result(4) が +∞ ならば、 false を返す。
Result(5) が +∞ ならば、 true を返す。
Result(5) が -∞ ならば、 false を返す。
Result(4) が -∞ ならば、 true を返す。
Result(4) の数学値が Result(5) の数学値より小さければ、 true を返す。 -- これらの数学値は共に有限な 0 以外の値であることに注意 -- そうでなければ、 false を返す。
Result(2) が Result(1) の接頭辞ならば、 false を返す。 (q が p と他の文字列 r の連結結果でありえるならば、文字列値 p は文字列値 q の接頭辞である。r を空文字列とすれば任意の文字列はそれ自身の接頭辞であることに注意。)
Result(1) が Result(2) の接頭辞ならば、 true を返す。
Result(1) の位置 k の文字が Result(2) の位置 k の文字と異なるような負でない最小整数を k とする。 (どちらの文字列も互いの接頭辞とならないような k が存在しなければならない。)
m を Result(1) の位置 k の文字のコードポイント値である整数とする。
n を Result(2) の位置 k の文字のコードポイント値である整数とする。
m < n ならば true を返し、そうでなければ、 false を返す。
NOTE 文字列比較は、単純な辞書的序列をコードポイント値のシーケンスの値に用いる。文字や文字列の等価性、および Unicode 仕様 で定義される順序の照合の、これ以上複雑で意味論的に指向した定義を用いる試みはない。それゆえ、 Unicode 標準によって規準的に等しい文字列が不等価と検査されるかもしれない。効果においてこのアルゴリズムは、双方の文字列が既に正規化形式であることを想定する。
11.8.6 instanceof 演算子 (The instanceof operator)
生成規則 RelationalExpression: RelationalExpression instanceof ShiftExpression は、次のように評価される:
RelationalExpression を評価。
GetValue(Result(1)) を呼出す。
ShiftExpression を評価。
GetValue(Result(3)) を呼出す。
Result(4) がオブジェクトでなければ、例外 TypeError を投げる。
Result(4) が HasInstance メソッドを持たなければ、例外 TypeError を投げる。
Result(4) の HasInstance メソッドを呼び、パラメータ Result(2) を渡す。
Result(7) を返す。
11.8.7 in 演算子 (The in operator)
RelationalExpression を評価。
GetValue(Result(1)) を呼出す。
ShiftExpression を評価。
GetValue(Result(3)) を呼出す。
Result(4) がオブジェクトでなければ、例外 TypeError を投げる。
Result(4) が HasInstance メソッドを持たなければ、例外 TypeError を投げる。
Result(4) の HasInstance メソッドを呼び、パラメータ Result(2) を渡す。
Result(7) を返す。
11.8.7 in 演算子 (The in operator)
生成規則 RelationalExpression : RelationalExpression in ShiftExpression は、次のように評価される:
RelationalExpression を評価。
GetValue(Result(1)) を呼出す。
ShiftExpression を評価。
GetValue(Result(3)) を呼出す。
Result(4) がオブジェクトでなければ、例外 TypeError を投げる。
ToString(Result(2)) を呼出す。
Result(4) の HasProperty メソッドを呼び、パラメータに Result(6) を渡す。
Result(7) を返す。
11.9 等価演算子 (Equality Operators)
RelationalExpression を評価。
GetValue(Result(1)) を呼出す。
ShiftExpression を評価。
GetValue(Result(3)) を呼出す。
Result(4) がオブジェクトでなければ、例外 TypeError を投げる。
ToString(Result(2)) を呼出す。
Result(4) の HasProperty メソッドを呼び、パラメータに Result(6) を渡す。
Result(7) を返す。
11.9 等価演算子 (Equality Operators)
Syntax
EqualityExpression :
RelationalExpression
EqualityExpression == RelationalExpression
EqualityExpression != RelationalExpression
EqualityExpression === RelationalExpression
EqualityExpression !== RelationalExpression
EqualityExpressionNoIn :
RelationalExpressionNoIn
EqualityExpressionNoIn == RelationalExpressionNoIn
EqualityExpressionNoIn != RelationalExpressionNoIn
EqualityExpressionNoIn === RelationalExpressionNoIn
EqualityExpressionNoIn !== RelationalExpressionNoIn
Semantics
等価演算子評価の結果は常に Boolean 型であり、演算子で示される関連性が 2 項間で維持されているかどうかを反映する。
EqualityExpressionNoIn 生成規則は EqualityExpression 生成規則と同様に評価されるが、内部の EqualityExpression と RelationalExpression の代わりに、それぞれ EqualityExpressionNoIn と RelationalExpressionNoIn が評価される。
11.9.1 等価演算子 (The Equals Operator) ( == )
EqualityExpression :
RelationalExpression
EqualityExpression == RelationalExpression
EqualityExpression != RelationalExpression
EqualityExpression === RelationalExpression
EqualityExpression !== RelationalExpression
EqualityExpressionNoIn :
RelationalExpressionNoIn
EqualityExpressionNoIn == RelationalExpressionNoIn
EqualityExpressionNoIn != RelationalExpressionNoIn
EqualityExpressionNoIn === RelationalExpressionNoIn
EqualityExpressionNoIn !== RelationalExpressionNoIn
Semantics
等価演算子評価の結果は常に Boolean 型であり、演算子で示される関連性が 2 項間で維持されているかどうかを反映する。
EqualityExpressionNoIn 生成規則は EqualityExpression 生成規則と同様に評価されるが、内部の EqualityExpression と RelationalExpression の代わりに、それぞれ EqualityExpressionNoIn と RelationalExpressionNoIn が評価される。
11.9.1 等価演算子 (The Equals Operator) ( == )
生成規則 EqualityExpression : EqualityExpression == RelationalExpression は、次のように評価される:
EqualityExpression を評価。
GetValue(Result(1)) を呼出す。
RelationalExpression を評価。
GetValue(Result(3)) を呼出す。
比較 Result(4) == Result(2) を実行する。 (セクション 11.9.3)
Result(5) を返す。
11.9.2 不等価演算子 (The Does-not-equals Operator) ( != )
EqualityExpression を評価。
GetValue(Result(1)) を呼出す。
RelationalExpression を評価。
GetValue(Result(3)) を呼出す。
比較 Result(4) == Result(2) を実行する。 (セクション 11.9.3)
Result(5) を返す。
11.9.2 不等価演算子 (The Does-not-equals Operator) ( != )
生成規則 EqualityExpression : EqualityExpression != RelationalExpression は、次のように評価される:
EqualityExpression を評価。
GetValue(Result(1)) を呼出す。
RelationalExpression を評価。
GetValue(Result(3)) を呼出す。
比較 Result(4) == Result(2) を実行する。 (セクション 11.9.3)
Result(5) が true なら、 false を返す。そうでなければ、 true を返す。
11.9.3 抽象的等価比較アルゴリズム (The Abstract Equality Comparison Algorithm)
EqualityExpression を評価。
GetValue(Result(1)) を呼出す。
RelationalExpression を評価。
GetValue(Result(3)) を呼出す。
比較 Result(4) == Result(2) を実行する。 (セクション 11.9.3)
Result(5) が true なら、 false を返す。そうでなければ、 true を返す。
11.9.3 抽象的等価比較アルゴリズム (The Abstract Equality Comparison Algorithm)
x と y を値とする比較 x==y は、 true または false を生成する。次のように比較は実行される:
Type(x) と Type(y) が異なる場合は、ステップ 14 へ。
Type(x) が Undefined ならば、 true を返す。
Type(x) が Null ならば、 true を返す。
Type(x) が Number でなければ、ステップ 11 へ。
x が NaN ならば、 false を返す。
y が NaN ならば、 false を返す。
x が y と同じ数ならば、 true を返す。
x が +0 で y が -0 ならば、 true を返す。
x が -0 で y が +0 ならば、 true を返す。
false を返す。
Type(x) が String ならば、x と y の文字シーケンスが完全に同じ(同じ長さで対応する位置に同じ文字がある)なら true を返し、そうでなければ false を返す。
Type(x) が Boolean ならば、 x と y がともに true かともに false なら true を返し、そうでなければ false を返す。
x と y が同じオブジェクトを参照しているか、または互いに結合しているオブジェクト(セクション13.1.2) を参照していれば true を返し、そうでなければ false を返す。
x が null で y が undefined ならば、 true を返す。
x が undefined で y が null ならば、 true を返す。
Type(x) が Number で Type(y) が String ならば、比較 x == ToNumber(y) の結果を返す。
Type(x) が String で Type(y) が Number ならば、比較 ToNumber(x) == y の結果を返す。
Type(x) が Boolean ならば、比較 ToNumber(x) == y の結果を返す。
Type(y) が Boolean ならば、比較 x == ToNumber(y) の結果を返す。
Type(x) が String か Number で Type(y) が Object ならば、比較 x == ToPrimitive(y) の結果を返す。
Type(x) が Object で Type(y) が String か Number ならば、比較 ToPrimitive(x) == y の結果を返す。
false を返す。
NOTE 等価の上の定義を与えられる:
"" + a == "" + b で文字列比較を強制できる。
a - 0 == b - 0 で数値比較を強制できる。
!a == !b で真偽比較を強制できる。
等価演算子は次の invariants を維持する:
A != B は !(A == B) と等しい。
A == B は、 A と B の評価の順序を除き、 B == A と等しい。
等価演算子は常に通過 (transitive) ではない。例えば、同じ文字列値をあらわす 2 個の区別される String オブジェクトが存在可能である; それぞれの String オブジェクトは == 演算子によって文字列値が等しいとは考えられるが、 2 個の String オブジェクトは互いに等価にはならな。
文字列比較は、コードポイント値のシーケンスの値に単純な等価検査を使用する。文字や文字列の等価性、および Unicode 2.0 仕様 で定義される順序の照合の、より複雑で意味論的に指向した定義を用いる試みはない。それゆえ、 Unicode 標準によって規準的に等しい文字列が不等価と検査されるかもしれない。効果においてこのアルゴリズムは、双方の文字列が既に正規化形式であることを想定する。
11.9.4 厳密等価演算子 (The Strict Equals Operator) ( === )
Type(x) と Type(y) が異なる場合は、ステップ 14 へ。
Type(x) が Undefined ならば、 true を返す。
Type(x) が Null ならば、 true を返す。
Type(x) が Number でなければ、ステップ 11 へ。
x が NaN ならば、 false を返す。
y が NaN ならば、 false を返す。
x が y と同じ数ならば、 true を返す。
x が +0 で y が -0 ならば、 true を返す。
x が -0 で y が +0 ならば、 true を返す。
false を返す。
Type(x) が String ならば、x と y の文字シーケンスが完全に同じ(同じ長さで対応する位置に同じ文字がある)なら true を返し、そうでなければ false を返す。
Type(x) が Boolean ならば、 x と y がともに true かともに false なら true を返し、そうでなければ false を返す。
x と y が同じオブジェクトを参照しているか、または互いに結合しているオブジェクト(セクション13.1.2) を参照していれば true を返し、そうでなければ false を返す。
x が null で y が undefined ならば、 true を返す。
x が undefined で y が null ならば、 true を返す。
Type(x) が Number で Type(y) が String ならば、比較 x == ToNumber(y) の結果を返す。
Type(x) が String で Type(y) が Number ならば、比較 ToNumber(x) == y の結果を返す。
Type(x) が Boolean ならば、比較 ToNumber(x) == y の結果を返す。
Type(y) が Boolean ならば、比較 x == ToNumber(y) の結果を返す。
Type(x) が String か Number で Type(y) が Object ならば、比較 x == ToPrimitive(y) の結果を返す。
Type(x) が Object で Type(y) が String か Number ならば、比較 ToPrimitive(x) == y の結果を返す。
false を返す。
NOTE 等価の上の定義を与えられる:
"" + a == "" + b で文字列比較を強制できる。
a - 0 == b - 0 で数値比較を強制できる。
!a == !b で真偽比較を強制できる。
等価演算子は次の invariants を維持する:
A != B は !(A == B) と等しい。
A == B は、 A と B の評価の順序を除き、 B == A と等しい。
等価演算子は常に通過 (transitive) ではない。例えば、同じ文字列値をあらわす 2 個の区別される String オブジェクトが存在可能である; それぞれの String オブジェクトは == 演算子によって文字列値が等しいとは考えられるが、 2 個の String オブジェクトは互いに等価にはならな。
文字列比較は、コードポイント値のシーケンスの値に単純な等価検査を使用する。文字や文字列の等価性、および Unicode 2.0 仕様 で定義される順序の照合の、より複雑で意味論的に指向した定義を用いる試みはない。それゆえ、 Unicode 標準によって規準的に等しい文字列が不等価と検査されるかもしれない。効果においてこのアルゴリズムは、双方の文字列が既に正規化形式であることを想定する。
11.9.4 厳密等価演算子 (The Strict Equals Operator) ( === )
生成規則 EqualityExpression : EqualityExpression === RelationalExpression は、次のように評価される:
EqualityExpression を評価。
GetValue(Result(1)) を呼出す。
RelationalExpression を評価。
GetValue(Result(3)) を呼出す。
比較 Result(4) === Result(2) を行う。 (後述)
Result(5) を返す。
11.9.5 厳密不等価演算子 (The Strict Does-not-equal Operator) ( !== )
EqualityExpression を評価。
GetValue(Result(1)) を呼出す。
RelationalExpression を評価。
GetValue(Result(3)) を呼出す。
比較 Result(4) === Result(2) を行う。 (後述)
Result(5) を返す。
11.9.5 厳密不等価演算子 (The Strict Does-not-equal Operator) ( !== )
生成規則 EqualityExpression : EqualityExpression !== RelationalExpression は、次のように評価される:
EqualityExpression を評価。
GetValue(Result(1)) を呼出す。
RelationalExpression を評価。
GetValue(Result(3)) を呼出す。
比較 Result(4) === Result(2) を行う。 (後述)
Result(5) が true ならば、 false を返す。そうでなければ、 true を返す。
11.9.6 厳密等価比較アルゴリズム (The Strict Equality Comparison Algorithm)
EqualityExpression を評価。
GetValue(Result(1)) を呼出す。
RelationalExpression を評価。
GetValue(Result(3)) を呼出す。
比較 Result(4) === Result(2) を行う。 (後述)
Result(5) が true ならば、 false を返す。そうでなければ、 true を返す。
11.9.6 厳密等価比較アルゴリズム (The Strict Equality Comparison Algorithm)
x と y を値として、比較 x === y は true または false を生成する。そのような比較は次のように行われる:
Type(x) が Type(y) と異なるならば、 false を返す。
Type(x) が Undefined ならば、 true を返す。
Type(x) が Null ならば、 true を返す。
Type(x) が Number でないならば、 ステップ 11 へ。
x が NaN ならば、 false を返す。
y が NaN ならば、 false を返す。
x が y と同じ数ならば、 true を返す。
x が +0 かつ y が -0 ならば、 true を返す。
x が -0 かつ y が +0 ならば、 true を返す。
false を返す。
Type(x) が String ならば、 x と y が厳密に同じ文字シーケンス (同じ長さで対応する位置が同じ文字) であるなら true を返す; そうでないならば、 false を返す。
If Type(x) が Boolean ならば、 x と y が共に true であるか、共に false であるなら true を返す; そうでないならば、 false を返す。
x と y が同じオブジェクトを参照しているならば、またそれらが互いに結合したオブジェクト (セクション 13.1.2) を参照しているならば、 true を返す。そうでないならば、 false を返す。
Type(x) が Type(y) と異なるならば、 false を返す。
Type(x) が Undefined ならば、 true を返す。
Type(x) が Null ならば、 true を返す。
Type(x) が Number でないならば、 ステップ 11 へ。
x が NaN ならば、 false を返す。
y が NaN ならば、 false を返す。
x が y と同じ数ならば、 true を返す。
x が +0 かつ y が -0 ならば、 true を返す。
x が -0 かつ y が +0 ならば、 true を返す。
false を返す。
Type(x) が String ならば、 x と y が厳密に同じ文字シーケンス (同じ長さで対応する位置が同じ文字) であるなら true を返す; そうでないならば、 false を返す。
If Type(x) が Boolean ならば、 x と y が共に true であるか、共に false であるなら true を返す; そうでないならば、 false を返す。
x と y が同じオブジェクトを参照しているならば、またそれらが互いに結合したオブジェクト (セクション 13.1.2) を参照しているならば、 true を返す。そうでないならば、 false を返す。
11.10 バイナリビット演算子 (Binary Bitwise Operators)
Syntax
BitwiseANDExpression :
EqualityExpression
BitwiseANDExpression & EqualityExpression
BitwiseANDExpressionNoIn :
EqualityExpressionNoIn
BitwiseANDExpressionNoIn & EqualityExpressionNoIn
BitwiseXORExpression :
BitwiseANDExpression
BitwiseXORExpression ^ BitwiseANDExpression
BitwiseXORExpressionNoIn :
BitwiseANDExpressionNoIn
BitwiseXORExpressionNoIn ^ BitwiseANDExpressionNoIn
BitwiseORExpression :
BitwiseXORExpression
BitwiseORExpression | BitwiseXORExpression
BitwiseORExpressionNoIn :
BitwiseXORExpressionNoIn
BitwiseORExpressionNoIn | BitwiseXORExpressionNoIn
Semantics
@ のところを上の生成規則のビット演算子として、生成規則 A : A @ B は、次のように評価される:
A を評価。
GetValue(Result(1)) を呼出す。
B を評価。
GetValue(Result(3)) を呼出す。
ToInt32(Result(2)) を呼出す。
ToInt32(Result(4)) を呼出す。
ビット演算子 @ を Result(5) と Result(6) に適用する。結果は符号付 32 ビット整数である。
Result(7) を返す。
11.11 バイナリ論理演算子 (Binary Logical Operators)
BitwiseANDExpression :
EqualityExpression
BitwiseANDExpression & EqualityExpression
BitwiseANDExpressionNoIn :
EqualityExpressionNoIn
BitwiseANDExpressionNoIn & EqualityExpressionNoIn
BitwiseXORExpression :
BitwiseANDExpression
BitwiseXORExpression ^ BitwiseANDExpression
BitwiseXORExpressionNoIn :
BitwiseANDExpressionNoIn
BitwiseXORExpressionNoIn ^ BitwiseANDExpressionNoIn
BitwiseORExpression :
BitwiseXORExpression
BitwiseORExpression | BitwiseXORExpression
BitwiseORExpressionNoIn :
BitwiseXORExpressionNoIn
BitwiseORExpressionNoIn | BitwiseXORExpressionNoIn
Semantics
@ のところを上の生成規則のビット演算子として、生成規則 A : A @ B は、次のように評価される:
A を評価。
GetValue(Result(1)) を呼出す。
B を評価。
GetValue(Result(3)) を呼出す。
ToInt32(Result(2)) を呼出す。
ToInt32(Result(4)) を呼出す。
ビット演算子 @ を Result(5) と Result(6) に適用する。結果は符号付 32 ビット整数である。
Result(7) を返す。
11.11 バイナリ論理演算子 (Binary Logical Operators)
Syntax
LogicalANDExpression :
BitwiseORExpression
LogicalANDExpression && BitwiseORExpression
LogicalANDExpressionNoIn :
BitwiseORExpressionNoIn
LogicalANDExpressionNoIn && BitwiseORExpressionNoIn
LogicalORExpression :
LogicalANDExpression
LogicalORExpression || LogicalANDExpression
LogicalORExpressionNoIn :
LogicalANDExpressionNoIn
LogicalORExpressionNoIn || LogicalANDExpressionNoIn
Semantics
生成規則 LogicalANDExpression : LogicalANDExpression && BitwiseORExpression は、次のように評価される:
LogicalANDExpression を評価。
GetValue(Result(1)) を呼出す。
ToBoolean(Result(2)) を呼出す。
Result(3) が false ならば、 Result(2) を返す。
BitwiseORExpression を評価。
GetValue(Result(5)) を呼出す。
Result(6) を返す。
生成規則 LogicalORExpression : LogicalORExpression || LogicalANDExpression は、次のように評価される:
LogicalORExpression を評価。
GetValue(Result(1)) を呼出す。
ToBoolean(Result(2)) を呼出す。
Result(3) が true ならば、 Result(2) を返す。
LogicalANDExpression を評価。
GetValue(Result(5)) を呼出す。
Result(6) を返す。
LogicalANDExpressionNoIn 生成規則と LogicalORExpressionNoIn 生成規則は、 LogicalANDExpression 生成規則と LogicalORExpression 生成規則と同様に評価されるが、内部の LogicalANDExpression, BitwiseORExpression, LogicalORExpression, の代わりに、それぞれ LogicalANDExpressionNoIn, BitwiseORExpressionNoIn, LogicalORExpressionNoIn が評価される。
NOTE && 演算子、また || 演算子の生成する値が Boolean 型である必要はない。生成される値は常に、 2 個の項式のうちの 1 つの値である。.
11.12 条件演算子 (Conditional Operator) ( ?: )
LogicalANDExpression :
BitwiseORExpression
LogicalANDExpression && BitwiseORExpression
LogicalANDExpressionNoIn :
BitwiseORExpressionNoIn
LogicalANDExpressionNoIn && BitwiseORExpressionNoIn
LogicalORExpression :
LogicalANDExpression
LogicalORExpression || LogicalANDExpression
LogicalORExpressionNoIn :
LogicalANDExpressionNoIn
LogicalORExpressionNoIn || LogicalANDExpressionNoIn
Semantics
生成規則 LogicalANDExpression : LogicalANDExpression && BitwiseORExpression は、次のように評価される:
LogicalANDExpression を評価。
GetValue(Result(1)) を呼出す。
ToBoolean(Result(2)) を呼出す。
Result(3) が false ならば、 Result(2) を返す。
BitwiseORExpression を評価。
GetValue(Result(5)) を呼出す。
Result(6) を返す。
生成規則 LogicalORExpression : LogicalORExpression || LogicalANDExpression は、次のように評価される:
LogicalORExpression を評価。
GetValue(Result(1)) を呼出す。
ToBoolean(Result(2)) を呼出す。
Result(3) が true ならば、 Result(2) を返す。
LogicalANDExpression を評価。
GetValue(Result(5)) を呼出す。
Result(6) を返す。
LogicalANDExpressionNoIn 生成規則と LogicalORExpressionNoIn 生成規則は、 LogicalANDExpression 生成規則と LogicalORExpression 生成規則と同様に評価されるが、内部の LogicalANDExpression, BitwiseORExpression, LogicalORExpression, の代わりに、それぞれ LogicalANDExpressionNoIn, BitwiseORExpressionNoIn, LogicalORExpressionNoIn が評価される。
NOTE && 演算子、また || 演算子の生成する値が Boolean 型である必要はない。生成される値は常に、 2 個の項式のうちの 1 つの値である。.
11.12 条件演算子 (Conditional Operator) ( ?: )
Syntax
ConditionalExpression :
LogicalORExpression
LogicalORExpression ? AssignmentExpression : AssignmentExpression
ConditionalExpressionNoIn :
LogicalORExpressionNoIn
LogicalORExpressionNoIn ? AssignmentExpression : AssignmentExpressionNoIn
Semantics
生成規則 ConditionalExpression : LogicalORExpression ? AssignmentExpression : AssignmentExpression は、次のように評価される:
LogicalORExpression を評価。
GetValue(Result(1)) を呼出す。
ToBoolean(Result(2)) を呼出す。
Result(3) が false ならば、ステップ 8 へ。
最初の AssignmentExpression を評価。
GetValue(Result(5)) を呼出す。
Result(6) を返す。
2 番目の AssignmentExpression を評価。
GetValue(Result(8)) を呼出す。
Result(9) を返す。
ConditionalExpressionNoIn 生成規則は、 ConditionalExpression 生成規則と同様に評価されるが、内部の LogicalORExpression, 1 つ目の AssignmentExpression, 2 つ目の AssignmentExpression, の代わりに、それぞれ LogicalORExpressionNoIn, AssignmentExpression, AssignmentExpressionNoIn が評価される。
NOTE ECMAScript における ConditionalExpression の文法は、 C および JAVA とは若干異なり、 2 つ目の部分式が Expression であることをそれぞれ許可するが、 3 つ目の式が ConditionalExpression であることを制限する。 ECMAScript におけるこの差異は、 代入式がどちらの条件にも左右されることを許可し、混乱と中央式がカンマ式であるようなあまり意味のないケースを考慮しないことを動機としている。
11.13 代入演算子 (Assignment Operators)
ConditionalExpression :
LogicalORExpression
LogicalORExpression ? AssignmentExpression : AssignmentExpression
ConditionalExpressionNoIn :
LogicalORExpressionNoIn
LogicalORExpressionNoIn ? AssignmentExpression : AssignmentExpressionNoIn
Semantics
生成規則 ConditionalExpression : LogicalORExpression ? AssignmentExpression : AssignmentExpression は、次のように評価される:
LogicalORExpression を評価。
GetValue(Result(1)) を呼出す。
ToBoolean(Result(2)) を呼出す。
Result(3) が false ならば、ステップ 8 へ。
最初の AssignmentExpression を評価。
GetValue(Result(5)) を呼出す。
Result(6) を返す。
2 番目の AssignmentExpression を評価。
GetValue(Result(8)) を呼出す。
Result(9) を返す。
ConditionalExpressionNoIn 生成規則は、 ConditionalExpression 生成規則と同様に評価されるが、内部の LogicalORExpression, 1 つ目の AssignmentExpression, 2 つ目の AssignmentExpression, の代わりに、それぞれ LogicalORExpressionNoIn, AssignmentExpression, AssignmentExpressionNoIn が評価される。
NOTE ECMAScript における ConditionalExpression の文法は、 C および JAVA とは若干異なり、 2 つ目の部分式が Expression であることをそれぞれ許可するが、 3 つ目の式が ConditionalExpression であることを制限する。 ECMAScript におけるこの差異は、 代入式がどちらの条件にも左右されることを許可し、混乱と中央式がカンマ式であるようなあまり意味のないケースを考慮しないことを動機としている。
11.13 代入演算子 (Assignment Operators)
Syntax
AssignmentExpression :
ConditionalExpression
LeftHandSideExpression AssignmentOperator AssignmentExpression
AssignmentExpressionNoIn :
ConditionalExpressionNoIn
LeftHandSideExpression AssignmentOperator AssignmentExpressionNoIn
AssignmentOperator : one of
= *= /= %= += -= <<= >>= >>>= &= ^= |=
Semantics
AssignmentExpressionNoIn 生成規則は、 AssignmentExpression と同様に評価されるが、 AssignmentExpression に含まれる ConditionalExpression と AssignmentExpression の代わりに ConditionalExpressionNoIn 及び AssignmentExpressionNoIn がそれぞれ評価される。
11.13.1 単純代入 (Simple Assignment) ( = )
AssignmentExpression :
ConditionalExpression
LeftHandSideExpression AssignmentOperator AssignmentExpression
AssignmentExpressionNoIn :
ConditionalExpressionNoIn
LeftHandSideExpression AssignmentOperator AssignmentExpressionNoIn
AssignmentOperator : one of
= *= /= %= += -= <<= >>= >>>= &= ^= |=
Semantics
AssignmentExpressionNoIn 生成規則は、 AssignmentExpression と同様に評価されるが、 AssignmentExpression に含まれる ConditionalExpression と AssignmentExpression の代わりに ConditionalExpressionNoIn 及び AssignmentExpressionNoIn がそれぞれ評価される。
11.13.1 単純代入 (Simple Assignment) ( = )
生成規則 AssignmentExpression : LeftHandSideExpression = AssignmentExpression は、次のように評価される:
LeftHandSideExpression を評価。
AssignmentExpression を評価。
GetValue(Result(2)) を呼出す。
PutValue(Result(1), Result(3)) を呼出す。
Result(3) を返す。
11.13.2 複合代入 (Compound Assignment) ( op= )
LeftHandSideExpression を評価。
AssignmentExpression を評価。
GetValue(Result(2)) を呼出す。
PutValue(Result(1), Result(3)) を呼出す。
Result(3) を返す。
11.13.2 複合代入 (Compound Assignment) ( op= )
@ のところは上に示した演算子の一つをあらわす生成規則 AssignmentExpression : LeftHandSideExpression @ = AssignmentExpression は、次のように評価される:
LeftHandSideExpression を評価。
GetValue(Result(1)) を呼出す。
AssignmentExpression を評価。
GetValue(Result(3)) を呼出す。
Result(2) と Result(4) に、演算子 @ を適用する。
PutValue(Result(1), Result(5)) を呼出す。
Result(5) を返す。
11.14 カンマ演算子 (Comma Operator) ( , )
LeftHandSideExpression を評価。
GetValue(Result(1)) を呼出す。
AssignmentExpression を評価。
GetValue(Result(3)) を呼出す。
Result(2) と Result(4) に、演算子 @ を適用する。
PutValue(Result(1), Result(5)) を呼出す。
Result(5) を返す。
11.14 カンマ演算子 (Comma Operator) ( , )
Syntax
Expression :
AssignmentExpression
Expression , AssignmentExpression
ExpressionNoIn :
AssignmentExpressionNoIn
ExpressionNoIn , AssignmentExpressionNoIn
Semantics
生成規則 Expression : Expression , AssignmentExpression は、次のように評価される:
Expression を評価。
GetValue(Result(1)) を呼出す。
AssignmentExpression を評価。
GetValue(Result(3)) を呼出す。
Result(4) を返す。
ExpressionNoIn 生成規則は、 Expression 生成規則と同様に評価されるが、 Expression と AssignmentExpression, の代わりに、それぞれ ExpressionNoIn と AssignmentExpressionNoIn が評価される。
Expression :
AssignmentExpression
Expression , AssignmentExpression
ExpressionNoIn :
AssignmentExpressionNoIn
ExpressionNoIn , AssignmentExpressionNoIn
Semantics
生成規則 Expression : Expression , AssignmentExpression は、次のように評価される:
Expression を評価。
GetValue(Result(1)) を呼出す。
AssignmentExpression を評価。
GetValue(Result(3)) を呼出す。
Result(4) を返す。
ExpressionNoIn 生成規則は、 Expression 生成規則と同様に評価されるが、 Expression と AssignmentExpression, の代わりに、それぞれ ExpressionNoIn と AssignmentExpressionNoIn が評価される。
文 (Statements)
Syntax
Statement :
Block
VariableStatement
EmptyStatement
ExpressionStatement
IfStatement
IterationStatement
ContinueStatement
BreakStatement
ReturnStatement
WithStatement
LabelledStatement
SwitchStatement
ThrowStatement
TryStatement
Semantics
Statement は LabelledStatement の一部となりうるし、それ自身が LabelledStatement の一部であってもよく、以下同様である。この方法でつけられたラベルは、個々の文の意味論記述において "現在のラベルセット (current label set)" として併せて参照される。 LabelledStatement はラベルセットへのラベルの導入以外の意味論を持たない。 IterationStatement または SwitchStatement のラベルセットは最初は単一の要素 empty で構成される。任意の他の文のラベルセットは初期は empty である。
12.1 ブロック (Block)
Statement :
Block
VariableStatement
EmptyStatement
ExpressionStatement
IfStatement
IterationStatement
ContinueStatement
BreakStatement
ReturnStatement
WithStatement
LabelledStatement
SwitchStatement
ThrowStatement
TryStatement
Semantics
Statement は LabelledStatement の一部となりうるし、それ自身が LabelledStatement の一部であってもよく、以下同様である。この方法でつけられたラベルは、個々の文の意味論記述において "現在のラベルセット (current label set)" として併せて参照される。 LabelledStatement はラベルセットへのラベルの導入以外の意味論を持たない。 IterationStatement または SwitchStatement のラベルセットは最初は単一の要素 empty で構成される。任意の他の文のラベルセットは初期は empty である。
12.1 ブロック (Block)
Syntax
Block :
{ StatementListopt }
StatementList :
Statement
StatementList Statement
Semantics
生成規則 Block : { } は、次のように評価される:
(normal, empty, empty) を返す。
生成規則 Block : { StatementList } は、次のように評価される:
StatementList を評価。
Result(1) を返す。
生成規則 StatementList : Statement は、次のように評価される:
Statement を評価。
例外が投げられたら、(throw, V, empty) を返す。 V は例外である。 (ここでは例外が返されないかのように実行は進行する。)
Result(1) を返す。
生成規則 StatementList : StatementList Statement は、次のように評価される:
StatementList を評価。
Result(1) が中途完了であれば、 Result(1) を返す。
Statement を評価。
例外が投げられたら、(throw, V, empty) を返す。 V は例外である。 (ここでは例外が返されないかのように実行は進行する。)
Result(3).value が empty であれば、 V = Result(1).value とし、そうでなければ V = Result(3).value とする。
(Result(3).type, V, Result(3).target) を返す。
12.2 変数文 (Variable statement)
Block :
{ StatementListopt }
StatementList :
Statement
StatementList Statement
Semantics
生成規則 Block : { } は、次のように評価される:
(normal, empty, empty) を返す。
生成規則 Block : { StatementList } は、次のように評価される:
StatementList を評価。
Result(1) を返す。
生成規則 StatementList : Statement は、次のように評価される:
Statement を評価。
例外が投げられたら、(throw, V, empty) を返す。 V は例外である。 (ここでは例外が返されないかのように実行は進行する。)
Result(1) を返す。
生成規則 StatementList : StatementList Statement は、次のように評価される:
StatementList を評価。
Result(1) が中途完了であれば、 Result(1) を返す。
Statement を評価。
例外が投げられたら、(throw, V, empty) を返す。 V は例外である。 (ここでは例外が返されないかのように実行は進行する。)
Result(3).value が empty であれば、 V = Result(1).value とし、そうでなければ V = Result(3).value とする。
(Result(3).type, V, Result(3).target) を返す。
12.2 変数文 (Variable statement)
Syntax
VariableStatement :
var VariableDeclarationList ;
VariableDeclarationList :
VariableDeclaration
VariableDeclarationList , VariableDeclaration
VariableDeclarationListNoIn :
VariableDeclarationNoIn
VariableDeclarationListNoIn , VariableDeclarationNoIn
VariableDeclaration :
Identifier Initialiseropt
VariableDeclarationNoIn :
Identifier InitialiserNoInopt
Initialiser :
= AssignmentExpression
InitialiserNoIn :
= AssignmentExpressionNoIn
Description
FunctionDeclaration 内部で変数文が発生するならば、その変数は、セクション 10.1.3 にあるように、その関数内の関数ローカルスコープで定義される。そうでないならば、それらはプロパティ属性 { DontDelete } のグローバルスコープで定義される(つまり、セクション10.1.3 にあるグローバルオブジェクトのメンバとして作成される)。変数は実行スコープに入ったときに生成される。 Block は新しい実行スコープを定義しない。 Program と FunctionDeclaration だけが新しいスコープを生成する。生成時、変数は undefined で初期化される。イニシャライザを持つ変数が AssignmentExpression の値を代入されるのは VariableStatement が実行されるときであり、変数が生成されたときではない。
Semantics
生成規則 VariableStatement : var VariableDeclarationList ; は、次のように評価される:
VariableDeclarationList を評価。
(normal, empty, empty) を返す。
生成規則 VariableDeclarationList : VariableDeclaration は、次のように評価される:
VariableDeclaration を評価。
生成規則 VariableDeclarationList : VariableDeclarationList , VariableDeclaration は、次のように評価される:
VariableDeclarationList を評価。
VariableDeclaration を評価。
生成規則 VariableDeclaration : Identifier は、次のように評価される:
Identifier と同じ文字シーケンスで構成される文字列値を返す。
生成規則 VariableDeclaration : Identifier Initialiser は、次のように評価される:
セクション 11.1.2 にあるように Identifier を評価。
Initialiser を評価。
GetValue(Result(2)) を呼出す。
PutValue(Result(1), Result(3)) を呼出す。
Identifier と同じ文字シーケンスで構成される文字列値を返す。
生成規則 Initialiser : = AssignmentExpression は、次のように評価される:
AssignmentExpression を評価。
Result(1) を返す。
生成規則 VariableDeclarationListNoIn, VariableDeclarationNoIn, InitialiserNoIn は、生成規則 VariableDeclarationList, VariableDeclaration, Initialiser と同様に評価されるが、 VariableDeclarationList, VariableDeclaration, Initialiser, AssignmentExpression の代わりに、それぞれ VariableDeclarationListNoIn, VariableDeclarationNoIn, InitialiserNoIn, AssignmentExpressionNoIn が評価される。
12.3 空文 (Empty Statement)
VariableStatement :
var VariableDeclarationList ;
VariableDeclarationList :
VariableDeclaration
VariableDeclarationList , VariableDeclaration
VariableDeclarationListNoIn :
VariableDeclarationNoIn
VariableDeclarationListNoIn , VariableDeclarationNoIn
VariableDeclaration :
Identifier Initialiseropt
VariableDeclarationNoIn :
Identifier InitialiserNoInopt
Initialiser :
= AssignmentExpression
InitialiserNoIn :
= AssignmentExpressionNoIn
Description
FunctionDeclaration 内部で変数文が発生するならば、その変数は、セクション 10.1.3 にあるように、その関数内の関数ローカルスコープで定義される。そうでないならば、それらはプロパティ属性 { DontDelete } のグローバルスコープで定義される(つまり、セクション10.1.3 にあるグローバルオブジェクトのメンバとして作成される)。変数は実行スコープに入ったときに生成される。 Block は新しい実行スコープを定義しない。 Program と FunctionDeclaration だけが新しいスコープを生成する。生成時、変数は undefined で初期化される。イニシャライザを持つ変数が AssignmentExpression の値を代入されるのは VariableStatement が実行されるときであり、変数が生成されたときではない。
Semantics
生成規則 VariableStatement : var VariableDeclarationList ; は、次のように評価される:
VariableDeclarationList を評価。
(normal, empty, empty) を返す。
生成規則 VariableDeclarationList : VariableDeclaration は、次のように評価される:
VariableDeclaration を評価。
生成規則 VariableDeclarationList : VariableDeclarationList , VariableDeclaration は、次のように評価される:
VariableDeclarationList を評価。
VariableDeclaration を評価。
生成規則 VariableDeclaration : Identifier は、次のように評価される:
Identifier と同じ文字シーケンスで構成される文字列値を返す。
生成規則 VariableDeclaration : Identifier Initialiser は、次のように評価される:
セクション 11.1.2 にあるように Identifier を評価。
Initialiser を評価。
GetValue(Result(2)) を呼出す。
PutValue(Result(1), Result(3)) を呼出す。
Identifier と同じ文字シーケンスで構成される文字列値を返す。
生成規則 Initialiser : = AssignmentExpression は、次のように評価される:
AssignmentExpression を評価。
Result(1) を返す。
生成規則 VariableDeclarationListNoIn, VariableDeclarationNoIn, InitialiserNoIn は、生成規則 VariableDeclarationList, VariableDeclaration, Initialiser と同様に評価されるが、 VariableDeclarationList, VariableDeclaration, Initialiser, AssignmentExpression の代わりに、それぞれ VariableDeclarationListNoIn, VariableDeclarationNoIn, InitialiserNoIn, AssignmentExpressionNoIn が評価される。
12.3 空文 (Empty Statement)
Syntax
EmptyStatement :
;
Semantics
生成規則 EmptyStatement : ; は、次のように評価される:
(normal, empty, empty) を返す。
12.4 式文 (Expression Statement)
EmptyStatement :
;
Semantics
生成規則 EmptyStatement : ; は、次のように評価される:
(normal, empty, empty) を返す。
12.4 式文 (Expression Statement)
Syntax
ExpressionStatement :
[lookahead ∉ {{, function} ] Expression ;
Block と曖昧になることから、 ExpressionStatement は大括弧 "{" で開始することはできないことに注意。また、 FunctionDeclaration と曖昧になることから、 ExpressionStatement は function キーワードで開始することもできない。
Semantics
生成規則 ExpressionStatement : [lookahead ∉ {{, function}] Expression ; は、次のように評価される:
Expression を評価する。
GetValue(Result(1)) を呼出す。
(normal, Result(2), empty) を返す。
12.5 if 文 (The if Statement)
ExpressionStatement :
[lookahead ∉ {{, function} ] Expression ;
Block と曖昧になることから、 ExpressionStatement は大括弧 "{" で開始することはできないことに注意。また、 FunctionDeclaration と曖昧になることから、 ExpressionStatement は function キーワードで開始することもできない。
Semantics
生成規則 ExpressionStatement : [lookahead ∉ {{, function}] Expression ; は、次のように評価される:
Expression を評価する。
GetValue(Result(1)) を呼出す。
(normal, Result(2), empty) を返す。
12.5 if 文 (The if Statement)
Syntax
IfStatement :
if ( Expression ) Statement else Statement
if ( Expression ) Statement
関連する if の選択が曖昧な else は、可能な限り最も近い、関連しなければ該当する else がないような if にそれぞれ関連している。
Semantics
生成規則 IfStatement : if ( Expression ) Statement else Statement は、次のように評価される:
Expression を評価。
GetValue(Result(1)) を呼出す。
ToBoolean(Result(2)) を呼出す。
Result(3) が false ならば、ステップ 7 へ。
最初の Statement を評価。
Result(5) を返す。
2 番目の Statement を評価。
Result(7) を返す。
生成規則 IfStatement : if ( Expression ) Statement は、次のように評価される:
Expression を評価。
GetValue(Result(1)) を呼出す。
ToBoolean(Result(2)) を呼出す。
Result(3) が false ならば、 (normal, empty, empty) を返す。
Result(3) が false ならば、 (normal, empty, empty) を返す。
Statement を評価。
Result(5) を返す。
12.6 繰返し文 (Iteration Statements)
IfStatement :
if ( Expression ) Statement else Statement
if ( Expression ) Statement
関連する if の選択が曖昧な else は、可能な限り最も近い、関連しなければ該当する else がないような if にそれぞれ関連している。
Semantics
生成規則 IfStatement : if ( Expression ) Statement else Statement は、次のように評価される:
Expression を評価。
GetValue(Result(1)) を呼出す。
ToBoolean(Result(2)) を呼出す。
Result(3) が false ならば、ステップ 7 へ。
最初の Statement を評価。
Result(5) を返す。
2 番目の Statement を評価。
Result(7) を返す。
生成規則 IfStatement : if ( Expression ) Statement は、次のように評価される:
Expression を評価。
GetValue(Result(1)) を呼出す。
ToBoolean(Result(2)) を呼出す。
Result(3) が false ならば、 (normal, empty, empty) を返す。
Result(3) が false ならば、 (normal, empty, empty) を返す。
Statement を評価。
Result(5) を返す。
12.6 繰返し文 (Iteration Statements)
繰返し文は (キーワードと括弧の制御構造で構成される) ヘッダと (Statement で構成される) 本文で構成される。
Syntax
IterationStatement :
do Statement while ( Expression );
while ( Expression ) Statement
for (ExpressionNoInopt; Expressionopt ; Expressionopt ) Statement
for ( var VariableDeclarationListNoIn; Expressionopt ; Expressionopt ) Statement
for ( LeftHandSideExpression in Expression ) Statement
for ( var VariableDeclarationNoIn in Expression ) Statement
12.6.1 do-while 文 (The do-while Statement)
Syntax
IterationStatement :
do Statement while ( Expression );
while ( Expression ) Statement
for (ExpressionNoInopt; Expressionopt ; Expressionopt ) Statement
for ( var VariableDeclarationListNoIn; Expressionopt ; Expressionopt ) Statement
for ( LeftHandSideExpression in Expression ) Statement
for ( var VariableDeclarationNoIn in Expression ) Statement
12.6.1 do-while 文 (The do-while Statement)
生成規則 do Statement while ( Expression ); は、次のように評価される:
V = empty とする。
Statement を評価。
Result(2).value が empty でなければ、 V = Result(2).value とする。
Result(2).type が continue で、かつ Result(2).target が現在のラベルセット内にあれば、ステップ 7 へ。
Result(2).type が break で、かつ Result(2).target が現在のラベルセット内にあれば、 (normal, V, empty) を返す。
Result(2) が中途完了ならば、 Result(2) を返す。
Expression を評価。
GetValue(Result(7)) を呼出す。
ToBoolean(Result(8)) を呼出す。
Result(9) が true ならば、ステップ 2 ヘ。
(normal, V, empty) を返す。
12.6.2 while 文 (The while statement)
V = empty とする。
Statement を評価。
Result(2).value が empty でなければ、 V = Result(2).value とする。
Result(2).type が continue で、かつ Result(2).target が現在のラベルセット内にあれば、ステップ 7 へ。
Result(2).type が break で、かつ Result(2).target が現在のラベルセット内にあれば、 (normal, V, empty) を返す。
Result(2) が中途完了ならば、 Result(2) を返す。
Expression を評価。
GetValue(Result(7)) を呼出す。
ToBoolean(Result(8)) を呼出す。
Result(9) が true ならば、ステップ 2 ヘ。
(normal, V, empty) を返す。
12.6.2 while 文 (The while statement)
生成規則 IterationStatement : while ( Expression ) Statement は、次のように評価される:
V = empty とする。
Expression を評価。
GetValue(Result(2)) を呼出す。
ToBoolean(Result(3)) を呼出す。
Result(4) が false ならば、 (normal, V, empty) を返す。
Statement を評価。
Result(6).value が empty でなければ、 V = Result(6).value とする。
Result(6).type が continue かつ Result(6).target が現在のラベルセットならば、ステップ 2 へ。
Result(6).type が break かつ Result(6).target が現在のラベルセットならば、 (normal, V, empty) を返す。
Result(6) が中途完了ならば、 Result(6) を返す。
ステップ 2 へ。
12.6.3 for 文 (The for Statement)
V = empty とする。
Expression を評価。
GetValue(Result(2)) を呼出す。
ToBoolean(Result(3)) を呼出す。
Result(4) が false ならば、 (normal, V, empty) を返す。
Statement を評価。
Result(6).value が empty でなければ、 V = Result(6).value とする。
Result(6).type が continue かつ Result(6).target が現在のラベルセットならば、ステップ 2 へ。
Result(6).type が break かつ Result(6).target が現在のラベルセットならば、 (normal, V, empty) を返す。
Result(6) が中途完了ならば、 Result(6) を返す。
ステップ 2 へ。
12.6.3 for 文 (The for Statement)
生成規則 IterationStatement : for (ExpressionNoInopt ; Expressionopt ; Expressionopt) Statement は、次のように評価される:
ExpressionNoIn が存在しなければ、ステップ 4 へ。
ExpressionNoIn を評価。
GetValue(Result(2)) を呼出す。 (この値は使用しない。)
V = empty とする。
最初の Expression が存在しなければ、ステップ 10 へ。
最初の Expression を評価。
GetValue(Result(6)) を呼出す。
ToBoolean(Result(7)) を呼出す。
Result(8) が false ならば、ステップ 19 へ。
Statement を評価。
Result(10).value が empty でないならば、 V = Result(10).value とする。
Result(10).type が break かつ Result(10).target が現在のラベルセットならば、ステップ 19 へ。
Result(10).type が continue かつ Result(10).target が現在のラベルセットならば、ステップ 15 へ。
Result(10) が中途完了ならば Result(10) を返す。
2 番目の Expression が存在しなければ、ステップ 5 へ。
2 番目の Expression を評価。
GetValue(Result(16) を呼出す。 (この値は使用しない。)
ステップ 5 へ。
(normal, V, empty) を返す。
生成規則 IterationStatement : for ( var VariableDeclarationListNoIn ; Expressionopt ; Expressionopt ) Statement は、次のように評価される:
VariableDeclarationListNoIn を評価。
V = empty とする。
1 個目の Expression が存在しないならば、 ステップ 8 へ。
1 個目の Expression を評価。
GetValue(Result(4)) を呼出す。
ToBoolean(Result(5)) を呼出す。
Result(6) が false ならば、 ステップ 17 へ。
Statement を評価。
Result(8).value が空でないならば、 V = Result(8).value とする。
Result(8).type が break かつ Result(8).target が現在のラベルセット内ならば、 ステップ 17 へ。
Result(8).type が continue かつ Result(8).target が現在のラベルセット内ならば、 ステップ 13 へ。
Result(8) が中途完了ならば、 Result(8) を返す。
2 個目の Expression が存在しないならば、 ステップ 3 へ。
2 個目の Expression を評価。
GetValue(Result(14)) を呼出す。 (この値は使用しない。)
ステップ 3 へ。
(normal, V, empty) を返す。
12.6.4 for-in 文 (The for-in Statement)
ExpressionNoIn が存在しなければ、ステップ 4 へ。
ExpressionNoIn を評価。
GetValue(Result(2)) を呼出す。 (この値は使用しない。)
V = empty とする。
最初の Expression が存在しなければ、ステップ 10 へ。
最初の Expression を評価。
GetValue(Result(6)) を呼出す。
ToBoolean(Result(7)) を呼出す。
Result(8) が false ならば、ステップ 19 へ。
Statement を評価。
Result(10).value が empty でないならば、 V = Result(10).value とする。
Result(10).type が break かつ Result(10).target が現在のラベルセットならば、ステップ 19 へ。
Result(10).type が continue かつ Result(10).target が現在のラベルセットならば、ステップ 15 へ。
Result(10) が中途完了ならば Result(10) を返す。
2 番目の Expression が存在しなければ、ステップ 5 へ。
2 番目の Expression を評価。
GetValue(Result(16) を呼出す。 (この値は使用しない。)
ステップ 5 へ。
(normal, V, empty) を返す。
生成規則 IterationStatement : for ( var VariableDeclarationListNoIn ; Expressionopt ; Expressionopt ) Statement は、次のように評価される:
VariableDeclarationListNoIn を評価。
V = empty とする。
1 個目の Expression が存在しないならば、 ステップ 8 へ。
1 個目の Expression を評価。
GetValue(Result(4)) を呼出す。
ToBoolean(Result(5)) を呼出す。
Result(6) が false ならば、 ステップ 17 へ。
Statement を評価。
Result(8).value が空でないならば、 V = Result(8).value とする。
Result(8).type が break かつ Result(8).target が現在のラベルセット内ならば、 ステップ 17 へ。
Result(8).type が continue かつ Result(8).target が現在のラベルセット内ならば、 ステップ 13 へ。
Result(8) が中途完了ならば、 Result(8) を返す。
2 個目の Expression が存在しないならば、 ステップ 3 へ。
2 個目の Expression を評価。
GetValue(Result(14)) を呼出す。 (この値は使用しない。)
ステップ 3 へ。
(normal, V, empty) を返す。
12.6.4 for-in 文 (The for-in Statement)
生成規則 IterationStatement : for ( LeftHandSideExpression in Expression ) Statement は、次のように評価される:
Expression を評価。
GetValue(Result(1)) を呼出す。
ToObject(Result(2)) を呼出す。
V = empty とする。
DontEnum 属性を持たない、 Result(3) の次のプロパティの名前を取得する。そのようなプロパティが存在しないならば、 ステップ 14 へ。
LeftHandSideExpression を評価 (これは繰返し評価されてよい)。
PutValue(Result(6), Result(5)) を呼出す。
Statement を評価。
Result(8).value が empty でないならば、 V = Result(8).value とする。
Result(8).type が break かつ Result(8).target が現在のラベルセット内ならば、 ステップ 14 へ。
Result(8).type が continue かつ Result(8).target が現在のラベルセット内ならば、 ステップ 5 へ。
Result(8) が中途完了ならば、 Result(8) を返す。
ステップ 5 へ。
(normal, V, empty) を返す。
生成規則 IterationStatement : for ( var VariableDeclarationNoIn in Expression ) Statement は、次のように評価される:
VariableDeclarationNoIn を評価。
Expression を評価。
GetValue(Result(2)) を呼出す。
ToObject(Result(3)) を呼出す。
V = empty とする。
DontEnum 属性を持たない、 Result(4) の次のプロパティを取得する。そのようなプロパティが存在しないならば、ステップ 15 へ。
それが Identifier であるかのように Result(1) を評価; 11.1.2 参照(これは繰返し評価されてよい).
PutValue(Result(7), Result(6)) を呼出す。
Statement を評価。
Result(9).value が empty でないならば、 V = Result(9).value とする。
Result(9).type が break かつ Result(9).target が現在のラベルセット内ならば、 ステップ 15 へ。
Result(9).type が continue かつ Result(9).target が現在のラベルセット内ならば、 ステップ 6 へ。
Result(8) が中途完了ならば、 Result(8) を返す。
ステップ 6 へ。
(normal, V, empty) を返す。
プロパティの列挙方法 (1 個目のアルゴリズムのステップ 5, 2 個目のステップ 6) は実装依存である。列挙の順序はオブジェクトにより定義される。列挙されているオブジェクトのプロパティは列挙中に削除されてもよい。列挙中まだ挙げられていないプロパティが削除されるならば、そのプロパティは列挙されない。列挙中オブジェクトに新しいプロパティが追加されるならば、新たに追加されたプロパティは現在の列挙において挙げられることを保証されない。
オブジェクトのプロパティ列挙は、そのプロトタイプのプロパティ、プロトタイプのプロトタイプのプロパティ、以下同様に再帰的にプロパティを含む; しかし、同名のプロパティを持つプロトタイプチェーン内の前のオブジェクトにより "隠される" ならば、プロトタイプのプロパティは列挙されない。
12.7 continue 文 (The continue Statement)
Expression を評価。
GetValue(Result(1)) を呼出す。
ToObject(Result(2)) を呼出す。
V = empty とする。
DontEnum 属性を持たない、 Result(3) の次のプロパティの名前を取得する。そのようなプロパティが存在しないならば、 ステップ 14 へ。
LeftHandSideExpression を評価 (これは繰返し評価されてよい)。
PutValue(Result(6), Result(5)) を呼出す。
Statement を評価。
Result(8).value が empty でないならば、 V = Result(8).value とする。
Result(8).type が break かつ Result(8).target が現在のラベルセット内ならば、 ステップ 14 へ。
Result(8).type が continue かつ Result(8).target が現在のラベルセット内ならば、 ステップ 5 へ。
Result(8) が中途完了ならば、 Result(8) を返す。
ステップ 5 へ。
(normal, V, empty) を返す。
生成規則 IterationStatement : for ( var VariableDeclarationNoIn in Expression ) Statement は、次のように評価される:
VariableDeclarationNoIn を評価。
Expression を評価。
GetValue(Result(2)) を呼出す。
ToObject(Result(3)) を呼出す。
V = empty とする。
DontEnum 属性を持たない、 Result(4) の次のプロパティを取得する。そのようなプロパティが存在しないならば、ステップ 15 へ。
それが Identifier であるかのように Result(1) を評価; 11.1.2 参照(これは繰返し評価されてよい).
PutValue(Result(7), Result(6)) を呼出す。
Statement を評価。
Result(9).value が empty でないならば、 V = Result(9).value とする。
Result(9).type が break かつ Result(9).target が現在のラベルセット内ならば、 ステップ 15 へ。
Result(9).type が continue かつ Result(9).target が現在のラベルセット内ならば、 ステップ 6 へ。
Result(8) が中途完了ならば、 Result(8) を返す。
ステップ 6 へ。
(normal, V, empty) を返す。
プロパティの列挙方法 (1 個目のアルゴリズムのステップ 5, 2 個目のステップ 6) は実装依存である。列挙の順序はオブジェクトにより定義される。列挙されているオブジェクトのプロパティは列挙中に削除されてもよい。列挙中まだ挙げられていないプロパティが削除されるならば、そのプロパティは列挙されない。列挙中オブジェクトに新しいプロパティが追加されるならば、新たに追加されたプロパティは現在の列挙において挙げられることを保証されない。
オブジェクトのプロパティ列挙は、そのプロトタイプのプロパティ、プロトタイプのプロトタイプのプロパティ、以下同様に再帰的にプロパティを含む; しかし、同名のプロパティを持つプロトタイプチェーン内の前のオブジェクトにより "隠される" ならば、プロトタイプのプロパティは列挙されない。
12.7 continue 文 (The continue Statement)
Syntax
ContinueStatement :
continue [LineTerminator 無し] Identifieropt ;
Semantics
次のいずれかが真であるとき、プログラムは構文的に不正であると考えられる:
プログラムが選択的 Identifier を持たない continue 宣言で構成されていて、直接または間接的に(関数の区切りにまたがらない)、 IterationStatement 内にネストしなていない。
プログラムが選択的 Identifier を持つ continue 宣言で構成されていて、閉じた (関数の区切りにはまたがらない) IterationStatement のラベルセット内に Identifier が出現しない
Identifier のない ContinueStatement は、次のように評価される:
(continue, empty, empty) を返す。
Identifier を持つ ContinueStatement は、次のように評価される:
(continue, empty, Identifier) を返す。
12.8 break 文 (The break Statement)
ContinueStatement :
continue [LineTerminator 無し] Identifieropt ;
Semantics
次のいずれかが真であるとき、プログラムは構文的に不正であると考えられる:
プログラムが選択的 Identifier を持たない continue 宣言で構成されていて、直接または間接的に(関数の区切りにまたがらない)、 IterationStatement 内にネストしなていない。
プログラムが選択的 Identifier を持つ continue 宣言で構成されていて、閉じた (関数の区切りにはまたがらない) IterationStatement のラベルセット内に Identifier が出現しない
Identifier のない ContinueStatement は、次のように評価される:
(continue, empty, empty) を返す。
Identifier を持つ ContinueStatement は、次のように評価される:
(continue, empty, Identifier) を返す。
12.8 break 文 (The break Statement)
Syntax
BreakStatement :
break [LineTerminator 無し] Identifieropt ;
Semantics
次のいずれかが真である場合、プログラムは構文的に不正であると考えられる:
プログラムが選択的な Identifier を持たない break 文を含み、それが IterationStatement または SwitchStatement 内部で直接的または間接的にネストしていない。 (関数の境界には交わらない)
プログラムが選択的な Identifier を持つ break 文を含み、 Identifier が Statement を囲むラベルセット内に出現しない。 (関数の境界には交わらない)
Identifier のない BreakStatement は、次のように評価される:
(break, empty, empty) を返す。
Identifier のある BreakStatement は、次のように評価される:
(break, empty, Identifier) を返す。
12.9 return 文 (The return Statement)
BreakStatement :
break [LineTerminator 無し] Identifieropt ;
Semantics
次のいずれかが真である場合、プログラムは構文的に不正であると考えられる:
プログラムが選択的な Identifier を持たない break 文を含み、それが IterationStatement または SwitchStatement 内部で直接的または間接的にネストしていない。 (関数の境界には交わらない)
プログラムが選択的な Identifier を持つ break 文を含み、 Identifier が Statement を囲むラベルセット内に出現しない。 (関数の境界には交わらない)
Identifier のない BreakStatement は、次のように評価される:
(break, empty, empty) を返す。
Identifier のある BreakStatement は、次のように評価される:
(break, empty, Identifier) を返す。
12.9 return 文 (The return Statement)
Syntax
ReturnStatement :
return [LineTerminator 無し] Expressionopt ;
Semantics
ECMAScript プログラムは、それが FunctionBody 内部\でない return 文を含む場合、構文的に不正と考えられる。return 文は、関数に実行を停止させ、値を呼出側に返させる。 Expression が省略される場合、戻り値は undefined である。そうでなければ、戻り値は Expression の値である。
生成規則 ReturnStatement : return [no LineTerminator here] Expressionopt ; は、次のように評価される:
Expression が存在しなければ (return, undefined, empty) を返す。
Expression を評価。
GetValue(Result(2)) を呼出す。
(return, Result(3), empty) を返す。
ReturnStatement :
return [LineTerminator 無し] Expressionopt ;
Semantics
ECMAScript プログラムは、それが FunctionBody 内部\でない return 文を含む場合、構文的に不正と考えられる。return 文は、関数に実行を停止させ、値を呼出側に返させる。 Expression が省略される場合、戻り値は undefined である。そうでなければ、戻り値は Expression の値である。
生成規則 ReturnStatement : return [no LineTerminator here] Expressionopt ; は、次のように評価される:
Expression が存在しなければ (return, undefined, empty) を返す。
Expression を評価。
GetValue(Result(2)) を呼出す。
(return, Result(3), empty) を返す。