私の歴史と今

振り返ると恥ずかしくなるのが私の歴史。だけどそのときは真面目に書いていた訳でね。そんな今の私を書いていく。

JavaScript 第5版 5章 式と演算子

5.1 式と演算子

式とは、

    1. 評価し、
    2. 値を生成できるもの。

具体的には、

    1. リテラル
    2. 変数名、
    3. それらを演算子で組み合わせたもの、など。
// リテラル式
3.14
true
'ken'
// 変数式
x
// 演算子との組み合わせ
1 * 2

演算子と組み合わせて単純な式を作れる

3.14 * 2

5.2 演算子の概要

演算子には、

    1. 優先順位
    2. 結合性(左→右 or 左←右)
    3. オペランドの型

がある。
「=」や「,」などは優先順位が低い。それに対して、「.」や「new」は優先順位が高い。
「=」の結合性は、左←右だから、右側のオペランドが評価されてから、左側のオペランドが評価される。
「+」の結合性は、左→右だから、左側のオペランドが評価されてから、右側のオペランドが評価される。

1 + 2 + 3 // ((1 + 2) + 3) となる。
5.2.1 オペランドの数

オペランドの数によって、

に分けられる。

5.2.2 オペランドの型

注目すべきは、

    1. 演算子に渡すデータ型
    2. 演算子から返されるデータ型

渡すデータ型と返されるデータ型は同一とは限らないので注意。

1 + 2                 // 同じ
x instanceof Object   // 違う
5.2.3 演算子の優先順位

「+」よりも「*」の方が優先など。優先順位を変更したい場合は、()を使う。

5.2.4 演算子の結合性

右→左、左←右、という結合性は、すべての演算子で決まっている。

5.3 算術演算子

// 加算演算子「+」
1 + 1 // 2
"ken" + 1 // ken1
// 減算演算子「-」
2 - 1 // 1
// 乗算演算子「*」
2 * 5 // 10
// 除算演算子「/」
4 / 2  // 2
// 剰余演算子「%」
5 / 2  // 1
// 単項プラス「+」
+ 1  // 1
+ '1' // 1(数値に変換)
// 単項マイナス「-」
- 1 // -1
// インクリメント演算子「++」
x++
++x
// デクリメント演算子「--」
y--
--y

5.4 等値演算子

5.4.1 等値演算子(==)と同値演算子(===)

等値演算子:意味的に等しい。
同値演算子Javaの==。同じオブジェクトを指している場合にtrue。
文字列の比較は==で可能。

5.4.2 不等演算子(!=)と非同値演算子(!==)

等値演算子(==)、同値演算子(===)の逆。

5.5 関係演算子

5.5.1 比較演算子
    • 「<」
    • 「>」
    • 「<=」
    • 「>=」

文字列同士、Date同士も比較できる。

5.5.2 in演算子

Javaにはない。

5.5.3 instanceof演算子

すべてのオブジェクトは「obj instance of Object」でtrue。

5.6 文字列演算子

文字列連結の「+」や文字列比較の「>」など。

5.7 論理演算子

要注意。

5.7.1 論理積演算子(&&)

true/falseの論理値を返す訳ではないので要注意!

alert(1 && true && new Date())              // 日付が表示される。
alert(1 && true && new Date() && 0)         // 0が表示される。
alert(1 && true && new Date() && 0 && "a")  // 0が表示される。

一番最後に評価された結果が返される。上記2番目は、「0」が最後に評価され返される。3番目は、"a"は評価されないので、「0」が返される。

5.7.2 論理積演算子(||)

true/falseの論理値を返す訳ではないので要注意!
「&&」と同じく、

alert(0 || false || new Date())  // 日付が表示される。
alert(0 || true || new Date())   // trueが表示される。
alert(1 || false || new Date())  // 1が表示される。

Javaプログラマの私にとっては馴染みがないが、Oracle SQLのDecodeみたいな感じで愛用している人はいっぱいいるんだろうな。

5.7.3 論理否定演算子(!)

論理値を反転させる。Javaと同じ。

var x = 1 == 1;
if(!x){
  // 絶対実行されない。
}

5.8 ビット演算子

ビット演算子は、、、ついていけない。。。情けない。

5.9 代入演算子

「=」も演算子。しかも、返されるのは右辺値。だから下記も可能。

x = y = z = 1;
// つまり、
x = (y = (z = 1));
5.9.1 算術演算を伴う代入演算子

「+=」や「-=」など。Javaと同じ。

5.10 そのほかの演算子

5.10.1 条件演算子(:?)

Javaと同じ。

5.10.2 typeof演算子

文字列を返す。'string'や'obaject'など。
基本データ型の区別はできるが、オブジェクトの種類までは区別できない。

5.10.3 オブジェクト生成演算子(new)

newも演算子コンストラクタの引数がない場合は、()は不要。

5.10.4 delete演算子

Javaにはない。プロパティを削除するときに使用するのだろうか。用途が思いつかない。

5.10.5 void演算子

voidって演算子だったのか。右辺を評価するけど、未定義値を返す。void(0)と書くと関数のように見えるけど、1 + (1) と書いているようなもの。

5.10.6 カンマ演算子

x=1, y=2, z=3;
for文で頻出。

5.10.7 配列とオブジェクトにアクセスする演算子

[]と.のこと。

5.10.8 関数呼び出し演算子

()のこと。

var o = new Obj();
o.meth(1, 2, 3); // meth, 1, 2, 3 がオペランド