WeakSet

WeakSet与Set

相同: 不重复的值的集合

不同

var ws = new WeakSet();
ws.add(1);  // TypeError: Invalid value used in weak set
ws.add(Symbol()); // Uncaught TypeError: Invalid value used in weak set

WeakSet使用与方法

创建

var a = [[1,2], [3,4]];
var ws = new WeakSet(a);
var b = [3, 4];
var ws = new WeakSet(b);  // Uncaught TypeError: Invalid value used in weak set

方法

var ws = new WeakSet();
var obj = {};
var foo = {};
ws.add(window);
ws.add(obj);
console.log(ws.has(window)); // true
console.log(ws.has(foo));    // false
console.log(ws.delete(window));  // true
console.log(ws.has(window));    // false

特性

var ws = new WeakSet();
console.log(ws.size);   // undefined
console.log(ws.forEach);  // undefined

WeakMap

WeakMap与Map区别

var map = new WeakMap()
map.set(1, 2);  // Uncaught TypeError: Invalid value used as weak map key

WeakMap使用场合与目的

// 这demo怎么测试呀?好头疼
var wm = new WeakMap();
var element = document.getElementById('spchx');
wm.set(element, "Original");
wm.get(element);  // "Original"
element.parentNode.removeChild(element);
var temp = element;
element = null;
wm.get(temp); // "Original"

// 使用Map
var wm = new Map();
var element = document.getElementsByTagName("div");
wm.set(element, "Original");
console.log(wm.get(element)); // "Original"
var temp = element;
element = null;
wm.get(temp); // 

WeakMap特性与应用

基本特性

典型应用

let myElement = document.getElementById('logo-sub');
let myWeakmap = new WeakMap();

myWeakmap.set(myElement, {timesClicked: 0});

myElement.addEventListener('click', function() {
  let logoData = myWeakmap.get(myElement);
  logoData.timesClicked++;
  myWeakmap.set(myElement, logoData);
}, false);