「JavaScript/演算子」の版間の差分

削除された内容 追加された内容
Ef3 (トーク | 投稿記録)
→‎演算子の優先順位: sortable wikitable ; sty.
Ef3 (トーク | 投稿記録)
s/source/syntaxhighlight/g; →‎グループ化演算子
330 行
かつてこの本で、'''0で0埋め右シフトをする (<code>one >>> 0</code>)'''あるいは '''補数の補数を求める(<code>~~one</code>)''' を'''文字列を数値に変換する方法'''として紹介されていましたが、前者は32ビット符号なし整数に、後者は32ビット符号付き整数への変換となり浮動小数点数を表す文字列に適用すると、、
 
<sourcesyntaxhighlight lang="javascript">
"3.14" >>> 0 === 3
"-3.14" >>> 0 === 4294967293
~~"3.14" === 3
~~"-3.14" === -3
</syntaxhighlight>
</source>
 
の様になります。興味深い挙動ですが'''文字列を数値に変換する方法'''としては妥当とは言えません。
526 行
また、<code>''object'''''['''''property''''']'''</code>と<code>'''[ ]'''</code>を含んだ配列アクセス似の式はブラケット記法のプロパティアクセサです。
ドット記法では、<code>property</code>が識別子として有効なときにのみ使え識別子以外を用いると SyntaxError を throw します。
<sourcesyntaxhighlight lang="javascript">
object.myName = "tom"; // 正常
object.123 = 0; // SyntaxError:
object.my-name = "lisa"; // SyntaxError:
</syntaxhighlight>
</source>
ドット記法では、<code>property</code>が識別子であることが用件で予約語との衝突は許されますが、誤解を生む可能性が高いので推奨しません。
 
== 条件演算子 ==
条件が真なら式1を評価しその値を返す、条件が真でなければ式2を評価しその値を返します。
<sourcesyntaxhighlight lang="js"> 条件 ? 式1 : 式2 </sourcesyntaxhighlight>
 
== カンマ演算子 ==
カンマで区切られた式を左から順に評価し、最後の式の値を返す
<sourcesyntaxhighlight lang="js"> 式1, 式2, 式3, 式4, 式5 ...,式n</sourcesyntaxhighlight>
 
== グループ化演算子 ==
グループ化演算子は、評価の優先順位を制御します。最上位の優先度を有しますが、短絡評価の影響を受けます<ref>[https://tc39.es/ecma262/#sec-grouping-operator ECMA-262::13.2.9 The Grouping Operator]</ref>。
<syntaxhighlight lang="js"> ( 式 )</syntaxhighlight>
 
== delete演算子 ==
<source lang="js">delete演算子 はオブジェクトからプロパティ</source>を取り除きます。
<syntaxhighlight lang="js">delete プロパティ</syntaxhighlight>
 
== 関数呼び出し演算子 ==
関数名に続く括弧はグループ化演算子ではなく、関数呼び出しです。
<sourcesyntaxhighlight lang="js"> 関数名 ( 引数列 ) </sourcesyntaxhighlight>
 
== new演算子 ==
<sourcesyntaxhighlight lang="js"> new コンストラクタ </sourcesyntaxhighlight>
 
== void 演算子 ==
式を評価し(結果に関わらず)undefined を返します。
<sourcesyntaxhighlight lang="js"> void 式 </sourcesyntaxhighlight>
 
== yield 演算子 ==
[[JavaScript/関数#yieldキーワードは、ジェネレータ機能([[JavaScript/関数|#ジェネレーター関数|function*]])を一時停止および再開するために使用します<source lang="js"ref>[https://tc39.es/ecma262/#prod-YieldExpression yeild 式 ECMA-262::YieldExpression]</sourceref>
<syntaxhighlight lang="js"> yeild 式 </syntaxhighlight>
 
== yield* 演算子 ==
yield*式は、別のジェネレータやイテレート可能なオブジェクトに処理を委譲します<ref>[https://tc39.es/ecma262/#sec-generator-function-definitions-runtime-semantics-evaluation ECMA-262::15.5.5 Runtime Semantics: Evaluation]</ref>。
<syntaxhighlight lang="js"> yeild* 式 </syntaxhighlight>
 
== typeof 演算子 ==
'''typeof演算子'''(タイプオブえんざんし、''typeof operator'')はデータ型を返します。
<sourcesyntaxhighlight lang="js"> typeof 式 </sourcesyntaxhighlight>
 
<syntaxhighlight lang="javascript">
586 ⟶ 597行目:
; '''左結合'''(ひだりけつごう、left-associative)
: '''左から右'''に評価される演算
: <sourcesyntaxhighlight lang="js" inline>( expr1 OP1 expr2 ) OP2 expr3</sourcesyntaxhighlight>と解釈される
: 典型的には四則
; '''右結合'''(みぎけつごう、right-associative)
: '''右から左'''に評価される演算
: <sourcesyntaxhighlight lang="js" inline>expr1 OP1 ( expr2 OP2 expr3 )</sourcesyntaxhighlight>と解釈される
: 典型的には代入
 
たとえば、<sourcesyntaxhighlight lang="js" inline>a - b - c</sourcesyntaxhighlight>は<sourcesyntaxhighlight lang="js" inline>a - (b - c)</sourcesyntaxhighlight>ではなく<sourcesyntaxhighlight lang="js" inline>(a - b) - c</sourcesyntaxhighlight>と左から右に評価されるため、減算演算子は左結合です。また、<sourcesyntaxhighlight lang="js" inline>a = b = c</sourcesyntaxhighlight>は<sourcesyntaxhighlight lang="js" inline>(a = b) = c</sourcesyntaxhighlight>ではなく<sourcesyntaxhighlight lang="js" inline>a = (b = c)</sourcesyntaxhighlight>と評価されるため、代入演算子は右結合です。インクリメント演算子<sourcesyntaxhighlight lang="js" inline>++</sourcesyntaxhighlight>やデクリメント演算子<sourcesyntaxhighlight lang="js" inline>--</sourcesyntaxhighlight>は、左辺値式ではないので <sourcesyntaxhighlight lang="js" inline>x++ ++</sourcesyntaxhighlight> とすると SyntaxErroor となり結合性は定義されません。
 
=== 結合性の例題 ===
次の式の演算子の結合性を述べ、それに従い括弧を補ってください。
 
# <sourcesyntaxhighlight lang="js" inline>typeof typeof object</sourcesyntaxhighlight>
# <sourcesyntaxhighlight lang="js" inline>p == q == r</sourcesyntaxhighlight>
# <sourcesyntaxhighlight lang="js" inline>a > 0 ? 1 : a < 0 ? -1 : 0</sourcesyntaxhighlight>
# <sourcesyntaxhighlight lang="js" inline>a, b, c</sourcesyntaxhighlight>
 
 
=== 結合性の例題の解答 ===
# 右結合:<sourcesyntaxhighlight lang="js" inline>typeof ( typeof object )</sourcesyntaxhighlight>と解釈される。
# 左結合:<sourcesyntaxhighlight lang="js" inline>p == q == r</sourcesyntaxhighlight>は<sourcesyntaxhighlight lang="js" inline>( p == q ) == r</sourcesyntaxhighlight>と解釈される。
# 右結合:<sourcesyntaxhighlight lang="js" inline>a > 0 ? 1 : ( a < 0 ? -1 : 0 )</sourcesyntaxhighlight>と解釈される<ref>条件演算子は短絡評価されるので、条件式が真であった場合には第三項は評価されない。</ref>。
# 左結合:<sourcesyntaxhighlight lang="js" inline>( a, b ), c</sourcesyntaxhighlight>と解釈される(式の値は、c となる)。
 
== 演算子の優先順位 ==