I would like to agree that .keys would expose some of the internal workings of the GC. This is true, but the solution to that could be to remove .keys() off the individual WeakMap for secure operations, however in some situations where a WeakMap is sandboxed within a closure or such, having .keys allows for sharing private variables between objects discretely without exposing them to the public eye (similair to the friendly idea in c++). Lets take a look at a use case of weak maps to hold private information:<div>

<br></div><div>(function(){</div><div>var hiddenMap = new WeakMap()</div><div>//constructor function</div><div>Foo = function Foo() {</div><div>  var private = {friends:[]}</div><div>  hiddenMap.set(this,private)</div><div>

}</div><div>Foo.prototype.verifyAgainst = function(otherFoo) {</div>  var otherFoo_private = hiddenMap.get(otherFoo)<meta charset="utf-8"><br class="Apple-interchange-newline">  var thisFoo_private = hiddenMap.get(this)<meta charset="utf-8"><div>

  if(otherFoo_private.friends.indexOf(this)!==-1&amp;&amp;thisFoo_private.friends.indexOf(otherFoo)!==-1) {</div><div>    //do something only friends can do</div><div>  }</div><div>}</div><div>Foo.prototype.extend = function(subconstructorFactory) {</div>

<div>  return subconstructorFactory(hiddenMap)</div><div>}</div><div>})()</div><div>...</div><div>known to be secure code</div><div>...</div><div>Foo.prototype.extend = null</div><div>...</div><div>non-secure code</div><div>

...</div><div><br></div><div>Now say we extend Foo with Bar (inside the secure code area), and Bar wants to request access to all of the Foos in order to track which Foos are friends with each other on both ends. How will we be able to get a list of all the Foos in existence without leaking right now? The only possibilities I see are to not allow these sort of operations or to leak. On the level of use, it seems to me like a strict mode case vs a normal mode case unless we gain a collector callback.<br>

<br><div class="gmail_quote">On Thu, Sep 2, 2010 at 2:46 AM, Erik Corry <span dir="ltr">&lt;<a href="mailto:erik.corry@gmail.com">erik.corry@gmail.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">

2010/8/14 Mark S. Miller &lt;<a href="mailto:erights@google.com">erights@google.com</a>&gt;:<br>
<div class="im">&gt; On Sat, Aug 14, 2010 at 1:01 PM, Ash Berlin &lt;<a href="mailto:ash_js@firemirror.com">ash_js@firemirror.com</a>&gt; wrote:<br>
&gt;&gt;<br>
&gt;&gt; On 14 Aug 2010, at 07:22, Erik Arvidsson wrote:<br>
&gt;&gt; &gt; I have a few questions regarding the WeakMap API.<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; 1. Why isn&#39;t there a way to check for presence of a key (using<br>
&gt;&gt; &gt; has/contains)?<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; Given that undefined is a valid value it is not sufficient to just<br>
&gt;&gt; &gt; return undefined for get<br>
&gt;&gt;<br>
&gt;&gt; Does the standard trick of:<br>
&gt;&gt;<br>
&gt;&gt;  if (key in weakMapInstance) { }<br>
&gt;&gt;<br>
&gt;&gt; not work?<br>
&gt;<br>
&gt; It does not. A key is not a property name. A weak map is an object with two<br>
&gt; own properties, names &quot;get&quot; and &quot;set&quot;, whose values are the methods that<br>
&gt; constitute the weak map API.<br>
&gt;<br>
&gt;&gt;<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; 2. Why isn&#39;t there a way to remove a key-value-pair?<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; Setting the value to undefined is not the same.<br>
&gt;&gt;<br>
&gt;&gt; Again:<br>
&gt;&gt;<br>
&gt;&gt;  delete weakMapInstance[key];<br>
&gt;<br>
&gt; No. This syntax deletes named properties.<br>
&gt;<br>
&gt;&gt;<br>
&gt;&gt; &gt; 3. Why isn&#39;t there a way to iterate over the keys?<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; I can see that this might be a security issue but iteration is useful<br>
&gt;&gt; &gt; and security sensitive code can prevent iteration in several ways.<br>
&gt;&gt;<br>
&gt;&gt;  Object.keys(weakMapInstance)<br>
&gt;<br>
&gt; No. Object.keys enumerates property names.<br>
<br>
</div>And this is as it should be.  As it stands the weak map can be used as<br>
an object with private members.  The object key acts as a capability<br>
that controls whether or not you have access to the private member.<br>
If you are allowed to enumerate the keys then privacy goes out of the<br>
window.<br>
<div><div></div><div class="h5"><br>
&gt;<br>
&gt;&gt;<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; 4. Why does set throw if the key is not an object but get doesn&#39;t?<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; Same would go for delete and has if those are added.<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; _______________________________________________<br>
&gt;&gt; es-discuss mailing list<br>
&gt;&gt; <a href="mailto:es-discuss@mozilla.org">es-discuss@mozilla.org</a><br>
&gt;&gt; <a href="https://mail.mozilla.org/listinfo/es-discuss" target="_blank">https://mail.mozilla.org/listinfo/es-discuss</a><br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt; --<br>
&gt;     Cheers,<br>
&gt;     --MarkM<br>
&gt;<br>
&gt; _______________________________________________<br>
&gt; es-discuss mailing list<br>
&gt; <a href="mailto:es-discuss@mozilla.org">es-discuss@mozilla.org</a><br>
&gt; <a href="https://mail.mozilla.org/listinfo/es-discuss" target="_blank">https://mail.mozilla.org/listinfo/es-discuss</a><br>
&gt;<br>
&gt;<br>
_______________________________________________<br>
es-discuss mailing list<br>
<a href="mailto:es-discuss@mozilla.org">es-discuss@mozilla.org</a><br>
<a href="https://mail.mozilla.org/listinfo/es-discuss" target="_blank">https://mail.mozilla.org/listinfo/es-discuss</a><br>
</div></div></blockquote></div><br></div>