値と演算子・2
オレのためのJavaScript入門、その6
演算子の続き。論理演算子から。
&&演算子と||演算子。条件式の中で「かつ」と「または」を表現する、というのが一般的な使われ方。その仕組み単純である。簡単に説明しておく。
&&演算子。左辺が真と評価される値だった場合は右辺を評価する。作り出される値は後に評価された値。
||演算子。左辺が偽と評価される値だった場合は右辺を評価する。作り出される値は後に評価された値。
偽と評価される値は、object種ではnull、string種では''(空文字列)、number種では0とNaN、boolean種についてはいわずもがな。それ以外の値は真と評価される。undefined種は偽、function種は全て真と判断されるようだ。(抜けがあるかも。要するにBoolean関数でboolean種の値に変換したときにfalseとされる値が偽だ)
注意点は2つ。論理演算子から作り出される値はboolean種ではなく評価された値そのものであり、そして左辺の値によっては右辺が評価されない場合があること。
後者の特徴から、条件文にあたる処理を一つの式の中に収めることができる。
a < 1 && (a = 1) || a > 9 && (a = 9)
こんな感じ。さらに,(カンマ)演算子を組み合わせることで複雑な処理を一つの式に収めることもできるだろう。
論理演算子がこのような使われれ方をされることは、あまりない。パッと見何をやっているのかサッパリわからないからだろう。しかし別に禁止されているわけではない。使いたければ使えばいいと思う。
条件演算子を使うともう少しわかりやすく書けるが、こちらも使われることは少ないようだ。
なお論理演算子のこの特徴はJavaScriptに限った特殊な仕様ではない。他の言語でも大体似たようなものだ。
次は.(ドット)演算子。これについては以前に少し触れた。この演算子を囲む2つの値は、左辺のobject種の値が参照するオブジェクトの持つ右辺のプロパティ名のプロパティ、という一つの値として解釈される。
.(ドット)演算子が左辺に要求する値はobject種、つまりオブジェクトへの参照である。function種でも問題ない。
ちょっとここでfunction種についてこれまでの記述を改めさせてもらう。ここでいきなりこんな話になるのは以前のエントリーを書き直すのがメンド臭いからだ。まあ大筋は変わらない。
以前のエントリーでfunction種は「定義への参照」と書いたが、function種は「オブジェクトへの参照」である。ただfunction種が参照するオブジェクトにはobject種が参照するオブジェクトとは異なる特徴がある。その特徴とは「定義」というプロパティを持っている、ということである。この定義というプロパティには直接アクセスすることはできない。function種を値に持つプロパティを括弧付きでアクセスしたときにその定義を実行することができる。ちなみに定義とは式の集まりである。
この「定義」を持つオブジェクトを今後「Functionオブジェクト」と呼ぶ('f'unctionではなく'F'unction)。
と、大体こんな感じ。Functionオブジェクトについてはまたいずれ詳しく扱う。
そんなわけで、function種でも問題ないのだ。
.(ドット)演算子についての話を続ける。
この演算子の左辺にはstring種、number種、boolean種の値を置くこともできる。以前のエントリーではobject種以外は置けない、みたいなことを書いたが、訂正はしない。メンド臭いからだ。そしてこの場合はもはやおなじみの「種の変換」が行われる。ただし、ここで行われる種の変換はちょっと複雑だ。
まず初めに左辺の値の種に応じた新しいオブジェクトが作られる。これらを、string種はStringオブジェクト、number種はNumberオブジェクト、boolean種はBooleanオブジェクトと呼ぶ。これらのオブジェクトは上に書いたFunctionオブジェクトと似ている。これらのオブジェクトは「定義」の代わりに「値」という直接アクセスできないプロパティを持っている。
そしてそのオブジェクトの値プロパティに値が代入される。
その上でこの新しく作られたオブジェクトの持つ右辺のプロパティ名のプロパティ、という一つの値として解釈される。
かなり説明不足だが、とりあえずここではこれ以上の深入りはせずにおく。ここで説明するためにはまずオブジェクトというものについての説明から始めなければならない。これまでのオブジェクトについての説明はあくまで概念的なものだ。オブジェクトについては、上に挙げたそれぞれのオブジェクトについての説明と併せて機会を改めて考えてみることにする。
最後にnew演算子。これも以前に少し触れた。オブジェクトを生成する魔法の呪文、というやつだ。
右辺に括弧付きのfunction種の値を要求する。この演算子から作り出される値は新しく生成されたオブジェクトを参照するobject種の値である。
new演算子の右辺に置かれる関数はこのとき生成されるオブジェクトの親とも呼べるもので、通常の関数とは呼び出され方も機能も異なる。この関数のことをコンストラクタ関数と呼んだりする。他の関数と区別する意味も込めて頭を大文字で始めるのが一般的だ。
このあたりの説明をするにはオブジェクトについてと関数についてのさらに詳しい説明が必要となる。とりあえずここでは、new演算子はオブジェクトを新しく生成し、そのオブジェクトを参照するobject種の値を作り出す、という説明に留めておく。
.(ドット)演算子とnew演算子はJavaScriptでオブジェクトを扱う要となる重要な演算子である。実質的にはJavaScriptにおいてオブジェクトに関わりのある演算子はこの2つしかない。これらを使いこなすためにはまずオブジェクトというものを正しく知っておかなければならない。
次回からはJavaScriptにおけるオブジェクトというものをより具体的に見ていくことにする。
PR