![]() |
連載:Ajax時代のJavaScriptプログラミング再入門第3回 変数の宣言とスコープ山田 祥寛(http://www.wings.msn.to/)2007/08/21 |
|
|
Back Issue |
||||
|
JavaScriptが、いま注目を浴びている。
長い冷遇の時代を経ながらも、Ajaxという技術の登場とも相まって、JavaScriptの価値はいままた確実に見直されつつある。その過去の凋落と近年の華々しい脚光は、「復権」と呼んでもよいかもしれない。
本連載は、JavaScript復権のいまこの時代に求められる、JavaScriptという言語への理解を再確認しようというものだ。その連載、第3回となる今回扱うテーマは、「変数」である。どのような言語においても同様であるが、コード上で値を入力し、処理した結果を格納し、また、ほかへと引き渡すすべての基本となるのが変数だ。プログラミング言語を理解するうえにおいて、変数の理解は欠かせない。そして、それはJavaScriptの世界においても同様だ。
本稿では、JavaScriptにおける変数のデータ型に始まり、そのスコープ(有効範囲)の概念、そして、初学者にとってはやや分かりにくい「クロージャ」について解説する。
変数とデータ型
JavaScriptは、変数の型を意識する必要のない言語である。しかし、これは変数を使用する際にデータ型を指定する必要がない(指定できない)というだけであって、JavaScriptがデータ型そのものを持たないというわけではない。JavaScriptの世界では、プログラマがそれと指定しなくても、代入された値に応じて、適切なデータ型が自動的に割り当てられるというだけなのである。
そのため、基本的には開発者がデータ型を意識しなければならない局面というのはそれほど多くはないのだが、それでもまったく意識しなくてもよいというわけではない。まずは、JavaScriptで利用可能なデータ型を見てみることにしよう。
| ||||||||||
| JavaScriptで利用可能なデータ型の分類 | ||||||||||
| JavaScriptのデータ型は大きく「基本型」と「参照型」に分類できる。 |
この表を見ても分かるように、JavaScriptのデータ型は大きく「基本型」と「参照型」に分類でき、値がいずれの型に属するかによって振る舞いも異なるので、要注意だ。基本型が変数に対して直接に値を格納するのに対して、参照型ではその参照値が格納される。参照値とは、値を実際に格納しているメモリ上のアドレス(ポインタ)のことである。
この性質の違いによってどのようなことが起こるのか――それぞれの特徴を理解するために、以下のリスト1、リスト2に注目してみることにしよう。
| |
| リスト1 基本型の挙動を確認 | |
| |
| リスト2 参照型の挙動を確認 |
基本型(リスト1)の挙動については、特に問題ないだろう。基本型においては、値は変数に直接に格納されるので、
で変数xの値を変数yに引き渡す場合にも、値はコピーされる(値渡し)。つまり、
でコピー元の変数xの値を変更しても、変数xとyとはまったくの別物なので、
ではコピーされた値である「10」を取得できるというわけだ。
しかし、参照型ではそうはいかない。参照型においては、変数に格納されるのは「値の格納先」(参照)だけであるので、リスト2の
で変数xの値を変数yに引き渡す場合にも、参照が引き渡されるにすぎない(参照渡し)。この時点で、変数xとyとは同じアドレスに格納された同じ値を見ている形になるわけだ。
従って、
で変数xに対して変更を加えた場合にも、実際には参照先の値を変更することになるので、同じアドレスを参照している変数yの側にも変更が影響することになる。果たして、
で変数yを参照すると、変数xに加えられた変更が変数yにも反映されていることを確認できる。
基本型と参照型との区別については、後のスコープの解説でも再度登場するので、両者の区別をここで確実に押さえておいていただきたい。
[参考]varキーワード varキーワードは、変数を宣言するための命令である。 厳密には、JavaScriptでは変数の宣言は任意であるし、varキーワードを使わずに「x = 10;」のように値を直接割り当てても構わない(その場合にも、自動的に変数が生成される)。が、後節で述べるような理由でお勧めはできない。 まずは無条件に、JavaScriptの変数はvar命令で宣言すると覚えておくことを強くお勧めしたい。 |
■データ型の明示的な変換
繰り返しであるが、JavaScriptという言語は型についてとかく寛容な言語である。例えば、以下のようなコードも何ら問題なく動作する。
| |
| リスト3 *演算子を用いた数値と文字列の演算 |
このようなコードでも「*演算子」の前後は数値であろうと推測し、JavaScriptが文字列(変数y)を自動的に数値に変換したうえで演算を行ってくれるわけだ。これは、JavaScriptのスクリプト言語としてのシンプルさを支える特徴である。
しかし、このような寛容さは時として思わぬ不具合をもたらす一因にもなる。次に、以下のようなコードを見てみよう。
| |
| リスト4 +演算子を用いた数値と文字列の演算 |
ここで、多くの方は結果として「12」が返されることを期待するはずだ。しかし、リスト4の結果は「102」。オペランドの片方が文字列である場合、「+演算子」は(加算演算子ではなく)文字列連結演算子と見なされ、変数xとyとが文字列として連結されることになる。
このように、型に対する寛容さは、時として予期せぬ結果を得ることにもなるわけだ。そこで、JavaScriptではデータ型を明示的に変換する方法も提供している。データ型の明示的な変換にはいくつかの方法があるが、ここでは代表的な例として、(1)組み込みオブジェクトのコンストラクタを利用する方法と、(2)「+演算子」「−演算子」を利用する方法について紹介しておくことにする。
(1)組み込みオブジェクトのコンストラクタ
連載第1回でも触れたように、JavaScriptではString、Number、Booleanのような組み込みオブジェクトが用意されている。これらのコンストラクタを呼び出すことで、明示的に対応する型に値を変換することができる。
例えば、以下のリスト5は、リスト4における変数yをNumberオブジェクトに格納することで、明示的に数値に変換している例だ。果たして、今度は値「10」と値「2」とがそれぞれ数値であるため、+演算子は加算演算子と見なされ、結果も「12」を返す。
| |
| リスト5 組み込みオブジェクトのコンストラクタを用いたデータ型の明示的な変換 |
ちなみに、これらコンストラクタは関数として呼び出すことも可能だ。つまり、
の部分は、
|
のように書き換えても構わない。
(2)「+演算子」「−演算子」
数値⇔文字列間の変換を行うならば、+演算子あるいは「−演算子」を利用した明示的な変換を行うことも可能だ。
以下のリスト6は、変数x(数値)、変数y(文字列)をそれぞれ文字列、数値に変換する例である。なお、リスト内で使用しているtypeof演算子は、指定された変数の内部データ型を文字列で返すためのものである。
| |
| リスト6 文字列xを数値に、数値yを文字列に変換する例 |
先ほども述べたように、+演算子は与えられたオペランドのいずれかが文字列である場合に、もう片方も文字列に自動変換したうえで文字列連結を行うという性質を持っている。
ではその性質を利用して、数値xを強制的に文字列に変換しているというわけだ。
一方、
では−演算子を利用した「文字列→数値」変換の例だ。−演算子では与えられたオペランドのいずれかが数値である場合に、もう片方も数値に自動変換したうえで減算処理を行う。ここではその性質を利用して、文字列yを強制的に数値に変換している。
ちなみに、ここで「0」を減算して変換できるならば、「0」を加算しても「文字列→数値」変換を行えるのではないかと思われる方もいるかもしれない。しかし、前述したように、これは不可である。しつこいようであるが、+演算子は加算演算子と文字列連結演算子という2つの意味を持っている。オペランドの片方が文字列である場合、+演算子は(加算演算子ではなく)文字列連結演算子として解釈されてしまうのだ。この点、やや混乱しやすいポイントでもあるので、注意していただきたい。
| INDEX | ||
| Ajax時代のJavaScriptプログラミング再入門 | ||
| 第3回 変数の宣言とスコープ | ||
| 1.変数とデータ型 | ||
| 2.グローバル・スコープとローカル・スコープ(1) | ||
| 3.グローバル・スコープとローカル・スコープ(2) | ||
| 4.クロージャの仕組みを理解する | ||
| 「Ajax時代のJavaScriptプログラミング再入門」 |
ホワイトペーパー(TechTargetジャパン)
- LocalConnection APIと動的なスタイリング (2010/2/9)
Webページ上の複数のSilverlightアプリ間でメッセージ通信をする方法とは? コントロールの見た目を動的に設定する方法とは? - ASP.NET MVC 2:モデルの検証 (2010/2/8)
ASP.NET MVC 2で導入される入力検証機能を使った実装を紹介。シンプルな属性の追加によるエレガントな実装が可能となっている - ASP.NETによる3階層Webアプリ「ITブック」構築 (2010/2/5)
ちょっとした改造で、あなたのWebアプリは劇的に使いやすく、かっこよくなる。まずは元となるWebアプリを標準的手法で構築 - .NET TIPS - .NET開発のテクニックとヒント集 - (2010/2/4)
− カスタムMVCビューエンジンを利用するには?(活用編)
− フォーム全体へのドッキングでつまみを表示するには?
− リストボックスでTextBlockの文字列を折り返すには?
|
|
スキルアップ/キャリアアップ(JOB@IT)
スポンサーからのお知らせ
- - PR -
- - PR -
お勧め求人情報

**先週の人気講座ランキング**
〜CCNA編〜
| ◆ | 企業の仮想化に足りない“発想”とは? 仮想化運用管理のキモは意外なところに! New! |
| ◆ | 操作もマニュアルも分かりやすい! ユーザー視点で開発されたPC管理ツール New! |
| ◆ | 仮想化すればコストは削減できるか? 仮想化に必要な「3つの視点」を解説する |

| ◆ | セキュリティを知り尽くす上野氏が登壇! @ITメールソリューションLive! in Tokyo |
| ◆ | 運用管理の課題を“2つの観点”から分析 ユーザー満足度の高い「仮想環境」とは? |
| ◆ | 世界に通用するストレージの作り方とは? 製品に込めた思いを富士通の開発者に聞く |

| ◆ | OSSで手間も時間も、障害も減った―― 「マピオンの事例」オープンソース活用法 |
| ◆ | 「ノートPCの持ち出し禁止」で大丈夫? 情報漏えいを防ぐ管理手法とインフラは? |
| ◆ | 1日の処理を1秒に――MySQLの達人が語る 「コスト削減」できるチューニング |

| ◆ | ドキュメント作成を自動化して、SEの作業 効率を大幅アップ! Visio 2007の魅力 |
| ◆ | 急速に広がるHyper-Vでのサーバ仮想化 そのベストプラクティスをデルが解説 |
| ◆ | @IT主催セミナーで語られた、「担当者に 求められるセキュリティ対策」をレポート |

| ◆ | @IT「Windows 7」 特設サイトオープン! 最新情報・移行ノウハウを公開しています |







