読者です 読者をやめる 読者になる 読者になる

motsunav’s diary

IT技術(Java, JavaScript)と音楽(ピアノ, 編曲)のことを書きます。

O'Reilly「開眼! JavaScript」読書メモ ~第1章~

JS界で定評のある「開眼! JavaScript」を読んでみたので、
備忘録も兼ねて、各章ごとに自分用にまとめてみようと思います。

 

JavaScriptのオブジェクト

JavaScriptの世界は「オブジェクト」が全てらしい。

○ プロパティ  …名前がつけられた値
○ メソッド   …プロパティとして格納される関数
○ オブジェクト …プロパティ(メソッドも含む)の集合体を格納するコンテナ

var cat = new Object();   // Object()コンストラクタから "cat"を生成
cat.name = 'neko';   // プロパティ追加
cat.getName = function() {  // メソッド追加
    return cat.name;
}; 

"cat"を出力すると以下のような「オブジェクト」であることがわかる。

Object {
  name : 'neko'
  getName : (追加したメソッド)
}

 
 

リテラルとオブジェクトの違い

第1章にて挙げられている違いを以下にまとめてみた。

リテラル オブジェクト
代入 リテラルで代入
② new演算子を使わず
  ラッパーオブジェクトを使用
new演算子+コンストラクタ関数呼び出し
代入例 ① var p = 100;
② var p = Number;(100)
var p = new Number;(100)
メモリ 値渡し 参照渡し
同値比較 プリミティブ値を比較 ポインタを比較

メモリの持ち方について、オブジェクトの場合は参照渡しとなるため、「obj1 = obj2」とした場合はシャローコピーとなる。同値比較(===)も、オブジェクトの場合はポインタを比較するため、シャローコピーした場合はtrue、ディープコピーの場合はfalseとなる。プリミティブ値とオブジェクトのインスタンスを比較しても同じ参照ではないためfalseとなる。


また、リテラルで代入したとしても、プロパティを使用した場合はラッパーオブジェクトが生成され、処理が終わると破棄される。
 

typeof演算子について

やっかいなものらしい。
プリミティブならちゃんと判定される。オブジェクトであれば、基本的に「object」が返る。
例外としてあるのは以下。

null -> object
new Function() -> function
 

constructorプロパティについて

後の章をまとめる際にまとめる予定。
 
 

instanceof演算子について

オブジェクトが特定のコンストラクタ関数のインスタンスかどうか判定する。
プリミティブ値が代入された変数はオブジェクトではないためfalseが返される。

var str1 = 'aiueo';
str1 instanceof String;
// false (String()から生まれたわけじゃない)

var str2 = new String('aiueo');
str2 instanceof String;
// true