SlideShare une entreprise Scribd logo
1  sur  22
Télécharger pour lire hors ligne
ES.next

WeakMap
id:mooz / @stillpedant
id:mooz / @stillpedant
          http://mooz.github.com/index-ja.html
宣伝
本が出ます
WeakMap
WeakMap = 連想配列
ECMAScript 6 に導入予定
Firefox 6 より利用可能
WeakMap 用法
1.   set(key, value)
     –   key を指定して value を設定
2.   get(key)
     –   key にひもづけられた value を取得
3.   has(key)
     –   key にひもづけられた値があるかチェック
4.   delete(key)
     –   key に対するエントリを削除




※ has, delete は Firefox 独自実装
いまさら連想配列……?
すでに {}・Object() があるけど?
{}・Object() と比較して


1. key にオブジェクトが指定可能
 –   しかも多くの実装では定数時間で値が取得できる
2. key に指定されたオブジェクトを「弱く」参照
 –   GC (Garbage Collector) は何からも参照されていない
     オブジェクトを削除対象とする
 –   WeakMap の key として指定されたオブジェクトは GC
     から見ると「参照されていない」ことに
 –   他にそのオブジェクトを参照しているものが存在しなけ
     れば GC は遠慮無くオブジェクトを削除する
 –   (時間の都合上,詳しい説明はなし)
key にオブジェクトが指定可能
key にオブジェクトが指定可能 (1/2)
• {}・Object() は key に文字列しか指定できない
  – 文字列以外を渡すと ToString される
key にオブジェクトが指定可能 (2/2)
• WeakMap は key にオブジェクトが指定可能
 – 「オブジェクトしか」指定できない
 – プリミティブ値を指定するとエラー
使い道は?
オブジェクトの外部拡張 (1/2)
• 「オブジェクトを拡張して付加情報を持たせたいが,そ
  れができない」ということは良くある
• 例)
 – DOM ノードに独自プロパティを持たせると色々マズい
    • “What's wrong with extending the DOM”
         – http://perfectionkills.com/whats-wrong-with-extending-the-dom/
 – ECMAScript 5 ではオブジェクトの拡張を禁止できる
    • Object.freeze(obj)


                                                   “bar”
                プロパティの追加
   obj                                     obj
                                                   “foo”
オブジェクトの外部拡張 (2/3)

• オブジェクト自体は拡張せず,外に付加情報を持つ
  – オブジェクトを指定すると付加情報を取り出せる
• WeakMap を利用
  – キーとして外部拡張したいオブジェクトを指定
  – 値として付加情報(の集合)を指定
    • ここに付加情報を突っ込んでいく
• 利点
  – オブジェクトを汚染しない
  – オブジェクトが(GC によって)破棄されると,付加情報も一緒
    に破棄される
オブジェクトの外部拡張 (3/3)
 オブジェクト    付加情報一覧


 付加情報一覧をオブジェクト毎に準備



 付加情報の設定



 付加情報の取得




  node1, node2 を汚染せずに付加情報を持たせられた!
new WeakMap();
参考文献
[[harmony:weak_maps]]
  http://wiki.ecmascript.org/doku.php?id=harmony:weak_maps

ES.next
  http://www.slideshare.net/BrendanEich/esnext

WeakMap uniq
  http://d.hatena.ne.jp/murky-satyr/20110603/uniqmap
What's wrong with extending the DOM
  http://perfectionkills.com/whats-wrong-with-extending-the-dom/




                   ご清聴ありがとうございました

Contenu connexe

Tendances

Tour of distributed systems 1 - ZooKeeper
Tour of distributed systems 1 - ZooKeeperTour of distributed systems 1 - ZooKeeper
Tour of distributed systems 1 - ZooKeeperChris Birchall
 
マイクラ自動化枠第2回資料
マイクラ自動化枠第2回資料マイクラ自動化枠第2回資料
マイクラ自動化枠第2回資料Ryo Fujita
 
コンテナイメージの脆弱性スキャンについて
コンテナイメージの脆弱性スキャンについてコンテナイメージの脆弱性スキャンについて
コンテナイメージの脆弱性スキャンについてYASUKAZU NAGATOMI
 
マイクラ自動化枠第1回資料
マイクラ自動化枠第1回資料マイクラ自動化枠第1回資料
マイクラ自動化枠第1回資料Ryo Fujita
 
RとSQLiteで気軽にデータベース作成
RとSQLiteで気軽にデータベース作成RとSQLiteで気軽にデータベース作成
RとSQLiteで気軽にデータベース作成弘毅 露崎
 

Tendances (6)

Tour of distributed systems 1 - ZooKeeper
Tour of distributed systems 1 - ZooKeeperTour of distributed systems 1 - ZooKeeper
Tour of distributed systems 1 - ZooKeeper
 
マイクラ自動化枠第2回資料
マイクラ自動化枠第2回資料マイクラ自動化枠第2回資料
マイクラ自動化枠第2回資料
 
DeclarativeSql
DeclarativeSqlDeclarativeSql
DeclarativeSql
 
コンテナイメージの脆弱性スキャンについて
コンテナイメージの脆弱性スキャンについてコンテナイメージの脆弱性スキャンについて
コンテナイメージの脆弱性スキャンについて
 
マイクラ自動化枠第1回資料
マイクラ自動化枠第1回資料マイクラ自動化枠第1回資料
マイクラ自動化枠第1回資料
 
RとSQLiteで気軽にデータベース作成
RとSQLiteで気軽にデータベース作成RとSQLiteで気軽にデータベース作成
RとSQLiteで気軽にデータベース作成
 

En vedette

Rios::Proxy - A framework for CLI
Rios::Proxy - A framework for CLIRios::Proxy - A framework for CLI
Rios::Proxy - A framework for CLIMasafumi Oyamada
 
Exploring the Performance Impact of Virtualization on an HPC Cloud
Exploring the Performance Impact of Virtualization on an HPC CloudExploring the Performance Impact of Virtualization on an HPC Cloud
Exploring the Performance Impact of Virtualization on an HPC CloudRyousei Takano
 
『BrandSafe はてな』のアドベリフィケーションのしくみ
『BrandSafe はてな』のアドベリフィケーションのしくみ『BrandSafe はてな』のアドベリフィケーションのしくみ
『BrandSafe はてな』のアドベリフィケーションのしくみLintaro Ina
 
クラウドの垣根を超えた高性能計算に向けて~AIST Super Green Cloudでの試み~
クラウドの垣根を超えた高性能計算に向けて~AIST Super Green Cloudでの試み~クラウドの垣根を超えた高性能計算に向けて~AIST Super Green Cloudでの試み~
クラウドの垣根を超えた高性能計算に向けて~AIST Super Green Cloudでの試み~Ryousei Takano
 
OSvの概要と実装
OSvの概要と実装OSvの概要と実装
OSvの概要と実装Takuya ASADA
 
ネイティブ開発アンチパターン
ネイティブ開発アンチパターンネイティブ開発アンチパターン
ネイティブ開発アンチパターンYuki Tamura
 
はてなブックマーク in Scala
はてなブックマーク in Scalaはてなブックマーク in Scala
はてなブックマーク in ScalaLintaro Ina
 

En vedette (9)

OSC 2011 KeySnail
OSC 2011 KeySnailOSC 2011 KeySnail
OSC 2011 KeySnail
 
Rios::Proxy - A framework for CLI
Rios::Proxy - A framework for CLIRios::Proxy - A framework for CLI
Rios::Proxy - A framework for CLI
 
Exploring the Performance Impact of Virtualization on an HPC Cloud
Exploring the Performance Impact of Virtualization on an HPC CloudExploring the Performance Impact of Virtualization on an HPC Cloud
Exploring the Performance Impact of Virtualization on an HPC Cloud
 
『BrandSafe はてな』のアドベリフィケーションのしくみ
『BrandSafe はてな』のアドベリフィケーションのしくみ『BrandSafe はてな』のアドベリフィケーションのしくみ
『BrandSafe はてな』のアドベリフィケーションのしくみ
 
クラウドの垣根を超えた高性能計算に向けて~AIST Super Green Cloudでの試み~
クラウドの垣根を超えた高性能計算に向けて~AIST Super Green Cloudでの試み~クラウドの垣根を超えた高性能計算に向けて~AIST Super Green Cloudでの試み~
クラウドの垣根を超えた高性能計算に向けて~AIST Super Green Cloudでの試み~
 
OSvの概要と実装
OSvの概要と実装OSvの概要と実装
OSvの概要と実装
 
ネイティブ開発アンチパターン
ネイティブ開発アンチパターンネイティブ開発アンチパターン
ネイティブ開発アンチパターン
 
Ruby everywhere
Ruby everywhereRuby everywhere
Ruby everywhere
 
はてなブックマーク in Scala
はてなブックマーク in Scalaはてなブックマーク in Scala
はてなブックマーク in Scala
 

ES.next WeakMap