Museumソフトウェアエンジニアのブログ。JavaScript久しぶりの更新。一気に第5章全部まとめた。JavaScript』を読んで(項目37~42)第5章は「配列とディクショナリ」。知らないこと多かったけど、正直そこまでおもしろいネタはなかった気がする。文字列であるプロパティを各値にマップする機能を持っている。利用するとディクショナリを簡単に実装できる。ループではただしく要素を列挙できないので注意しよう。インスタンスのプロパティだけでなく、継承されたプロパティすべてを列挙するためである。プロパティをカウントしてしまう。インスタンスを利用しよう。そのためには各種リテラルのみを利用するのが最適である。プロトタイプを使うプロトタイプ汚染を予防するためには空のプロトタイプを持つオブジェクトを生成すればよい。なるまで、標準で空のプロトタイプでオブジェクトを生成する方法がなかった。設定する方法では空のプロトタイプを持つオブジェクトは生成できない。空のプロトタイプを持つオブジェクトを生成する方法が導入された。経由で空のプロトタイプを持つオブジェクトを生成することができる。そのものがオブジェクトを汚染することがある。提供するネイティブな構文を利用したい場合がある。キーワードを利用したくなるかもしれない。継承したプロパティを拾ってしまうのでうまくいかない。用いるとキーのみを正しく取得することが可能である。メソッドを利用できない。メソッドと合わせて利用する。上書きされていることを心配する必要がない。毎回このアプローチを用いるのはめんどうなので、この動作を行うラッパークラスを用意するとよい。順序を持たないプロパティのコレクションである。標準規格ではプロパティの格納順序についての規定はない。ループを用いるため、実装上は何らかの順序を規定しなければならない。実装上の都合で規定された順序に依存した処理にならないように気をつけよう。型は不動小数点数なので、順序に依存して丸め処理が発生したり、しなかったりする。これを防ぐため、明示的に配列にいれるなどして順序が必ず一定になるようにするべきである。ループに影響を与えるので決して追加してはいけない。ループを汚染することなくプロパティを定義できる。ループ内で列挙中のオブジェクトはループ内では変更しないほうがよい。仕様上はこの点に関して明記しておらず、「ループ内でその変更が適用されるかもしれないし、その変更が適用されないかもしれない」という曖昧性を残している。ループを使うべきである。ループを用いると、キーがループされるので意図しない結果になる。要素をループして平均値を出すように見えるが、実際にはキーを取り出してループしているので意図した結果と異なることになる。一度ループの外で計算するようにしておこう。文を使うとよく終了条件を間違える。elem++;});このほかにもリスト操作のできるプログラミング言語でありがちなメソッドが提供されているのでかしこく利用しよう。関数はそれぞれ「渡された述語が真となる要素が一つでもあるかどうか」、「渡された述語がすべての要素で真となるかどうか」を調べるメソッドである。この性質を利用して「ある条件を満たすまで配列に特定の操作を行う」という関数を定義できる。用いて処理をチェーンするのと同じ感覚。クラスではない)オブジェクトを、配列的に扱うことができる。クラスの性質を守ればよい。プロパティがそのオブジェクトの最大インデックスよりも大きいこと。範囲まで整数で、それを文字列で表現したものがキーであること以上の性質を満たせば、普通のオブジェクトも配列のようなオブジェクトとして利用できる。文字列は上記の条件を満たすため、配列のようなオブジェクトとして利用することができる。クラスのすべての振る舞いをシミュレートするのは至難の技である。以下の特殊性があるためである。プロパティに現在の値よりも小さい値を設定すると、その値以上のインデックスのプロパティは自動で削除される。プロパティは自動的にその値+1の値になる。クラスと同様の動作をすることがないので注意する。二つの方法が用意されている。配列コンストラクタを利用する方法と配列リテラルを利用する方法である。5);美的な問題は抜きにしても、以下の理由から配列リテラルを用いる方が望ましい。プロパティを初期化することになる。本来の配列コンストラクタ以外に結合されていないかに注意しなければならない。