## 演算子

[up] [prev] [next]

#### ■ 一覧

&&, &=, &, ~, | , ^, , , ? :, --, --, /=, /, ==, ===, >, >=, ++, ++, <<=, <<, <, <=, -=, -, %, %=, *=, *, !=, !==, ^=, ! , ||, |=, +=, +, >>=, >>, =, >>>=, >>>

#### ■ 代入演算子

◆ var = exp (e3/N2)

変数 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 (e3/N2)
◆ exp1 - exp2 (e3/N2)
◆ exp1 * exp2 (e3/N2)
◆ exp1 / exp2 (e3/N2)
◆ exp1 % exp2 (e3/N2)

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>

◆ var++ (e3/N2)
◆ ++var (e3/N2)
◆ var-- (e3/N2)
◆ --var (e3/N2)

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 (e3/N2)
◆ exp1 != exp2 (e3/N2)

== 演算子は、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 (e3/N2)
◆ exp1 <= exp2 (e3/N2)
◆ exp1 > exp2 (e3/N2)
◆ exp1 >= exp2 (e3/N2)

exp1 が exp2 の大きさを比較してその結果を true（真）または false（偽）で返します。演算子はそれぞれ、より小さい（<）、以下（<=）、より大きい（>）、以上（>=）を意味します。

    if (xx < 123) {
        alert("xx は 123 より小さいです。");
    }

これらの演算子を文字列に対して使用した場合は、辞書順の前後比較を行います。

    if (xx < "H") {
        alert("xx は H よりも前にあります。");
    }

◆ exp1 === exp2 (e4/N406)
◆ exp1 !== exp2 (e4/N406)

数値と文字列を比較したときに、== 演算子や != 演算子が暗黙の型変換を行うのに対し、=== 演算子や !== 演算子は数値と文字列は常に異なるものと判断します。

    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 (e3/N2)

exp1 が真、かつ、exp2 が真であれば真を、さもなければ偽を返します。下記の例では、mon が 1 以上であり、かつ、mon が 12 以下の時に真となります。

    if ((1 <= mon) && (mon <= 12)) {
        alert("xx is between 1 and 12.");
    }

◆ exp1 || exp2 (e3/N2)

exp1 が真、または、exp2 が真であれば真を返します。下記の例では、xx が "ABC" である、または、xx が "abc" である場合に真となります。

    if ((xx == "ABC") || (xx == "abc")) {
        alert("xx is ABC.");
    }

◆ !exp1 (e3/N2)

exp1 が真ではない時に真を返します。

    if (!(xx == 5)) {
        alert("xx is not five.");
    }

#### ■ 条件演算子

◆ exp1 ? exp2 : exp3 (e3/N2)

exp1 が真であれば exp2 を、さもなくば exp3 を返します。次の例は xx が 5 以上であれば "big"、さもなくば "small" を yy に代入します。

    yy = (xx >= 5) ? "big" : "small";

#### ■ カンマ演算子

◆ exp1, exp2 (e3/N2)

常に exp2 の値を返します。ただし、代入演算子(=など)よりも優先度が低いため、xx = 1, 2; は (xx = 1), 2; と解釈されるので注意してください。また、関数の引数にカンマ（,）を用いた場合は、カンマ演算子とは解釈されません。

    for (i = 0, j = 0; i < 10; i++) {
        :
    }

#### ■ ビット演算子

◆ exp1 & exp2 (e3/N2)
◆ exp1 | exp2 (e3/N2)
◆ exp1 ^ exp2 (e3/N2)
◆ ~exp1 (e3/N2)

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 << exp2 (e3/N2)
◆ exp1 >> exp2 (e3/N2)
◆ exp1 >>> exp2 (e3/N2)

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 が代入される

#### ■ 複合代入演算子

◆ var += exp (e3/N2)
◆ var -= exp (e3/N2)
◆ var *= exp (e3/N2)
◆ var /= exp (e3/N2)
◆ var %= exp (e3/N2)
◆ var &= exp (e3/N2)
◆ var |= exp (e3/N2)
◆ var ^= exp (e3/N2)
◆ var <<= exp (e3/N2)
◆ var >>= exp (e3/N2)
◆ var >>>= exp (e3/N2)

例えば、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（|）
かつ（&&）
または（||）
二項（? :）
代入（=） 複合代入（+=など）
カンマ（,）

[up] [prev] [next]
Copyright (C) 1996-2001 杜甫々
改訂版初版：2001年9月8日
http://www.tohoho-web.com/js/operator.htm