Even if I create two identical strings the engines won’t necessarily immediately inturn those two values into the same heap object.
So when I drop a reference to the first one, that object may no longer be live but the identical one is.
WeakRefs storing objects has simpler semantics to define because objects are not forgeable. Two different js object values are never equal.
To clarify: if a WeakRef has dropped its ref then that is a guarantee that the object it was pointing to can no longer suddenly re-appear.