本頁の目次 目次

11 式 (Expressions)

11.1 基本式 (Primary Expressions)

Syntax
PrimaryExpression :
this
Identifier
Literal
ArrayLiteral
ObjectLiteral
( Expression )

11.1.1 this キーワード (this Keyword)

this キーワードは実行コンテキストの this 値を評価する。

11.1.2 識別子参照 (Identifier Reference)

識別子は、セクション 10.1.4 で述べたスコープ規則を使用して評価される。この識別子評価の結果は常に Reference 型の値である。

11.1.3 リテラル参照 (Literal Reference)

リテラルはセクション 7.8 に述べるように評価される。

11.1.4 Array 初期化子 (Array Initialiser)

Array 初期化子は、 Array オブジェクトの初期化を記述する式で、リテラル形式で書かれる。それは配列要素をあらわす 0 個以上の式のリストで、それぞれ角括弧 "[ ]" で囲まれる。要素はリテラルである必要はない; それらは Array 初期化子が評価される度に評価される。

配列要素は要素リストの開始、中間、末尾で省略もできる。要素リスト中で AssignmentExpression の先行しないカンマは、欠けた配列要素が Array の長さに寄与し、続く要素のインデックスを増加させる。省略された配列要素は定義されない。

Syntax
ArrayLiteral :
[ Elisionopt ]
[ ElementList ]
[ ElementList , Elisionopt ]
ElementList :
Elisionopt AssignmentExpression
ElementList , Elisionopt AssignmentExpression
Elision :
,
Elision ,
Semantics

生成規則 ArrayLiteral : [ Elisionopt ] は、次のように評価される:

  1. new Array() と同様に、新規に配列を生成する。
  2. Elision を評価; 存在しなければ、数値 0 を用いる。
  3. Result(1) の [[Put]] メソッドを、引数 "length" と Result(2) で呼出す。
  4. Result(1) を返す。

生成規則 ArrayLiteral : [ ElementList ] は、次のように評価される:

  1. ElementList を評価。
  2. Result(1) を返す。

生成規則 ArrayLiteral : [ ElementList , Elisionopt ] は、次のように評価される:

  1. ElementList を評価。
  2. Elision を評価; 存在しなければ、数値 0 を用いる。
  3. Result(1) の [[Get]] メソッドを、引数 "length" で呼出す。
  4. Result(1) の [[Put]] メソッドを、引数 "length" と (Result(2)+Result(3)) で呼出す。
  5. Result(1) を返す。

生成規則 ElementList : Elisionopt AssignmentExpression は、次のように評価される:

  1. new Array() と同様に、新規に配列を生成する。
  2. Elision を評価; 存在しなければ、数値 0 を用いる。
  3. AssignmentExpression を評価。
  4. GetValue(Result(3)) を呼出す。
  5. Result(1) の [[Put]] メソッドを、引数 Result(2) と Result(4) で呼出す。
  6. Result(1) を返す。

生成規則 ElementList : ElementList , Elisionopt AssignmentExpression は、次のように評価される:

  1. ElementList を評価。
  2. Elision を評価; 存在しなければ、数値 0 を用いる。
  3. AssignmentExpression を評価。
  4. GetValue(Result(3)) を呼出す。
  5. Result(1) の [[Get]] メソッドを、引数 "length" で呼出す。
  6. Result(1) の [[Put]] メソッドを、引数 (Result(2)+Result(5)) と Result(4) で呼出す。
  7. Result(1) を返す。

生成規則 Elision : , は、次のように評価される:

  1. 数値 1 を返す。

生成規則 Elision : Elision , は、次のように評価される:

  1. Elision を評価。
  2. (Result(1)+1) を返す。

11.1.5 オブジェクト初期化子 (Object Initialiser)

オブジェクト初期化子は Object の初期化を記述する式であり、リテラルのような形式で書かれる。プロパティ名とその値の 0 個以上の組のリストを { } で囲む。値はリテラルである必要はない; オブジェクト初期化子が評価される度に、それは評価される。

Syntax
ObjectLiteral :
{ }
{ PropertyNameAndValueList }
PropertyNameAndValueList :
PropertyName : AssignmentExpression
PropertyNameAndValueList , PropertyName : AssignmentExpression
PropertyName :
Identifier
StringLiteral
NumericLiteral
Semantics

生成規則 ObjectLiteral : { } は、次のように評価される:

  1. new Object() と同様に新規にオブジェクトを生成する。
  2. Result(1) を返す。

生成規則 ObjectLiteral : { PropertyNameAndValueList } は、次のように評価される:

  1. PropertyNameAndValueList を評価。
  2. Result(1) を返す;

生成規則 PropertyNameAndValueList : PropertyName : AssignmentExpression は、次のように評価される:

  1. new Object() と同様に新規にオブジェクトを生成する。
  2. PropertyName を評価。
  3. AssignmentExpression を評価。
  4. GetValue(Result(3)) を呼出す。
  5. Result(1) の [[Put]] メソッドを、引数 Result(2) と Result(4) で呼出す。
  6. Result(1) を返す。

生成規則 PropertyNameAndValueList : PropertyNameAndValueList , PropertyName : AssignmentExpression は、次のように評価される:

  1. PropertyNameAndValueList を評価。
  2. PropertyName を評価。
  3. AssignmentExpression を評価。
  4. GetValue(Result(3)) を呼出す。
  5. Result(1) の [[Put]] メソッドを、引数 Result(2) と Result(4) で呼出す。
  6. Result(1) を返す。

生成規則 PropertyName : Identifier は、次のように評価される:

  1. Identifier と同じ文字シーケンスで構成される文字列リテラルを形成する。
  2. Result(1) を返す。

生成規則 PropertyName : StringLiteral は、次のように評価される:

  1. StringLiteral の値を返す。

生成規則 PropertyName : NumericLiteral は、次のように評価される:

  1. NumericLiteral の値を形成する。
  2. ToString(Result(1)) を返す。

11.1.6 グループ化演算子 (The Grouping Operator)

生成規則 PrimaryExpression : ( Expression ) は、次のように評価される:

  1. Expression を評価。これは Reference 型でもよい。
  2. Result(1) を返す。

NOTE このアルゴリズムは、 Result(1) に GetValue を適用しない。 deletetypeof のような演算子に括弧のついた式を適用できるようにすることがこれについての主な動機である。

11.2 左辺式 (Left-Hand-Side Expressions)

11.2.1 プロパティアクセス演算子 (Property Accessors)

ドット記法を用いて、プロパティは名前によりアクセスされる:

MemberExpression . Identifier
CallExpression . Identifier

または括弧記法で:

MemberExpression [ Expression ]
CallExpression [ Expression ]

ドット記法は次の構文的変換で説明される:

MemberExpression . Identifier

の振る舞いは次と同等である。

MemberExpression [ <identifier-string> ]

同様に

CallExpression . Identifier

の振る舞いは次と同等である。

CallExpression [ <identifier-string> ]

<identifier-string> のところは Identifier として同じ文字シーケンスを構成する文字列リテラルである。

生成規則 MemberExpression : MemberExpression [ Expression ] は次のように評価される:

  1. MemberExpression を評価。
  2. GetValue(Result(1)) を呼出す。
  3. Expression を評価。
  4. GetValue(Result(3)) を呼出す。
  5. ToObject(Result(2)) を呼出す。
  6. ToString(Result(4)) を呼出す。
  7. 基準オブジェクトが Result(5) でプロパティ名が Result(6) である Reference 型の値を返す。

生成規則 CallExpression : CallExpression [ Expression ] は全く同じ方法で評価されるが、ステップ 1 では CallExpression が評価される。

11.2.2 new 演算子 (The new Operator)

生成規則 NewExpression : new NewExpression は、次のように評価される:

  1. NewExpression を評価する。
  2. GetValue(Result(1)) を呼出す。
  3. Type(Result(2)) が Object でなければ、例外 TypeError を投げる。
  4. Result(2) が内部 [[Construct]] メソッドを実装しなければ、例外 TypeError を投げる。
  5. 引数なしで Result(2) の [[Construct]] メソッドを呼出す。(引数値に空リストを提供する。)
  6. Result(5) を返す。

生成規則 MemberExpression : new MemberExpression Arguments は、次のように評価される:

  1. MenberExpression を評価する。
  2. GetValue(Result(1)) を呼出す。
  3. 内部に引数値リストを持つ Arguments を評価する。
  4. Type(Result(2)) が Object でなければ、例外 TypeError を投げる。
  5. Result(2) が内部 [[Construct]] メソッドを実装しなければ、例外 TypeError を投げる。
  6. Result(2) の [[Construct]] メソッドを呼び、引数値にリスト Result(3) を提供する。
  7. Result(6) を返す。

11.2.3 関数呼出し (Function Calls)

生成規則 CallExpression : MemberExpression Arguments は、次のように評価される:

  1. MemberExpression を評価。
  2. Arguments を評価し、引数値の内部 List を生成する。(セクション 11.2.4)。
  3. GetValue(Result(1)) を呼出す。
  4. Type(Result(3)) が Object でなければ、例外 TypeError を投げる。
  5. Result(3) が内部 [[Call]] メソッドを実装しなければ、例外 TypeError を投げる。
  6. Type(Result(1)) が Reference ならば、 Result(6) は GetBase(Result(1)) 。そうでなければ、 Result(6) は null 。
  7. Result(6) が Activation オブジェクトならば、 Result(7) は null 。そうでなければ、 Result(7) は Result(6) と同じ。
  8. Result(3) の [[Call]] メソッドを呼び、this 値に Result(7) 、引数値にリスト Result(2) を渡す。
  9. Result(8) を返す。

生成規則 CallExpression : CallExpression Arguments は全く同様に評価されるが、ステップ 1 では CallExpression が評価される。

NOTE Result(3) が Native ECMAScript オブジェクトならば、 Result(8) はけして Reference 型にはならない。 Host オブジェクト呼び出しが Reference 型の値を返すかどうかは、実装依存である。

11.2.4 引数リスト (Argument Lists)

引数リストの評価は値による内部的リスト (セクション 8.8) を生成する。

生成規則 Arguments : ( ) は、次のように評価される:

  1. 値による空の内部的リストを返す。

生成規則 Arguments : ( ArgumentList ) は、次のように評価される:

  1. ArgumentList を評価。
  2. Result(1) を返す。

生成規則 ArgumentList : AssignmentExpression は、次のように評価される:

  1. AssignmentExpression を評価。
  2. GetValue(Result(1)) を呼出す。
  3. 唯一の項目が Result(2) である内部的リストを返す。

生成規則 ArgumentList : ArgumentList , AssignmentExpression は、次のように評価される:

  1. ArgumentList を評価。
  2. AssignmentExpression を評価。
  3. GetValue(Result(2)) を呼出す。
  4. Result(1) より 1 大きい長さ、Result(1) の項目の末尾に Result(3) を続けた項目を持つ、新しい内部的リストを返す。

11.2.5 関数式 (Function Expressions)

生成規則 MemberExpression : FunctionExpression は、次のように評価される:

  1. FunctionExpression を評価。
  2. Result(1) を返す。

11.3 後置式 (Postfix Expressions)

Syntax
PostfixExpression :
LeftHandSideExpression
LeftHandSideExpression [LineTerminator 無し] ++
LeftHandSideExpression [LineTerminator 無し] --

11.3.1 後置増分演算子 (Postfix Increment Operator)

生成規則 PostfixExpression : LeftHandSideExpression [no LineTerminator here] ++ は、次のように評価される:

  1. LeftHandSideExpression を評価。
  2. GetValue(Result(1)) を呼出す。
  3. ToNumber(Result(2)) を呼出す。
  4. + 演算子と同じ規則で (セクション 11.6.3)、Result(3) に値 1 を加える。
  5. PutValue(Result(1), Result(4)) を呼出す。
  6. Result(3) を返す。

11.3.2 後置減分演算子 (Postfix Decrement Operator)

生成規則 PostfixExpression : LeftHandSideExpression [no LineTerminator here] -- は、次のように評価される:

  1. LeftHandSideExpression を評価。
  2. GetValue(Result(1)) を呼出す。
  3. ToNumber(Result(2)) を呼出す。
  4. - 演算子と同じ規則 (セクション 11.6.3) で、 Result(3) から値 1 を引く。
  5. PutValue(Result(1), Result(4)) を呼出す。
  6. Result(3) を返す。

11.4 単項演算子 (Unary Operators)

11.4.1 delete 演算子 (The delete Operator)

生成規則 UnaryExpression : delete UnaryExpression は、次のように評価される:

  1. UnaryExpression を評価。
  2. Type(Result(1)) が Reference でなければ、 true を返す。
  3. GetBase(Result(1)) を呼出す。
  4. GetPropertyName(Result(1)) を呼出す。
  5. Result(3) の [[Delete]] メソッドを呼び、削除するプロパティ名として Result(4) を渡す。
  6. Result(5) を返す。

11.4.2 void 演算子 (The void Operator)

生成規則 UnaryExpression : void UnaryExpression は、次のように評価される:

  1. UnaryExpression を評価。
  2. GetValue(Result(1)) を呼出す。
  3. undefined を返す。

11.4.3 typeof 演算子 (The typeof Operator)

生成規則 UnaryExpression : typeof UnaryExpression は、次のように評価される:

  1. UnaryExpression を評価。
  2. Type(Result(1)) が Reference でなければ、 ステップ 4 へ。
  3. GetBase(Result(1)) が null ならば、 "undefined" を返す。
  4. GetValue(Result(1)) を呼出す。
  5. 次の表にしたがって、 Type(Result(4)) から決定される文字列を返す:
Type Result
Undefined "undefined"
Null "object"
Boolean "boolean"
Number "number"
String "string"
Object (native and doesn't implement [[Call]]) "object"
Object (native and implements [[Call]]) "function"
Object (host) Implementation-dependent

11.4.4 前置増分演算子 (Prefix Increment Operator)

生成規則 UnaryExpression : ++ UnaryExpression は、次のように評価される:

  1. UnaryExpression を評価。
  2. GetValue(Result(1)) を呼出す。
  3. ToNumber(Result(2)) を呼出す。
  4. + 演算子と同じ規則 (セクション 11.6.3) で、 Result(3) に値 1 を加える。
  5. PutValue(Result(1), Result(4)) を呼出す。
  6. Result(4) を返す。

11.4.5 前置減分演算子 (Prefix Decrement Operator)

生成規則 UnaryExpression : -- UnaryExpression は、次のように評価される:

  1. UnaryExpression を評価。
  2. GetValue(Result(1)) を呼出す。
  3. ToNumber(Result(2)) を呼出す。
  4. - 演算子と同じ規則 (セクション 11.6.3) で、 Result(3) から値 1 を引く。
  5. PutValue(Result(1), Result(4)) を呼出す。
  6. Result(4) を返す。

11.4.6 単項 + 演算子 (Unary + Operator)

単項 + 演算子は項を Number 型に変換する。

生成規則 UnaryExpression : + UnaryExpression は、次のように評価される:

  1. UnaryExpression を評価。
  2. GetValue(Result(1)) を呼出す。
  3. ToNumber(Result(2)) を呼出す。
  4. Result(3) を返す。

11.4.7 単項 - 演算子 (Unary - Operator)

単項 - 演算子は項を Number 型に変換し、反転する。 +0 の否定は -0、 -0 の否定は +0 を生成することに注意。

生成規則 UnaryExpression : - UnaryExpression は、次のように評価される:

  1. UnaryExpression を評価。
  2. GetValue(Result(1)) を呼出す。
  3. ToNumber(Result(2)) を呼出す。
  4. Result(3) が NaN ならば、 NaN を返す。
  5. Result(3) の否定; つまり、同じ大きさで符号が逆の数を算出する。
  6. Result(5) を返す。

11.4.8 ビット否定演算子 (Bitwise NOT Operator) ( ~ )

生成規則 UnaryExpression : ~ UnaryExpression は、次のように評価される:

  1. UnaryExpression を評価。
  2. GetValue(Result(1)) を呼出す。
  3. ToInt32(Result(2)) を呼出す。
  4. Result(3) にビット補数を適用する。結果は符号付き 32 ビット整数である。
  5. Result(4) を返す。

11.4.9 論理否定演算子 (Logical NOT Operator) ( ! )

生成規則 UnaryExpression : ! UnaryExpression は、次のように評価される:

  1. UnaryExpression を評価。
  2. GetValue(Result(1)) を呼出す。
  3. ToBoolean(Result(2)) を呼出す。
  4. Result(3) が true ならば、 false を返す。
  5. true を返す。

11.5 剰除演算子 (Multiplicative Operators)

Syntax
MultiplicativeExpression :
UnaryExpression
MultiplicativeExpression * UnaryExpression
MultiplicativeExpression / UnaryExpression
MultiplicativeExpression % UnaryExpression
Semantics

@ を上に定義される演算子の一つとして、生成規則 MultiplicativeExpression : MultiplicativeExpression @ UnaryExpression は、次のように評価される:

  1. MultiplicativeExpression を評価。
  2. GetValue(Result(1)) を呼出す。
  3. UnaryExpression を評価。
  4. GetValue(Result(3)) を呼出す。
  5. ToNumber(Result(2)) を呼出す。
  6. ToNumber(Result(4)) を呼出す。
  7. Result(5) と Result(6) に、指定された演算 (*, /, %) を適用する。下記のノート (セクション 11.5.1, 11.5.2, 11.5.3) を参照。
  8. Result(7) を返す。

11.5.1 * 演算子の適用 (Applying the * Operator)

  • 演算子は乗算を行い、項の積を生成する。乗算は可換的である。有限数精度? ( finite precision ) のため、 ECMAScript において、乗算は常に結合的なわけではない。

浮動小数点数乗算の結果は、 IEEE 754 倍精度計算規則により決定される:

  • どちらかの項が NaN ならば、結果は NaN である。
  • 結果の符号は、両方の項が同じ符号を持つならば正符号であり、異なる符号を持つならば負符号である。
  • 0 による無限大の乗算の結果は、 NaN になる。
  • 無限大による無限大の乗算の結果は、 infinity である。符号は 上にあげた規則で決定する。
  • 0 以外の有限数による無限大の乗算の結果は、符号付き無限大である。符合は上にあけた規則で決定する。
  • 無限大でも 0 でも NaN でもない残りのケースでは、積が算出され、 IEEE 754 直近への丸めモードを使用して、直近の表現可能な値へ丸められる。大きさが表せないほど大きいならば、演算はオーバーフローし、結果は適切な符合の無限大となる。大きさが表せないほど小さいらば、演算はアンダーフローし結果は適切な符合の 0 となる。 ECMAScript 言語は、 IEEE 754 に定義される段階的アンダーフロー (gradual underflow) のサポートを必須とする。

11.5.2 / 演算子の適用 (Applying the / Operator)

/ 演算子は乗算を行い、項の商を生成する。左項が被除数で右項が除数である。 ECMAScript は整数除算を行わない。項と除算演算結果の全ては倍精度浮動小数点数である。乗算の結果は、 IEEE 754 算術規定により決定される:

  • どちらかの項が NaN ならば、結果は NaN である。
  • 結果の符号は、両方の項が同じ符号を持つならば正符号であり、異なる符号を持つならば負符号である。
  • 無限大の無限大による除算の結果は、 NaN である。
  • 無限大の 0 による除算の結果は、無限大になる。符号は 上にあげた規則で決定する。
  • 無限大の 0 以外の有限数による除算の結果は、符号付き無限大である。符合は上にあけた規則で決定する。
  • 有限数の無限大による除算の結果は、 0 である。符合は上にあけた規則で決定する。
  • 0 の 0 による除算の結果は、 NaN である; 0 の任意の他の有限数による除算の結果は 0 である。符合は上にあけた規則で決定する。
  • 0 以外の有限数の 0 よる除算の結果は、符号付き無限大である。符合は上にあけた規則で決定する。
  • 無限大でも 0 でも NaN でもない残りのケースでは、商が算出され、 IEEE 754 直近への丸めモードを使用して、直近の表現可能な値へ丸められる。大きさが表せないほど大きいならば、演算はオーバーフローし結果は適切な符合の無限大となる。大きさが表せないほど小さいらば、演算はアンダーフローし結果は適切な符合の 0 となる。 ECMAScript 言語は、 IEEE 754 に定義される段階的アンダーフロー (gradual underflow) のサポートを必須とする。

11.5.3 % 演算子の適用 (Applying the % Operator)

% 演算子は、言外の除算から項の剰余を算出する; 左項が被除数で右項が除数である。

NOTE C および C++ において、剰余演算子は整数項のみを受け付ける; ECMAScript においては、浮動小数点数項も受け付ける。

% 演算子により算出されるような浮動小数点数の剰余演算の結果は、 IEEE 754 で定義される "reminder" 演算と同様ではない。 IEEE 754 "remainder" 演算は、切り捨て除算 (truncating division) からではなく丸め除算 (rounding division) から剰余を算出し、したがってその振る舞いは有用な整数剰余演算子のそれとは類似しない。代わりに ECMAScript 言語は % を浮動小数点数演算上で定義し、 Java 整数剰余演算子のそれに類似する方法で振る舞う; これは C ライブラリ関数 fmod と比較される.

ECMAScript 浮動小数点数剰余演算の結果は、 IEEE 算術の規則で決定される:

  • どちらかの項が NaN ならば、結果は NaN である。
  • 結果の符号は、被除数の符号と等しい。
  • 被除数が無限大、または除数が 0 、 あるいはその両方ならば、 結果は NaN である。
  • 被除数が有限数 かつ 除数が無限大ならば、結果は被除数と等しい。
  • 被除数が 0 かつ 除数が有限数ならば、結果は被除数と同じである。
  • 無限大でも 0 でも NaN でもない残りのケースでは、被除数 n と除数 d から浮動小数点数の剰余 r は、数学的関係 r = n - ( d * q ) によって定義される。 q は整数で n/d が負なら負、正ならば正であり、大きさは nd の真の数学的な商の大きさを超えない可能な限り大きい。

11.6 加減演算子 (Additive Operators)

11.6.1 加法演算子 (The Addition operator) ( + )

加法演算子は、文字列の連結、または数の加法のいずれかを行う。

生成規則 AdditiveExpression : AdditiveExpression + MultiplicativeExpression は、次のように評価される:

  1. AdditiveExpression を評価。
  2. GetValue(Result(1)) を呼出す。
  3. MultiplicativeExpression を評価。
  4. GetValue(Result(3)) を呼出す。
  5. ToPrimitive(Result(2)) を呼出す。
  6. ToPrimitive(Result(4)) を呼出す。
  7. Type(Result(5)) が String または Type(Result(6)) が String ならば、 ステップ 12 へ。 (このステップは、関係演算子の比較アルゴリズムのステップ 3 とは異なり、 かつ ではなく または であることに注意。)
  8. ToNumber(Result(5)) を呼出す。
  9. ToNumber(Result(6)) を呼出す。
  10. Result(8) と Result(9) に、加法演算を適用する。下記ノート参照 (セクション 11.6.3)。
  11. Result(10) を返す。
  12. ToString(Result(5)) を呼出す。
  13. ToString(Result(6)) を呼出す。
  14. Result(12) に Result(13) を連結する。
  15. Result(14) を返す。

NOTE ステップ 5 と 6 における ToPrimitive 呼出しではヒントを提供しない。全ネイティブ ECMAScript オブジェクトは Date オブジェクトを除き、ヒントの欠如をヒント Number が与えられたように扱う; Date オブジェクトは、ヒントの欠如をヒント String が与えられたように扱う。

ホストオブジェクトは、ヒントの欠如を他の方法で扱ってよい。

11.6.2 減法演算子 (The Subtraction Operator) ( - )

生成規則 AdditiveExpression : AdditiveExpression - MultiplicativeExpression は、次のように評価される:

  1. AdditiveExpression を評価。
  2. GetValue(Result(1)) を呼出す。
  3. MultiplicativeExpression を評価。
  4. GetValue(Result(3)) を呼出す。
  5. ToNumber(Result(2)) を呼出す。
  6. ToNumber(Result(4)) を呼出す。
  7. Result(5) と Result(6) に、減法演算を適用する。下記ノート参照 (セクション 11.6.3)。
  8. 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)

11.7.1 左シフト演算子 (The Left Shift Operator) ( << )

右項で指定される量により、左項上にビット幅左シフト演算を行う。

生成規則 ShiftExpression : ShiftExpression << AdditiveExpression は、次のように評価される:

  1. ShiftExpression を評価。
  2. GetValue(Result(1)) を呼出す。
  3. AdditiveExpression を評価。
  4. GetValue(Result(3)) を呼出す。
  5. ToInt32(Result(2)) を呼出す。
  6. ToUint32(Result(4)) を呼出す。
  7. Result(6) の下位 5 ビット以外をマスクする。 つまり、 Result(6) & 0x1F を算出する。
  8. Result(5) を Result(7) ビット左シフトする。結果は符号付き 32 ビット整数である。
  9. Result(8) を返す。

11.7.2 符号付き右シフト演算子 (The Signed Right Shift Operator) ( >> )

右項で指定される量により、左項上に符号を伴うビット幅右シフト演算を行う。

生成規則 ShiftExpression : ShiftExpression >> AdditiveExpression は、次のように評価される:

  1. ShiftExpression を評価。
  2. GetValue(Result(1)) を呼出す。
  3. AdditiveExpression を評価。
  4. GetValue(Result(3)) を呼出す。
  5. ToInt32(Result(2)) を呼出す。
  6. ToUint32(Result(4)) を呼出す。
  7. Result(6) の下位 5 ビット以外をマスクする。 つまり、 Result(6) & 0x1F を算出する。
  8. Result(5) を Result(7) ビット符号拡張右シフトする。最上位ビットは伝播する。結果は符号付き 32 ビット整数である。
  9. Result(8) を返す。

11.7.3 符号なし右シフト演算子 (The Unsigned Right Shift Operator) ( >>> )

右項で指定される量により、左項上に 0 を伴うビット幅右シフト演算を行う。

生成規則 ShiftExpression : ShiftExpression >>> AdditiveExpression は、次のように評価される:

  1. ShiftExpression を評価。
  2. GetValue(Result(1)) を呼出す。
  3. AdditiveExpression を評価。
  4. GetValue(Result(3)) を呼出す。
  5. ToUint32(Result(2)) を呼出す。
  6. ToUint32(Result(4)) を呼出す。
  7. Result(6) の下位 5 ビット以外をマスクする。 つまり、 Result(6) & 0x1F を算出する。
  8. Result(5) を Result(7) ビット分だけ 0 拡張右シフトする。空ビットは 0 で埋められる。結果は符号なし 32 ビット整数である。
  9. 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 : RelationalExpression < ShiftExpression は、次のように評価される:

  1. RelationalExpression を評価。
  2. GetValue(Result(1)) を呼出す。
  3. ShiftExpression を評価。
  4. GetValue(Result(3)) を呼出す。
  5. 比較 Result(2) < Result(4) を実行する。 (セクション 11.8.5.)
  6. Result(5) が undefined ならば、 false を返す。そうでなければ、 Result(5) を返す。

11.8.2 Grater-than 演算子 (The Greater-than Operator) ( > )

生成規則 RelationalExpression : RelationalExpression > ShiftExpression は、次のように評価される:

  1. RelationalExpression を評価。
  2. GetValue(Result(1)) を呼出す。
  3. ShiftExpression を評価。
  4. GetValue(Result(3)) を呼出す。
  5. 比較 Result(4) < Result(2) を実行する。 (セクション 11.8.5.)
  6. Result(5) が undefined ならば、 false を返す。そうでなければ、 Result(5) を返す。

11.8.3 Less-than-or-equal 演算子 (The Less-than-or-equal Operator) ( <= )

生成規則 RelationalExpression : RelationalExpression <= ShiftExpression は、次のように評価される:

  1. RelationalExpression を評価。
  2. GetValue(Result(1)) を呼出す。
  3. ShiftExpression を評価。
  4. GetValue(Result(3)) を呼出す。
  5. 比較 Result(4) < Result(2) を実行する (セクション 11.8.5.)
  6. Result(5) が true または undefinedならば、 false を返す。そうでなければ、 true を返す。

11.8.4 Greater-than-or-equal 演算子 (The Greater-than-or-equal Operator) ( >= )

生成規則 RelationalExpression : RelationalExpression >= ShiftExpression は、次のように評価される:

  1. RelationalExpression を評価。
  2. GetValue(Result(1)) を呼出す。
  3. ShiftExpression を評価。
  4. GetValue(Result(3)) を呼出す。
  5. 比較 Result(2) < Result(4) を実行する。 (セクション 11.8.5.)
  6. Result(5) が true または undefined ならば、 false を返す。そうでなければ、 true を返す。

11.8.5 抽象的関係比較アルゴリズム (The Abstract Relational Comparison Algorithm)

xy を値として、比較 x < y は、 true, false, または undefined を生成する (少なくとも一方の項が NaN であることを示す)。 この比較は次のように実行される:

  1. ToPrimitive(x, hint Number) を呼出す。
  2. ToPrimitive(y, hint Number) を呼出す。
  3. If Type(Result(1)) が String かつ Type(Result(2)) が String ならば、ステップ 16 へ。 (このステップが or の代わりに and を使い、加法演算子 + のためのアルゴリズムにおいてステップ 7 から異なることに注意。)
  4. ToNumber(Result(1)) を呼出す。
  5. ToNumber(Result(2)) を呼出す。
  6. Result(4) が NaN ならば、 undefined を返す。
  7. Result(5) が NaN ならば、 undefined を返す。
  8. Result(4) と Result(5) が同じ数値ならば、 false を返す。
  9. Result(4) が +0 かつ Result(5) が -0 ならば、 false を返す。
  10. Result(4) が -0 かつ Result(5) が +0 ならば、 false を返す。
  11. Result(4) が +∞ ならば、 false を返す。
  12. Result(5) が +∞ ならば、 true を返す。
  13. Result(5) が -∞ ならば、 false を返す。
  14. Result(4) が -∞ ならば、 true を返す。
  15. Result(4) の数学値が Result(5) の数学値より小さければ、 true を返す。 -- これらの数学値は共に有限な 0 以外の値であることに注意 -- そうでなければ、 false を返す。
  16. Result(2) が Result(1) の接頭辞ならば、 false を返す。 (qp と他の文字列 r の連結結果でありえるならば、文字列値 p は文字列値 q の接頭辞である。r を空文字列とすれば任意の文字列はそれ自身の接頭辞であることに注意。)
  17. Result(1) が Result(2) の接頭辞ならば、 true を返す。
  18. Result(1) の位置 k の文字が Result(2) の位置 k の文字と異なるような負でない最小整数を k とする。 (どちらの文字列も互いの接頭辞とならないような k が存在しなければならない。)
  19. m を Result(1) の位置 k の文字のコードポイント値である整数とする。
  20. n を Result(2) の位置 k の文字のコードポイント値である整数とする。
  21. m < n ならば true を返し、そうでなければ、 false を返す。

NOTE 文字列比較は、単純な辞書的序列をコードポイント値のシーケンスの値に用いる。文字や文字列の等価性、および Unicode 仕様 で定義される順序の照合の、これ以上複雑で意味論的に指向した定義を用いる試みはない。それゆえ、 Unicode 標準によって規準的に等しい文字列が不等価と検査されるかもしれない。効果においてこのアルゴリズムは、双方の文字列が既に正規化形式であることを想定する。

11.8.6 instanceof 演算子 (The instanceof operator)

生成規則 RelationalExpression: RelationalExpression instanceof ShiftExpression は、次のように評価される:

  1. RelationalExpression を評価。
  2. GetValue(Result(1)) を呼出す。
  3. ShiftExpression を評価。
  4. GetValue(Result(3)) を呼出す。
  5. Result(4) がオブジェクトでなければ、例外 TypeError を投げる。
  6. Result(4) が [[HasInstance]] メソッドを持たなければ、例外 TypeError を投げる。
  7. Result(4) の [[HasInstance]] メソッドを呼び、パラメータ Result(2) を渡す。
  8. Result(7) を返す。

11.8.7 in 演算子 (The in operator)

生成規則 RelationalExpression : RelationalExpression in ShiftExpression は、次のように評価される:

  1. RelationalExpression を評価。
  2. GetValue(Result(1)) を呼出す。
  3. ShiftExpression を評価。
  4. GetValue(Result(3)) を呼出す。
  5. Result(4) がオブジェクトでなければ、例外 TypeError を投げる。
  6. ToString(Result(2)) を呼出す。
  7. Result(4) の [[HasProperty]] メソッドを呼び、パラメータに Result(6) を渡す。
  8. 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 生成規則と同様に評価されるが、内部の EqualityExpressionRelationalExpression の代わりに、それぞれ EqualityExpressionNoInRelationalExpressionNoIn が評価される。

11.9.1 等価演算子 (The Equals Operator) ( == )

生成規則 EqualityExpression : EqualityExpression == RelationalExpression は、次のように評価される:

  1. EqualityExpression を評価。
  2. GetValue(Result(1)) を呼出す。
  3. RelationalExpression を評価。
  4. GetValue(Result(3)) を呼出す。
  5. 比較 Result(4) == Result(2) を実行する。 (セクション 11.9.3)
  6. Result(5) を返す。

11.9.2 不等価演算子 (The Does-not-equals Operator) ( != )

生成規則 EqualityExpression : EqualityExpression != RelationalExpression は、次のように評価される:

  1. EqualityExpression を評価。
  2. GetValue(Result(1)) を呼出す。
  3. RelationalExpression を評価。
  4. GetValue(Result(3)) を呼出す。
  5. 比較 Result(4) == Result(2) を実行する。 (セクション 11.9.3)
  6. Result(5) が true なら、 false を返す。そうでなければ、 true を返す。

11.9.3 抽象的等価比較アルゴリズム (The Abstract Equality Comparison Algorithm)

xy を値とする比較 x==y は、 true または false を生成する。次のように比較は実行される:

  1. Type(x) と Type(y) が異なる場合は、ステップ 14 へ。
  2. Type(x) が Undefined ならば、 true を返す。
  3. Type(x) が Null ならば、 true を返す。
  4. Type(x) が Number でなければ、ステップ 11 へ。
  5. x が NaN ならば、 false を返す。
  6. y が NaN ならば、 false を返す。
  7. xy と同じ数ならば、 true を返す。
  8. x が +0 で y が -0 ならば、 true を返す。
  9. x が -0 で y が +0 ならば、 true を返す。
  10. false を返す。
  11. Type(x) が String ならば、x と y の文字シーケンスが完全に同じ(同じ長さで対応する位置に同じ文字がある)なら true を返し、そうでなければ false を返す。
  12. Type(x) が Boolean ならば、 xy がともに true かともに false なら true を返し、そうでなければ false を返す。
  13. xy が同じオブジェクトを参照しているか、または互いに結合しているオブジェクト(セクション13.1.2) を参照していれば true を返し、そうでなければ false を返す。
  14. x が null で y が undefined ならば、 true を返す。
  15. x が undefined で y が null ならば、 true を返す。
  16. Type(x) が Number で Type(y) が String ならば、比較 x == ToNumber(y) の結果を返す。
  17. Type(x) が String で Type(y) が Number ならば、比較 ToNumber(x) == y の結果を返す。
  18. Type(x) が Boolean ならば、比較 ToNumber(x) == y の結果を返す。
  19. Type(y) が Boolean ならば、比較 x == ToNumber(y) の結果を返す。
  20. Type(x) が String か Number で Type(y) が Object ならば、比較 x == ToPrimitive(y) の結果を返す。
  21. Type(x) が Object で Type(y) が String か Number ならば、比較 ToPrimitive(x) == y の結果を返す。
  22. false を返す。

NOTE 等価の上の定義を与えられる:

"" + a == "" + b で文字列比較を強制できる。

a - 0 == b - 0 で数値比較を強制できる。

!a == !b で真偽比較を強制できる。

等価演算子は次の invariants を維持する:

  1. A != B は !(A == B) と等しい。
  2. A == B は、 AB の評価の順序を除き、 B == A と等しい。

等価演算子は常に通過 (transitive) ではない。例えば、同じ文字列値をあらわす 2 個の区別される String オブジェクトが存在可能である; それぞれの String オブジェクトは == 演算子によって文字列値が等しいとは考えられるが、 2 個の String オブジェクトは互いに等価にはならな。

文字列比較は、コードポイント値のシーケンスの値に単純な等価検査を使用する。文字や文字列の等価性、および Unicode 2.0 仕様 で定義される順序の照合の、より複雑で意味論的に指向した定義を用いる試みはない。それゆえ、 Unicode 標準によって規準的に等しい文字列が不等価と検査されるかもしれない。効果においてこのアルゴリズムは、双方の文字列が既に正規化形式であることを想定する。

11.9.4 厳密等価演算子 (The Strict Equals Operator) ( === )

生成規則 EqualityExpression : EqualityExpression === RelationalExpression は、次のように評価される:

  1. EqualityExpression を評価。
  2. GetValue(Result(1)) を呼出す。
  3. RelationalExpression を評価。
  4. GetValue(Result(3)) を呼出す。
  5. 比較 Result(4) === Result(2) を行う。 (後述)
  6. Result(5) を返す。

11.9.5 厳密不等価演算子 (The Strict Does-not-equal Operator) ( !== )

生成規則 EqualityExpression : EqualityExpression !== RelationalExpression は、次のように評価される:

  1. EqualityExpression を評価。
  2. GetValue(Result(1)) を呼出す。
  3. RelationalExpression を評価。
  4. GetValue(Result(3)) を呼出す。
  5. 比較 Result(4) === Result(2) を行う。 (後述)
  6. Result(5) が true ならば、 false を返す。そうでなければ、 true を返す。

11.9.6 厳密等価比較アルゴリズム (The Strict Equality Comparison Algorithm)

xy を値として、比較 x === y は true または false を生成する。そのような比較は次のように行われる:

  1. Type(x) が Type(y) と異なるならば、 false を返す。
  2. Type(x) が Undefined ならば、 true を返す。
  3. Type(x) が Null ならば、 true を返す。
  4. Type(x) が Number でないならば、 ステップ 11 へ。
  5. x が NaN ならば、 false を返す。
  6. y が NaN ならば、 false を返す。
  7. xy と同じ数ならば、 true を返す。
  8. x が +0 かつ y が -0 ならば、 true を返す。
  9. x が -0 かつ y が +0 ならば、 true を返す。
  10. false を返す。
  11. Type(x) が String ならば、 xy が厳密に同じ文字シーケンス (同じ長さで対応する位置が同じ文字) であるなら true を返す; そうでないならば、 false を返す。
  12. If Type(x) が Boolean ならば、 xy が共に true であるか、共に false であるなら true を返す; そうでないならば、 false を返す。
  13. xy が同じオブジェクトを参照しているならば、またそれらが互いに結合したオブジェクト (セクション 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 は、次のように評価される:

  1. A を評価。
  2. GetValue(Result(1)) を呼出す。
  3. B を評価。
  4. GetValue(Result(3)) を呼出す。
  5. ToInt32(Result(2)) を呼出す。
  6. ToInt32(Result(4)) を呼出す。
  7. ビット演算子 @ を Result(5) と Result(6) に適用する。結果は符号付 32 ビット整数である。
  8. 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 は、次のように評価される:

  1. LogicalANDExpression を評価。
  2. GetValue(Result(1)) を呼出す。
  3. ToBoolean(Result(2)) を呼出す。
  4. Result(3) が false ならば、 Result(2) を返す。
  5. BitwiseORExpression を評価。
  6. GetValue(Result(5)) を呼出す。
  7. Result(6) を返す。

生成規則 LogicalORExpression : LogicalORExpression || LogicalANDExpression は、次のように評価される:

  1. LogicalORExpression を評価。
  2. GetValue(Result(1)) を呼出す。
  3. ToBoolean(Result(2)) を呼出す。
  4. Result(3) が true ならば、 Result(2) を返す。
  5. LogicalANDExpression を評価。
  6. GetValue(Result(5)) を呼出す。
  7. 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 は、次のように評価される:

  1. LogicalORExpression を評価。
  2. GetValue(Result(1)) を呼出す。
  3. ToBoolean(Result(2)) を呼出す。
  4. Result(3) が false ならば、ステップ 8 へ。
  5. 最初の AssignmentExpression を評価。
  6. GetValue(Result(5)) を呼出す。
  7. Result(6) を返す。
  8. 2 番目の AssignmentExpression を評価。
  9. GetValue(Result(8)) を呼出す。
  10. 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 に含まれる ConditionalExpressionAssignmentExpression の代わりに ConditionalExpressionNoIn 及び AssignmentExpressionNoIn がそれぞれ評価される。

11.13.1 単純代入 (Simple Assignment) ( = )

生成規則 AssignmentExpression : LeftHandSideExpression = AssignmentExpression は、次のように評価される:

  1. LeftHandSideExpression を評価。
  2. AssignmentExpression を評価。
  3. GetValue(Result(2)) を呼出す。
  4. PutValue(Result(1), Result(3)) を呼出す。
  5. Result(3) を返す。

11.13.2 複合代入 (Compound Assignment) ( op= )

@ のところは上に示した演算子の一つをあらわす生成規則 AssignmentExpression : LeftHandSideExpression @ = AssignmentExpression は、次のように評価される:

  1. LeftHandSideExpression を評価。
  2. GetValue(Result(1)) を呼出す。
  3. AssignmentExpression を評価。
  4. GetValue(Result(3)) を呼出す。
  5. Result(2) と Result(4) に、演算子 @ を適用する。
  6. PutValue(Result(1), Result(5)) を呼出す。
  7. Result(5) を返す。

11.14 カンマ演算子 (Comma Operator) ( , )

Syntax
Expression :
AssignmentExpression
Expression , AssignmentExpression
ExpressionNoIn :
AssignmentExpressionNoIn
ExpressionNoIn , AssignmentExpressionNoIn
Semantics

生成規則 Expression : Expression , AssignmentExpression は、次のように評価される:

  1. Expression を評価。
  2. GetValue(Result(1)) を呼出す。
  3. AssignmentExpression を評価。
  4. GetValue(Result(3)) を呼出す。
  5. Result(4) を返す。

ExpressionNoIn 生成規則は、 Expression 生成規則と同様に評価されるが、 ExpressionAssignmentExpression, の代わりに、それぞれ ExpressionNoInAssignmentExpressionNoIn が評価される。

Page Contents

Issued: / Revised: / All rights reserved. © 2002-2016 TAKI