Actual WeakSet Use Cases

# Benjamin Gruenaum (4 years ago)

So umm... not to be annoying but I've been digging through esdiscuss and various blog posts online. I couldn't really find any use case for WeakSet (plenty of threads about naming things :P).

Most material about it online fails to distinguish it from what one would use a regular Set for. All the use cases I know for WeakSet for tagging objects aren't really relevant in JS (for example - in shared memory threading scenarios).

Can someone show me a convincing actual use case for WeakSet that can't better be solved without it?

Thanks, and sorry, Benjamin

# Domenic Denicola (4 years ago)

WeakSets are perfect for branding and are how I would expect web platform class branding to be explained.

const foos = new WeakSet();

class Foo {
  constructor() {
    foos.add(this);
  }
  
  method() {
    if (!foos.has(this)) {
      throw new TypeError("Foo.prototype.method called on an incompatible object!");
    }
  }
}
# Caitlin Potter (4 years ago)

You could use it to avoid bugs involving circular references when iterating, for example:

function iterate(O, fn) {
  if (O == null) return O;
  let objects = new WeakSet();
  iterate_inner(‘’, O, objects, fn);
  return O;

  function iterate_inner(name, O, objects, fn) {
    for (let key of Reflect.ownKeys(O)) {
      let value = O[key];
      let niceName = name ? `${name}.${key}` : key;

      if (typeof value === “object” && value) {
        // Avoid recursing into circular reference
        if (objects.has(value)) {
          continue;
        } else {
           fn(value, niceName);
           objects.add(value);
           iterate_inner(niceName, value, objects, fn);
        }
      } else {
        fn(value, niceName);
      }
    }
  }
}
# Erik Arvidsson (4 years ago)

Caitlin, in that example a normal Set works just as well. It can get gc'ed when you leave the iterate function.

# Caitlin Potter (4 years ago)

Yes, we had that discussion on #whatwg already, I haven’t had my coffee yet =)

# Benjamin Gruenaum (4 years ago)

Thanks Domenic,

Elaborating on your example with more details. Let's say you need to make sure at a certain point that an object has not been tinkered with by user code (for security reasons). You can't check the prototype or a symbol since those can be faked and you can't keep a regular Set because that would prevent any Foo object from ever being garbage collected.

# Tab Atkins Jr. (4 years ago)

Exactly. WeakSet's use-cases are all in the same family as WeakMap, just with a simpler set-up - rather than associating arbitrary data with the object, you just associate "is in this set" with it.