James Edwards「NodeListはArrayじゃない件」
2009.10.26更新
Sitepointののブログエントリ
getElementsByTagName("a")で取得できるノードリストが配列じゃないってことを知ったのはDOMの勉強をはじめてから随分経ってからでした。
A collection is not an array
- ノードリストは配列ではない。
- ノードリストを配列にすることはできる。
- ノードリストを配列にすると、メリットとデメリット両面ある。
配列はある一時点の静的なスナップショットであってDOMの変化に応じて更新されない」
特にデメリットの指摘が勉強になった。
以下斜め読んだ内容
- ノードリストを配列にしたときのメリット
- .push、.shiftなどのArrayオブジェクトのメソッドが使える
- ノードリストを配列にしてしまう際のデメリット:
- .itemメソッドが使えない
- live collectionでなくなる。
- ノードリストのままなら、要素の追加・削除されるたびに、ノードリストも更新されるが、配列にしてしまうと、この更新がされなくなる。
コメント
- JSにおいてArrayは配列ではない点
- NodeListはArrayで無い
- Arrayは配列ではない
- javascriptのArrayオブジェクトは・・・・
- 配列ではない
- ハッシュ(連想配列)である
- 参考
- 別の日に斜め読んだslideshareで公開されてる2つのスライド
- Trace Monkey
- スライド20〜24あたり
- devsummit2009js
- スライド23以降。
- jsのArrayは配列ではなく、ハッシュであること。
- C++でベンチマーク結果では、配列はハッシュの7倍の速さで処理できること。
- 配列が存在しない点はjsが遅い原因の1つになってること。
- jsにクラスが存在しないこととjsに配列が存在しないことが関係してること
- 最近高速化されてるjsエンジンでは、処理する側でクラスが存在するかのように、仮のクラスを割り当てて高速化を実現。呼び名は色々
- V8ではHidden Classと呼ばれ、
- TraceMonkeyではShape Inferenceと呼ばれ、
- SquirrelFish ExtremeではStructure Chaneと呼ばれる