David Bruant wrote:
In theory, private symbols should have the same GC issues than
WeakMap. Consider:
var o = {}, o2 = {};
for(var i=0, i<1000, i++){
let s = new Symbol(true /*private*/);
o[s] = o2[s] = i;
}
Here, private symbols are created, properties are added. Because of
let-locality, every symbol can be GC'ed, because at the end of the
loop, no one can ever access any of the symbols. The equivalent of the
WeakMap GC property would want properties in o and o2 to be removed
too. I'm willing to bet this will never happen in any JS engine.
This is not the "GC issue" that was raised, precisely because WeakMap
does make no-cyclic-leak guarantees that Symbols as used in your example
do not.
So Symbols could have the leak problem that WeakMaps cure, and that is
another issue.
But the cost of allocating a WeakMap per object that wants private
properties, and then GC'ing it promptly per the guarantee, is the main
issue. When you need a WeakMap, this cost must be born. When you just
need private properties (pace Kevin on "need"), the allocation and the
GC mark/sweep overhead should not be imposed lightly.
Another issue, as mentioned: property access performance with private
symbols (or unique/public ones) will be much better, out of the gates.
Not a GC issue, just repeating so it doesn't get lost.
The major difference is how people will use each tool. From experience
in OO programming, most objects have a finite set of properties
determined at object creation time. It's true even in JavaScript where
objects are bags of properties. This allows to write "stable" code
(you can write "o.find()" assuming there is a find property which
value is an function). If people were creating eratic objects, writing
what I call "stable" code would be a much more complicated exercise.
This "cultural" use of objects is what makes optimizations like
Shape/HiddenClass possible.
Yup, I should have read ahead.
WeakMaps, on the other hand, are used as a maps key'ed on objects,
with the convenience that you don't need to clean the map when the
object is about to disappear. There is a assumption that when you
create a new weakmap, its use is largely independent of previous
weakmaps and it's unlikely 2 weakmaps will have the same set of
objects, so engines are unlikely to perform optimizations combining
different weakmap storages so that the values of the same key will be
close to one another or something like that.
WeakMap and Symbols each corresponding to a given patterns of use of
(object, object) -> value mappings. Although a unique feature could be
used to emulate the other, it would be very hard for an implementation
to optimize one feature for 2 patterns.
If anything, choosing one feature over the other is a way to tell your
coworkers and the JS engine which pattern you want to use.
Good point. There is inherent complexity in having two things, with some
overlap. I don't see it as fatal. I think Kevin's stronger point is
YAGNI re: high-integrity privacy, outside of SES use-cases.
But SES support is a goal of Harmony and ES6.
/be
_______________________________________________
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss