「JavaScript/演算子」の版間の差分
削除された内容 追加された内容
→剰余: <code>''a'' % ''b''</code>は<code>''a'' - ''b'' * Math.ceil(''a'' / ''b'')</code>と等価です。 Perl や Ruby のように<code>''a'' - ''b'' * Math.floor(''a'' / ''b'')</code>と等価ではありません。 |
||= と &&= は存在します。→特殊演算子: の節は演算子ではないものが多量に含まれている「何が演算子か?」のコラムを書くべきか?ほか |
||
42 行
<syntaxhighlight lang="javascript">
alert(two); // 2
</syntaxhighlight>
50 行
<syntaxhighlight lang="javascript">
alert(minus_one); // -1
</syntaxhighlight>
58 行
<syntaxhighlight lang="javascript">
alert(four); // 4
</syntaxhighlight>
66 行
<syntaxhighlight lang="javascript">
alert(one_half); // 0.5
</syntaxhighlight>
79 行
</syntaxhighlight>
除数・被除数ともゼロ
<syntaxhighlight lang="javascript">
89 行
<syntaxhighlight lang="javascript">
alert(one); // 1
</syntaxhighlight>
96 行
<syntaxhighlight lang="javascript">
alert(minus_one); // -1
</syntaxhighlight>
113 行
<syntaxhighlight lang="javascript">
alert(-one); // -1
</syntaxhighlight>
<code>
<!-- 単項マイナス演算子は、デクリメント演算子と異なり左辺値式を取らない
<code>-''a''</code>は<code>''a'' *= -1</code>、すなわち<code>''a'' = ''a'' * -1</code>と等価です。-->
=== インクリメント ===
123 ⟶ 125行目:
<syntaxhighlight lang="javascript">
x++;
alert(x); // 1
131 ⟶ 133行目:
<syntaxhighlight lang="javascript">
alert(y); // 0
alert(x); // 1
140 ⟶ 142行目:
<syntaxhighlight lang="javascript">
alert(y); // 1
alert(x); // 1
149 ⟶ 151行目:
<syntaxhighlight lang="javascript">
(x++)++; // SyntaxError: Invalid left-hand side expression in postfix operation
</syntaxhighlight>
159 ⟶ 161行目:
<syntaxhighlight lang="javascript">
x--;
alert(x); // -1
167 ⟶ 169行目:
<syntaxhighlight lang="javascript">
alert(y); // 0
alert(x); // -1
176 ⟶ 178行目:
<syntaxhighlight lang="javascript">
alert(y); // -1
alert(x); // -1
185 ⟶ 187行目:
<syntaxhighlight lang="javascript">
(x--)--; // SyntaxError: Invalid left-hand side expression in postfix operation
</syntaxhighlight>
195 ⟶ 197行目:
<syntaxhighlight lang="javascript">
alert(power); // 1024
</syntaxhighlight>
202 ⟶ 204行目:
== ビット演算子 ==
'''ビット演算子'''(ビットえんざんし、''bitwise operator'')とは、[[w:ビット演算|ビット演算]]の演算子です。ビット演算とは数値を
{| class="wikitable"
232 ⟶ 234行目:
<code>''a'' >>> ''b''</code>は捨てられたビットの分だけ左から0を詰めます。ビット演算子は算術演算子よりも優先順位が低いことに注意してください。
[[JavaScript/ビット演算]]も参照して下さい。
== 文字列連結演算子 ==
237 ⟶ 241行目:
<syntaxhighlight lang="javascript">
alert(str); // "Wikibooks"
</syntaxhighlight>
244 ⟶ 248行目:
<syntaxhighlight lang="javascript">
alert(str); // "JavaScript 1.5"
</syntaxhighlight>
251 ⟶ 255行目:
<syntaxhighlight lang="javascript">
alert(two); // "11" -- あれれ?
</syntaxhighlight>
259 ⟶ 263行目:
<syntaxhighlight lang="javascript">
alert(two); // 2
</syntaxhighlight>
267 ⟶ 271行目:
<syntaxhighlight lang="javascript">
alert(two); // 2
</syntaxhighlight>
ほかにも1を掛ける (<code>one * 1</code>)、0を引く (<code>one - 0</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/
'''代入演算子'''(だいにゅうえんざんし、''assignment operator'')は変数に値を代入し
<syntaxhighlight lang="javascript">
alert( x =
</syntaxhighlight>
<code>''x'' = ''x'' + ''y''</code>のように自分自身に値を代入する演算は、<code>''x'' += ''y''</code>のように短縮表記することができます(自己代入演算子)。たとえば、<code>''x'' *= ''y''</code>は<code>''x'' = ''x'' * ''y''</code>と等価です。
<syntaxhighlight lang="javascript">
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行目:
|}
=< や => のような
<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
}}
|