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

削除された内容 追加された内容
Ef3 (トーク | 投稿記録)
→‎剰余: <code>''a'' % ''b''</code>は<code>''a'' - ''b'' * Math.ceil(''a'' / ''b'')</code>と等価です。 Perl や Ruby のように<code>''a'' - ''b'' * Math.floor(''a'' / ''b'')</code>と等価ではありません。
Ef3 (トーク | 投稿記録)
||= と &&= は存在します。→‎特殊演算子: の節は演算子ではないものが多量に含まれている「何が演算子か?」のコラムを書くべきか?ほか
42 行
 
<syntaxhighlight lang="javascript">
varconst two = 1 + 1; // 変数twoを1+1で宣言初期化するとtwoは2となる
alert(two); // 2
</syntaxhighlight>
50 行
 
<syntaxhighlight lang="javascript">
varconst minus_one = 0 - 1; // 変数minus_oneを0-1で宣言初期化するとminus_oueは-1となる
alert(minus_one); // -1
</syntaxhighlight>
58 行
 
<syntaxhighlight lang="javascript">
varconst four = 2 * 2; // 変数fourを2×2で宣言初期化するとfourは4となる
alert(four); // 4
</syntaxhighlight>
66 行
 
<syntaxhighlight lang="javascript">
varconst one_half = 1 / 2; // 変数one_halfを1÷2で宣言初期化するとone_halfは0.5となる
alert(one_half); // 0.5
</syntaxhighlight>
79 行
</syntaxhighlight>
 
除数・被除数ともゼロによとなゼロ除算は<code>[[JavaScript/Number#NaN|NaN]]</code>を返します。
 
<syntaxhighlight lang="javascript">
89 行
 
<syntaxhighlight lang="javascript">
varconst one = 10 % 3; // 10÷3は3余り1なので変数oneは1となる
alert(one); // 1
</syntaxhighlight>
96 行
 
<syntaxhighlight lang="javascript">
varconst minus_one = -10 % 3;
alert(minus_one); // -1
</syntaxhighlight>
113 行
 
<syntaxhighlight lang="javascript">
varconst one = 1;
alert(-one); // -1
</syntaxhighlight>
 
<code>-''a''</code>は<code>''a'' *= -1</code>、すなわち<code>''a'' = ''a'' * -1</code>と等価です。
<!-- 単項マイナス演算子は、デクリメント演算子と異なり左辺値式を取らない
<code>-''a''</code>は<code>''a'' *= -1</code>、すなわち<code>''a'' = ''a'' * -1</code>と等価です。-->
 
=== インクリメント ===
123 ⟶ 125行目:
 
<syntaxhighlight lang="javascript">
varlet x = 0;
x++;
alert(x); // 1
131 ⟶ 133行目:
 
<syntaxhighlight lang="javascript">
varlet x = 0;
varconst y = x++;
alert(y); // 0
alert(x); // 1
140 ⟶ 142行目:
 
<syntaxhighlight lang="javascript">
varlet x = 0;
varconst y = ++x;
alert(y); // 1
alert(x); // 1
149 ⟶ 151行目:
 
<syntaxhighlight lang="javascript">
varlet x = 0;
(x++)++; // SyntaxError: Invalid left-hand side expression in postfix operation
(x++)++; // 構文エラー
</syntaxhighlight>
 
159 ⟶ 161行目:
 
<syntaxhighlight lang="javascript">
varlet x = 0;
x--;
alert(x); // -1
167 ⟶ 169行目:
 
<syntaxhighlight lang="javascript">
varlet x = 0;
varconst y = x--;
alert(y); // 0
alert(x); // -1
176 ⟶ 178行目:
 
<syntaxhighlight lang="javascript">
varlet x = 0;
varconst y = --x;
alert(y); // -1
alert(x); // -1
185 ⟶ 187行目:
 
<syntaxhighlight lang="javascript">
varlet x = 0;
(x--)--; // SyntaxError: Invalid left-hand side expression in postfix operation
(x--)--; // 構文エラー
</syntaxhighlight>
 
195 ⟶ 197行目:
 
<syntaxhighlight lang="javascript">
varconst power = Math.pow(2, 10); // es2016ES2016からは 2 ** 10とも書けます。** 演算子はBigInt型に対応していますが、Math.pow()メソッドは対応していません。
alert(power); // 1024
</syntaxhighlight>
202 ⟶ 204行目:
 
== ビット演算子 ==
'''ビット演算子'''(ビットえんざんし、''bitwise operator'')とは、[[w:ビット演算|ビット演算]]の演算子です。ビット演算とは数値を二進法に直32ビット整数変換し、各ビットに対して行う演算のことです。
 
{| class="wikitable"
232 ⟶ 234行目:
 
<code>''a'' >>> ''b''</code>は捨てられたビットの分だけ左から0を詰めます。ビット演算子は算術演算子よりも優先順位が低いことに注意してください。
 
[[JavaScript/ビット演算]]も参照して下さい。
 
== 文字列連結演算子 ==
237 ⟶ 241行目:
 
<syntaxhighlight lang="javascript">
varconst str = "Wiki" + "books";
alert(str); // "Wikibooks"
</syntaxhighlight>
244 ⟶ 248行目:
 
<syntaxhighlight lang="javascript">
varconst str = "JavaScript " + 1.5;
alert(str); // "JavaScript 1.5"
</syntaxhighlight>
251 ⟶ 255行目:
 
<syntaxhighlight lang="javascript">
varconst one = "1";
varconst two = one + 1;
alert(two); // "11" -- あれれ?
</syntaxhighlight>
259 ⟶ 263行目:
 
<syntaxhighlight lang="javascript">
varconst one = "1";
varconst two = parseInt(one) + 1;
alert(two); // 2
</syntaxhighlight>
267 ⟶ 271行目:
 
<syntaxhighlight lang="javascript">
varconst one = "1";
varconst two = +one + 1;
alert(two); // 2
</syntaxhighlight>
 
ほかにも1を掛ける (<code>one * 1</code>)、0を引く (<code>one - 0</code>)、0で0埋め右シフトをする (<code>one >>> 0</code>)、補数の補数を求める (<code>~~one</code>) などの方法があります。
これらの演算子は数値にしか適用できないので、処理系が被演算子を自動的に数値に変換(暗黙的な型変換)するためです。
 
かつてこの本で、'''0で0埋め右シフトをする (<code>one >>> 0</code>)'''あるいは '''補数の補数を求める(<code>~~one</code>)''' を'''文字列を数値に変換する方法'''として紹介されていましたが、前者は32ビット符号なし整数に、後者は32ビット符号付き整数への変換となり浮動小数点数を表す文字列に適用すると、、
 
<source lang="javascript">
"3.14" >>> 0 === 3
"-3.14" >>> 0 === 4294967293
~~"3.14" === 3
~~"-3.14" === -3
</source>
 
の様になります。興味深い挙動ですが'''文字列を数値に変換する方法'''としては妥当とは言えません。
 
== 代入演算子 ==
: ''[[JavaScript/var|変数]]も参照''
'''代入演算子'''(だいにゅうえんざんし、''assignment operator'')は変数に値を代入し代入した値を返します。
 
<syntaxhighlight lang="javascript">
varlet x = 0;
alert( x = 01 ); // "0"アラートダイアログボックスに 1警告表示
</syntaxhighlight>
 
<code>''x'' = ''x'' + ''y''</code>のように自分自身に値を代入する演算は、<code>''x'' += ''y''</code>のように短縮表記することができます(自己代入演算子)。たとえば、<code>''x'' *= ''y''</code>は<code>''x'' = ''x'' * ''y''</code>と等価です。
 
<syntaxhighlight lang="javascript">
varlet x = 1;
x += 1; // x = x + 1
alert(x); // 2
340 ⟶ 356行目:
| <code>''x'' = ''x'' <nowiki>|</nowiki> ''y''</code>
| ビットごとのOR代入 (bitwise OR assignment)
|-
| <code>''x'' <nowiki>||</nowiki>= ''y''</code>
| <code>''x'' = ''x'' <nowiki>||</nowiki> ''y''</code>
| 論理和の代入 (Boolean OR assignment)
|-
| <code>''x'' &&= ''y''</code>
| <code>''x'' = ''x'' <nowiki>|</nowiki> ''y''</code>
| 論理積の代入 (Boolean AND assignment)
|}
 
<!--- 論理和代入と論理積代入は ES5 には既にあったと記憶しているが、いつの時代の記述だろう?
ただし、<code>''x'' = ''x'' && ''y''</code>と等価な<code>''x'' &&= ''y''</code>や、<code>''x'' = ''x'' || ''y''</code>と等価な<code>''x'' ||= ''y''</code>などはありません。代わりに<code>if ( ''x'' ) ''x'' = ''y''</code>や<code>if ( !''x'' ) ''x'' = ''y''</code>を使用してください。<code>''x'' += 1</code>は<code>''x''++</code>と等価であり、<code>''x'' -= 1</code>は<code>''x''--</code>と等価です。 -->
 
== 論理演算子 ==
372 ⟶ 397行目:
* <code>Boolean(''p'') != Boolean(''q'')</code>
 
などと表すことができます(推奨)
 
== 比較演算子 ==
407 ⟶ 432行目:
|}
 
=< => のような変なに = が先にくる比較演算子は存在しないので気をつけてください(特に => はアロー関数の構文で書き方によっては SyntaxError とならず発見困難なバグの原因になります)大小比較は必ず手前に大なり小なり、後にイコールが来ます。厳密な比較演算子は暗黙的な型変換を引き起こしません。すなわち値が等しくかつ型も等しくNaNでもない場合に<code>true</code>を返します。たとえば、<code>1</code>と <code>"1"</code> は等しい (<code>1 == "1"</code>) ですが、厳密には等しくありません (<code>1 !== "1"</code>)。
 
<code>==</code>演算子は被演算子に真偽値が含まれる場合は、それを数値に変換して比較します。たとえば、
416 ⟶ 441行目:
</syntaxhighlight>
 
<!---
なので<code>null == false</code>は<code>null == 0</code>に変換され<code>false</code>を返します。このことから、<code>x == false</code>と<code>!x</code>は必ずしも等しい条件式にならないので注意してください(<code>x</code>が<code>null</code>の場合、前者は<code>false</code>、後者は<code>true</code>を返す)。
 
<code>==</code>演算子は被演算子の一方が数値で他方が数値以外のオブジェクトの場合、他方を数値に変換して比較します。たとえば<code>[] == ![]</code>のような比較の場合、<code>![]</code>が<code>false</code>に変換されるので<code>[] == false</code>になり、被演算子の<code>false</code>が<code>0</code>に変換されて<code>[] == 0</code>になり、被演算子の一方が数値の<code>0</code>なので他方の<code>[]</code>が数値に変換され、<code>0 == 0</code>になり、結果として<code>true</code>になります。
 
この部分、暗黙的な型変換を実際より単純化して捉えている。この論法が成り立つなら false==false が false になってしまう。もちろんそんなことはなく、比較演算子の左辺右辺の(型ではなく)値によって暗黙な型変換の挙動が決定し、簡素に表現できるほど単純な規則はない。
 
この様な理由から、==(!=)は使用せず、===(!==)を使用し暗黙的な型変換を抑制することが要求される。
-->
 
{{コラム|0と-0の比較|
425 ⟶ 456行目:
0 === -0; // ES6 では true
</syntaxhighlight>
ES6より前は 0 と -0 は一致しませんでしたが、ES6 以降は {{code|true}} となりました。 0 と -0 は一致するようになりました。これは厳密一致についても同じです。
}}