Andreas Rossberg (2013-04-13T07:31:57.000Z)
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.

/Andreas
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.