JavaScript勉強会

JavaScriptの学習日記

「開眼! JavaScript」の学習ポイント

JavaScriptの学習で、「開眼! JavaScript」という本を読んでみます。

 

jsstudy.hatenablog.com

 

 

学習のポイント

この本は、わりと薄くてページ数が少ないので、読むだけなら2~3日で読めます。

この本の内容は、「付録A レビュー」にまとめられています。

なので、先にこの部分を見て、何が学習のポイントか?押さえておきたいです。

 

(p.163)

付録A レビュー

本書を読んだ結果、あなたが学んでいるはずのポイントを次に列挙しています。

それぞれのポイントを読んで、わからないポイントがあれば、解説しているそれぞれのトピックに戻ってください。

 

(1) オブジェクトは、名前を与えられたプロパティとその値によって構成される。

 

(2) JavaScriptでは、ほぼすべてがオブジェクトのようにふるまう。

オブジェクトはもちろん、プリミティブ値もオブジェクトのように扱うことができる。

JavaScriptでは全てがオブジェクトである」と言われることがあるのはこのためである。

 

(3) オブジェクトは、new演算子とともにコンストラクタ関数を呼び出すか、もしくはリテラルを使って定義することができる。

 

(4) コンストラクタ関数はオブジェクト(Function()オブジェクト)であるので、JavaScriptでは、オブジェクトがオブジェクトを生成する。

 

(5) JavaScriptはObject()、Array()、String()、Number()、Boolean()、Function()、Date()、RegExp()、Error()の9つのネイティブコンストラクタ関数を提供する。

その中でNumber()、String()、Boolean()にはオブジェクト型の値の生成とプリミティブ値の生成という2通りの目的がある。

 

(6) null、undefined、'string'、10、trueそしてfalseはすべてプリミティブ値で、オブジェクトのように扱われるまではオブジェクトの性質を持たない。

一旦オブジェクトのように扱われると、JavaScriptは裏で一時的なラッパーオブジェクトを生成し、プリミティブ値をオブジェクトのように仕立てる。

 

(7) Object()、Array()、String()、Number()、Boolean()、Function()、Date()、RegExp()、Error()のコンストラクタ関数がnew演算子を伴って呼ばれた場合、オブジェクトが生成される。

生成されたオブジェクトは複合型 もしくは参照型の値とも呼ばれる。

 

(8) プリミティブ型の変数には値が格納される。

プリミティブ型の変数がコピーされると、文字通り変数が複製される。

一方、オブジェクトを格納する変数には、実際にはオブジェクトへの参照が格納されている。

したがってこれがコピーされると、変数の値自体ではなく、参照がコピーされる。

 

(9) プリミティブ型の変数を同値比較(===)する場合は、それらの値が同じであれば同値とみなされる。

一方、オブジェクトを同値比較する場合は、同じ参照値を持っている場合にのみ同値とみなされる。

つまり、同じオブジェクトを参照している場合のみ同値とみなされる。

 

(10) JavaScriptのオブジェクトは動的プロパティを持つ。

 

(11) JavaScriptはミュータブル(可変)であり、ネイティブオブジェクトやユーザ定義オブジェクトのプロパティはいつでも変更することができる。

 

(12) オブジェクトプロパティの取得・設定・変更はドット表記法もしくはブラケット表記法で行う。

ブラケット表記法はオブジェクトプロパティの名前を 変数や式を使ってアクセスする際に有利となり、場合によっては必須となる。

 

(13) オブジェクトプロパティを参照する際、最初に参照されたオブジェクト自身のプロパティを検索する。

そこに該当するプロパティが存在しない場合、 そのオブジェクトのコンストラクタ関数のprototypeプロパティ内を検索し、プロパティを発見するまでプロトタイプチェーンをたどって最終的にObject()コンストラクタのprototypeプロパティを検索する。

ここでも見つからない場合はundefinedを返す。

 

(14) プロトタイプチェーンはJavaScriptで継承(プロトタイプ継承)を実現する方法である。

 

(15) オブジェクトプロパティの検索チェーン(プロトタイプ継承)によって、すべてのオブジェクトはObject()から継承することになる。

 

(16) JavaScriptの関数は他のオブジェクトとと同様に、プロパティや値を持ったオブジェクトである。

第一級関数の要件を満たしている。

 

(17) thisキーワードは、関数内で使用した場合、関数を保持するオブジェクトを参照する汎用的な手段である。

 

(18) thisの値は、関数が呼ばれたコンテクストに応じて関数の実行時に決定される。

 

(19) thisをグローバルスコープで使用すると、グローバルオブジェクトを参照する。

 

(20) JavaScriptでは、独自のスコープを生成する場合に関数を使用する。

 

(21) JavaScriptはグローバルスコープを用意し、すべてのコードはこのグローバルスコープ内に存在する。

 

(22) 関数はスコープチェーンを生成し、これを使用して変数の検索を行う。

 

(23) スコープチェーンは関数定義時に生成される。

これは関数が実行されるコンテクストと一致するとは限らない。

そのため呼ばれる場所が異なっていても、関数には本来記述されたスコープへのアクセスをもたせることができる。

これはクロージャと呼ばれる。

 

(24) 関数内でvarを伴わずに宣言される関数式や変数はグローバルプロパティとなる。

しかし、関数スコープ内に記述された関数宣言(function文)は、記述された場所のスコープが適用される。

 

(25) varを付与せずに関数や変数をグローバルスコープで宣言すると、それらはグローバルオブジェクトのプロパティとなる。

 

(26) varを付与して関数や変数をグローバルスコープで宣言すると、それらはグローバル変数となる。

 

これらの中でピンと来ない項目があれば、本書の該当箇所をジックリ読んでみる必要があるでしょう。

1回読んだだけではなかなか理解できない部分もあるので、サンプルプログラムを動かしたりしながら、理解を深めてみたいです。

 

 

開眼!  JavaScript ―言語仕様から学ぶJavaScriptの本質

開眼! JavaScript ―言語仕様から学ぶJavaScriptの本質