忍者ブログ

非公開:JavaScriptにおける値

Powered by 
NinjaBlog

[40][39][38][37][36][35][34][33][32][31][30]

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

この記事のURL

...2024.11.22 16:07

JavaScriptにおける値

オレのためのJavaScript入門、その3

 JavaScriptには「値」と「オブジェクト」という二つの概念(というと大げさだが、他にうまい言葉を思いつかない)がある。この二つの概念はお互いに密接な関係を持つことで様々な情報を表現することができる。
 そして、ものすごくざっくばらんにいえば、「値」は物質を表し、「オブジェクト」はその構造を表す。
 今回はJavaScriptにおける物質、つまり「値」というものを考えてみる。

 JavaScriptにおける値にはどんな種類があるか。まずは列記してみる。
 object種、string種、number種、boolean種、undefined種、function種、以上の6種類である。
 これはJavaScriptにおける正式な分類とは違うかもしれない。いやたぶん違う。おそらく「オレ的」な勝手な解釈だろう(し、だからこそ一般的な「~型」という分類にしなかったのだ)。だがこう括ってしまった方が「オレ的」にわかりやすい。ちなみにこれらはtypeof演算子が返す文字列である、というかtypeof演算子が返す文字列を値の種類としてみたら具合が良かっただけだったりする。
 それぞれについて簡単に説明してみる。

 object種とは、これまで述べてきた「オブジェクトへの参照」のことである。ここに分類される値には、null以外にはリテラルがなく、値そのものを見ることもできない、という他にはない独特な特徴がある。また、.(ドット)演算子の左辺に置ける唯一の種である。
 string種、number種とは、それぞれ一般に文字列、数値と呼ばれるものである。これらについて多くの説明は不要だろう。
 boolean種は一般に真偽値と呼ばれる。値はtruefalseの2種類。主に比較演算によって生まれる。
 undefined種は説明するのが難しい。未定義を表す値、みたいに言われることが多いようだが、この説明ではnullとの区別があいまいである。「オレ的」に詳しく説明してみると、オブジェクトという構造にはすでに組み込まれているがundefinedを除く値の代入はされていないプロパティが持つ値、ということになる。(これを理解できる人はひょっとしたら天才かもしれないが、天才ではなかった場合は私と似た思考回路の持ち主ということになる。さあヘコめ!) この種類に属するものの値は全てundefinedである。(ちなみにnullとはobject種に属する値である。と、ここまではいいのだが、実のところ私はこれ以上のことはわかっていない。オブジェクトという構造に組み込まれていないことを表す値で、ブラックホールを模倣したもの、と思っていたのだが、どうもこの解釈では納得できない挙動を示す。とりあえず現時点では保留しておく。あるいはnullとは係わり合いを持たない、という手もある。もしかしたらこれが現実的に最も賢い判断かもしれない)
 最後はfunction種。これについてはまた別にエントリーを作って詳しく考えてみる予定であるが、ここでは「値」としておく。ここからは例によって「オレ的」勝手解釈だ。function種の値の具体的な中身は「定義への参照」である。いわゆる「リテラル」はないが独自の「リテラル風」のものがあり、これを代入演算子の右辺に使うことができる。このときJavaScript内部に「定義」が作られ、左辺値には「定義への参照」が代入される。また、function種の値を持つプロパティを代入することによって一つの定義に複数の参照を持たせることができる。この点はオブジェクトと似ている。function種のみの特徴として、この値を持つプロパティの後ろに()を付けることによって参照先の定義を評価することが可能で、このときはfunction種を含むいずれかの種類の値に変わる。この値のことを「関数の戻り値」と呼ぶ。関数の戻り値がどの種類のどんな値になるかは、定義による。さらに()付きのfunction種のみの特徴としてnew演算子を使った演算ができる。これは重要な特徴なのだが、説明は後に取っておく。
 だいぶ端折った説明になってしまったが、以上だ。

 さて、ここからが本題。
 JavaScriptのプログラムは「式」の集まりと考えることができる。JavaScriptにおけるプログラムの実行とは、式を評価していくことである。ここで式の評価について少し細かく考えてみる。
 式とは「値」と「演算子」の集まりである。プログラムの中の値とは、値を直に記したもの(これを「リテラル」とか言ったりする)とプロパティ名である。そしてこれらの値は演算子の優先順位に従って順次演算されていく。
 さらに細かく見てみる。
 プログラム中に記された値は式の中で必要とされる順に順次新しく実体化される。実体化した値はそれを要求した演算子に食われ(前回のオチはここにつながるワケだ)新たな値に生まれ変わる。
 これが「式を評価する」ということである。つまり値は式の中で、あたかも泡のように生まれたり消え(=食われ)たりしているのである。
 このように値の一生は短い。ほとんどの値は一つの式の中で生まれ、その式の中で消えていく。唯一生き残ることが許されるのは代入演算子によりプロパティに代入された値である。このとき値はプロパティという殻に収められる。そして殻の中で再び実体化される日を待つことになる。

 つまり、JavaScriptにおいて「値」は式の中から生まれる。大げさに言うと、JavaScript世界における物質である「値」の錬金術の源は式である、ということになる。そしてこの錬金術から生み出された6種類の値たちがJavaScriptの世界を形作っていくのである。

 プロパティと値との関係について少し触れておく。
 プロパティと値とは常に一対一の関係が保たれる。一つのプロパティに複数の値を代入することはできない。プロパティに値が代入されると、それまでプロパティが保持していた値は消えてしまう。ただし式の中で値が実体化されることによってプロパティの保持する値が変化することはない。とまあ、このあたりは感覚的に問題ないと思う。
 このことは当然object種やfunction種の値であっても同じである。では一つのオブジェクトに複数の参照が付く、というのはどういう状態なのか。
 これは複数のプロパティがobject種(あるいはfunction種)の同じ値を持つ、ということである。つまり、値そのものはそれぞれ別のものだが偶然(ではないのだが)その中身が同じだった、とそれだけのことだ。決して値そのものが共有されているわけではない。
 object種とfunction種では値そのものを見ることができない。そのため感覚的には少々理解しにくいが、まあ要するにそういうことだ。(ちなみにシェルにおいてobject種の値は[object Object]と表示される。不勉強で申し訳ないが、私にはこれが何を意味しているのかよくわからない。function種の場合は上でチラと書いた「リテラル風」のものが表示されるが、これは値そのものの内容ではなく参照先の定義をtoStringしたものであり、値としてはobject種と同じく見ることのできない「定義への参照」である、たぶん)

 さて次回は、JavaScript世界におけるもう一つの重要な概念、「オブジェクト」について考えてみる。

PR
[40][39][38][37][36][35][34][33][32][31][30]
忍者ブログ [PR]
コンテンツ
カテゴリ別アーカイブ
月別アーカイブ
最新コメント
ブログ内検索

Since 2005 (C) hya All Rights Reserved.