2011年9月10日土曜日

サイ本5版 1部「コアJavaScript」  7章「オブジェクトと配列」


このエントリーをはてなブックマークに追加


プロパティの存在確認


inとundefined
大抵はundefinedを使用する。


in

if ( "hoge" in obj ) obj.hoge = 1;


undefined

if ( obj.hoge !== undefind) obj.hoge = 1;


両者の違いはプロパティが存在するかどうか


obj.hoge = undefined;


のように、プロパティ自体が存在する場合は、
inはtrueになる。


プロパティごと削除


delete演算子を使用する。


Objectオブジェクトのプロパティとメソッド


constructorプロパティ

オブジェクトを生成したコンストラクタ関数を参照している。
instanceof演算子はconstructorプロパティを調べている。


toString()メソッド

toStringメソッドは引数をとらない。
オブジェクトが文字列に変換されるときに暗黙的に使用される。
例えば



  • +演算子で文字列とオブジェクトを結合

  • alert(),document.write()に渡すとき


そのままではあまり役に立たないので、多くのオブジェクトで独自のtoStringが定義されている。



  • 配列

    • 文字列に変換された要素リスト



  • 関数

    • 関数の定義





toLocalString()メソッド

JP,USなど、ロケールによって返す文字列を変化させる。
ECMAScript v3 ではArray,Data,NumberのtoLocalString()メソッドは
ローカライズされた文字列を返すように規定されている。


valueOf()メソッド

オブジェクトを文字列以外の基本型に変換するときに呼び出される。
デフォルトでは何もしない。
Date.valueOf()など、一部のオブジェクトは独自のvalueOf()を持つ。


hasOwnProperty()メソッド

hasOwnPropertyを呼び出したオブジェクト(obj)が引数hogeをプロパティにもつか。
継承したものはfales



obj.hasOwnProperty("hoge")



propertyIsEnumerable()メソッド

hasOwnProperty()とほぼ同じ。
propertyIsEnumerable()はhasOwnProperty()と同じ動作かつ、for/inで調べられる場合にtureを返す。
しかし、for/inで調べられないプロパティは、ほとんどの場合継承したもの。
だからhasOwnProperty()とほぼ同じ。


isPrototypeOf()メソッド

呼び出したオブジェクトが引数で指定したオブジェクトのプロトタイプであるときture



var o = {};
Object.prototype.isPrototypeOf(o); // o.constructor == Object
Function.prototype.isPrototypeOf(Object); //Object.constructor == Function



配列


配列はオブジェクトに少々機能を追加したもの。
typeof演算子でも「Object」と表示される。
簡単に説明するために、配列とオブジェクトは別のものとして扱う。


使用可能なインデックス

0~2^31-2の正の整数
これ以外では文字列として扱われプロパティ名になる。


オブジェクトに配列要素を追加

オブジェクトに「0」という名前のプロパティを追加。(0は文字列ではない)
これは配列の要素を追加しただけで、オブジェクトが配列になるわけではない。


要素はdeleteで削除できない

deleteはプロパティそのものを削除するが、
配列の要素で使用した場合はundefinedを設定するだけ。
配列の要素自体を削除する場合は、shift(),pop(),splice()など配列メソッドを使用する必要がある。


lengthプロパティ

配列の最大index+1の値を保持。
配列に変化があると自動的にlengthも変化する。
配列のインデックス最大値は2^32-2なので、lengthの最大値は2^32-1


lengthプロパティに値を書き込む

lengthに現在の値より小さい値を代入すると、配列の長さが切り詰められ、要素は中の値とともに廃棄される。
現在値より大きな値を代入すると、拡張された分の要素にはundefinedが入る。


配列のメソッド


  • concat()


配列に要素を追加して新しい配列を作成
引数に与えた配列は要素に展開される。
しかし再帰的には展開されない



var a = [1,2,3];
a.concat(4,5) //[1,2,3,4,5]
a.concat([4,5]) //[1,2,3,4,5]
a.concat([4,5,],[6,7]) // [1,2,3,4,5,6,7]
a.concat(4,[5,[6,7]]) // [1,2,3,4,5,[6,7]]




  • slice()

    • 非破壊的。

    • 2番目の引数で指定された要素の直前までが格納される。





  • splice()

    • 破壊的。削除と挿入を同時に行える。削除した分は返される。

    • 1,2引数は削除用、それ以降の引数は挿入用。





var a = [1,2,3,4,5];
//index2から長さ0で削除。つまり削除しない。
//index2の位置から挿入
a.splice(2,0,'a','b'); //aは[1,2,'a','b',3,4,5]
a.splice(2.2,[1,2],3); //['a','b']が返される、aは[1,2,[1,2],3,3,4,5]






  • JavaScript1.6から実装された配列メソッド

    • indexOf(), lastIndexOf(), forEach(), map(), filter()





  • indexOf(),lastIndexOf()

    • 指定した値を配列から高速に検索



  • forEach()

    • 配列の各要素を引数に、指定した関数を実行する。



  • map()

    • forEach()かつ関数から返された値を配列にまとめて返す。perlのmapと同じ。



  • filter()

    • forEach()かつ関数から返された値がtrueの要素だけ抜き出す。perlのgrep。





配列のようなオブジェクト


配列はオブジェクトの一種だが、特別。特にlengthプロパティ。
配列のようなオブジェクトはJSで多用する。
Argumentオブジェクトや、document.getElementByTagName()メソッドなどが返すオブジェクト





0 件のコメント:

コメントを投稿