変数 var に値 exp を代入します。イコール(=)は等しいという意味ではなく代入するという意味を持ちます。
xx = 5; // xx に 5 が代入される yy = xx; // yy に xx の値(= 5)が代入される zz = "ABC"; // zz に文字列"ABC"が代入される
例えば、次の例を数学的に解釈すると「解無し」となってしまいますが、JavaScript ではこれを「xx という変数に、xx の値と 2 を足したものを代入する」という意味になります。あらかじめ xx に 5 が代入されていれば、xx は 7 となります。
xx = xx + 2: // xx には xx に 2 を加えた値が代入される
次の例で、「yy = xx = 5;」は、「yy = (xx = 5);」と解釈されます。ここで、「xx = 5」自体が代入された値を示すので。これにより、変数 yy にも値 5 が代入されることになります。
yy = xx = 5; // yy と xx に 5 が代入される
exp1 と exp2 の足し算、引き算、掛け算、割り算を行います。演算子 % は、exp1 を exp2 で割った余りを返します。
xx = 3 + 2; // xx には 5 が代入される xx = 3 - 2; // xx には 1 が代入される xx = 3 * 2; // xx には 6 が代入される xx = 3 / 2; // xx には 1.5 が代入される xx = 3 % 2; // xx には 1 が代入される
演算子 + を用いるときは注意が必要です。exp1 と exp2 のどちらか(もしくは両方)が文字列の場合は、算術演算子ではなく、文字列の連結演算子として機能するからです。例えば、次の例では、xx は 127 になりません。
xx = "123" + 4; // xx には "1234" が代入される
フォームに入力した値も文字列として扱われるので注意しましょう。フォームの値を数値として扱いたいときは、0 を減算してやるとよいようです。演算子 - は算術演算子としての機能しかないので、"123" から 3 を引いても "12" にはならず、120 になります。
<script type="text/javascript"> <!-- function func() { alert(document.F1.T1.value + 4); // "1234" になる alert((document.F1.T1.value - 0) + 4); // 127 になる } // --> </script> <form name="F1" action="#"> <input type="text" name="T1"> <input type="button" value="OK" onclick="func()"> </form>
xx++ は xx の値をひとつ増やします。xx-- は xx の値をひとつ減らします。xx++ は、加算する前の値を返し、++xx は加算の後の値を返します。xx-- と --xx も同様です。
a = 5; a++: // a の値は 6 となる a = 5; b = a++; // a の値は 6、b の値は 5 となる a = 5; b = ++a; // a の値は 6、b の値は 6 となる
== 演算子は、exp1 が exp2 と等しければ true(真)、さもなくば false(偽)を返します。!= 演算子は、exp1 と exp2 が等しくなければ true(真)、さもなくば false(偽)を返します。数値にも文字列にも使用可能です。
if (xx == 5) { alert("xx is five."); } if (yy != "ABC") { alert("yy is not ABC."); }
数値と文字列を比較する場合は注意が必要です。次の例では、通常、数値と文字列が適切に型変換されてtrue(真)となりますが、Netscape ブラウザで <script>タグに language="JavaScript1.2" を指定した時は、数値と文字列の型変換が行われず、false(偽)を返します。
if ("123" == 123) { alert("等しい"); }
exp1 が exp2 の大きさを比較してその結果を true(真)または false(偽)で返します。演算子はそれぞれ、より小さい(<)、以下(<=)、より大きい(>)、以上(>=)を意味します。
if (xx < 123) { alert("xx は 123 より小さいです。"); }
これらの演算子を文字列に対して使用した場合は、辞書順の前後比較を行います。
if (xx < "H") { alert("xx は H よりも前にあります。"); }
数値と文字列を比較したときに、== 演算子や != 演算子が暗黙の型変換を行うのに対し、=== 演算子や !== 演算子は数値と文字列は常に異なるものと判断します。
if ( 123 == 123 ) { ... } // true(真) if ("123" == "123") { ... } // true(真) if ("123" == 123 ) { ... } // true(真) if ( 123 == "123") { ... } // true(真) if ( 123 === 123 ) { ... } // true(真) if ("123" === "123") { ... } // true(真) if ("123" === 123 ) { ... } // false(偽) if ( 123 === "123") { ... } // false(偽)
exp1 が真、かつ、exp2 が真であれば真を、さもなければ偽を返します。下記の例では、mon が 1 以上であり、かつ、mon が 12 以下の時に真となります。
if ((1 <= mon) && (mon <= 12)) { alert("xx is between 1 and 12."); }
exp1 が真、または、exp2 が真であれば真を返します。下記の例では、xx が "ABC" である、または、xx が "abc" である場合に真となります。
if ((xx == "ABC") || (xx == "abc")) { alert("xx is ABC."); }
exp1 が真ではない時に真を返します。
if (!(xx == 5)) { alert("xx is not five."); }
exp1 が真であれば exp2 を、さもなくば exp3 を返します。次の例は xx が 5 以上であれば "big"、さもなくば "small" を yy に代入します。
yy = (xx >= 5) ? "big" : "small";
常に exp2 の値を返します。ただし、代入演算子(=など)よりも優先度が低いため、xx = 1, 2; は (xx = 1), 2; と解釈されるので注意してください。また、関数の引数にカンマ(,)を用いた場合は、カンマ演算子とは解釈されません。
for (i = 0, j = 0; i < 10; i++) { : }
exp1 と exp2 を4バイト整数と見なして、それぞれ、AND(&)、OR(|)、XOR(^)、NOT(~)演算を行った結果を返します。
xx = 0x87654321 & 0xffff0000; // xx には 0x87650000 が代入される xx = 0x87654321 | 0xffff0000; // xx には 0xffff4321 が代入される xx = 0xffff0000 ^ 0xff00ff00; // xx には 0x00ffff00 が代入される xx = ~0xffff0000; // xx には 0x0000ffff が代入される
exp1 を4バイト整数と見なして、exp1 を exp2 ビット分、左シフト(<<)、右シフト(>>)、0埋め右シフト(>>>)した結果を返します。>> の場合は左端には最上位のビットが埋められますが、>>> は常に 0 が埋められます。
xx = 0x12345678 << 8; // xx には 0x34567800 が代入される xx = 0x12345678 >> 8; // xx には 0x00123456 が代入される xx = 0x87654321 >> 8; // xx には 0xff876543 が代入される xx = 0x87654321 >>> 8; // xx には 0x00876543 が代入される
例えば、xx += 5; は xx = xx + 5; と同じような動作をします。同様に、xx -= 5; は xx = xx - 5; と同じような動作をします。
xx += 5; // xx = xx + 5; と同じ xx -= 5; // xx = xx - 5; と同じ xx *= 5; // xx = xx * 5; と同じ xx /= 5; // xx = xx / 5; と同じ xx %= 5; // xx = xx % 5; と同じ xx &= 0xff; // xx = xx & 0xff; と同じ xx |= 0xff; // xx = xx | 0xff; と同じ xx ^= 0xff; // xx = xx ^ 0xff; と同じ xx <<= 8; // xx = xx << 8; と同じ xx >>= 8; // xx = xx >> 8; と同じ xx >>>= 8; // xx = xx >>> 8; と同じ
各演算子の優先順位は以下のようになります。同じレベルの演算子は、式の左側にある方が優先度が高くなります。たとえば下記の例で、(式1) は (式2) と解釈されて答えは 13 となります。しかし、バグを埋め込まないためにも、優先順位が直感的に解らない個所には(たとえ無駄であっても)括弧をつけて、優先度を明示的に指定してやることをおすすめします。
(式1) xx = 3 + 4 * 5 / 2; (式2) xx = 3 + ((4 * 5) / 2);
優先度 | 演算子 |
---|---|
↑ 高い 低い ↓ |
配列([]) 括弧(( )) |
増減(++ --) マイナス(-) 反転(~) NOT(!) | |
乗除余(* / %) | |
加減(+ -) 文字列連結(+) | |
シフト(<< >> <<<) | |
比較(< <= >= >) | |
比較(== != === !==) | |
AND(&) | |
XOR(^) | |
OR(|) | |
かつ(&&) | |
または(||) | |
二項(? :) | |
代入(=) 複合代入(+=など) | |
カンマ(,) |