Question about Symbols and GlobalSymbolRegistry
Correct. The registry is only accessed via Symbol.for(key)
and Symbol.keyFor(sym)
. The parameter of Symbol()
is a description, not a key.
Am I understanding correctly?
Yes. The argument to the Symbol constructor is just a descriptive string.
A couple more questions.
-
Are the built-in symbols (like ‘Symbol.iterator’) in the GlobalSymbolRegsitry?
-
If so, what are their keys? i.e. how would one reach Symbol.iterator using Symbol.for(…)?
They are not - if they were, then adding a new well-known symbol like
Symbol.foo would fail if anyone had code that did Symbol.for('foo')
. (I
have no idea if that is the reason, but certainly that's a reason not to
make them available via the registry)
It may make sense to add them. Their identifiers would have to be as unambiguous as possible, e.g. URIs such as "ecmascript.org/symbol/foo, ecmascript.org/symbol/foo".
Axel Rauschmayer wrote:
It may make sense to add them. Their identifiers would have to be as unambiguous as possible, e.g. URIs such as "ecmascript.org/symbol/foo".
Symbol.iterator and the other well-known symbols are self-same in all connected realms. See people.mozilla.org/~jorendorff/es6-draft.html#sec-well-known-symbols.
So there's no need for this (and URLs suck for such things; plus, you probably mean URIs, but I don't care enough to check!).
On 28 Jan 2015, at 00:06, Brendan Eich <brendan at mozilla.org> wrote:
So there's no need for this
There is one use case (admittedly a rather hypothetical one): serializing the Symbol.* symbols to a text format (e.g. an encoding in JSON).
(and URLs suck for such things; plus, you probably mean URIs, but I don't care enough to check!).
Yes, I mean URIs(?)
Axel Rauschmayer wrote:
There is one use case (admittedly a rather hypothetical one): serializing the Symbol.* symbols to a text format (e.g. an encoding in JSON).
Symbols that user-code puts into the registry do not serialize this way, so why should the well-known ones?
If you want to write a JSON helper-pair (toJSON or a replacer, with a correponding reviver, I think), then you can indeed serialize and deserialize symbols. But there's no ES6 backstage default-wiring from JSON to Symbol.for/keyFor.
I am reading the Symbol section of the ES6 spec (19.4), and my understanding is that calling the Symbol constructor does not add an entry to the GlobalSymbolRegistry. Is that correct?
For example:
var s1 = Symbol("foo"); var s2 = Symbol.for("foo");
In this example, s1 and s2 would be two distinct symbols. And in the following example:
var s1 = Symbol("foo"); var s2 = Symbol.keyFor(s1);
In this example, s2 would be undefined.
Am I understanding correctly?