Andreas Rossberg (2013-04-13T07:31:57.000Z)
github at esdiscuss.org (2013-07-12T02:26:57.041Z)
On 13 April 2013 00:12, Brandon Benvie <bbenvie at mozilla.com> wrote: > 3.) A new type of primitive along with a new type of wrapper. In this case > we use the `String`/`Number`/`Boolean` precedent where `Symbol()` and `new > Symbol()` produce different kinds of results. The problem here is the > confusion that comes with `ToString`/`ToPropertyKey` when called on a Symbol > wrapper. What does `obj[new Symbol] = 5` do, for example? It allows footguns > like `obj[key + '_ext']` to silently do the wrong thing. That was the consensus at the last meeting, and it's already implemented in V8. The decision included that `Symbol.prototype.toString` is poisoned, i.e., any attempt to implicitly convert a symbol or a wrapped symbol to a string will throw, including both of your examples. So no footgun, which I agree is important. (`Object.prototype.toString` is not on that path, however, so can treat symbols separately.) I'm a bit confused about some bits of Allen's comment on your Gist, though, which don't line up with what I thought we decided on. In particular, `ToObject(symbol)` should be perfectly fine and creates a wrapper object. Similarly, `Symbol()["foo"]` auto-converts to a wrapper object and returns undefined as usual, and `new Symbol()` directly creates a wrapper object.