typeof symbol (Was: Sept 19 TC39 Meeting Notes)

Brendan Eich brendan at mozilla.org
Sat Sep 29 11:52:44 PDT 2012


Rick Waldron wrote:
> Offline discussion with Dave that immediately identified a 
> deal-breaker: if typeof symbol were "string", it would break ===.
>
> === for strings is based on their contents
> === for objects is based on their identity

That's true but I think it has not to do with ===. It's because symbols 
must not be forgeable by spelling out any "contents" or "value" that can 
== or === another symbol's contents/value.

The invariant that applies:

    (typeof x == typeof y && x == y) <=>  (x === y).

This would hold even if typeof returned "string" for a symbol, so long 
as that symbol was == and === only itself.

It obviously also works if typeof returns "object" for a symbol, as in 
the current proposal.

In the sense that "abc" === "ab" + "c" then of course Dave's right. You 
can't do any such thing with a symbol. But so long as unforgeability is 
upheld, this issue is not about === (or ==). It's about typeof returning 
"string" for a symbol, a bad idea.

The lack of String.prototype delegation as if by auto-wrapping is a 
second deal-killer.

Between "object" and a new typeof result, "symbol", the safer course is 
"object".

For value objects such as int64 and uint64, I've come to believe that 
the invariant above conjoined with

   (0L == 0UL) === true

being the desirable == but not === behavior requires typeof 0L => 
"int64" and typeof 0UL => "uint64.

Value objects have content-based identity, but they're objects. Symbols 
could be viewed as objects and identity and typeof all work "for free".

To resolve Andreas's concern about cost of object, we could say that 
Symbols are frozen and empty. That would be enough to optimize as hard 
as possible.

/be




More information about the es-discuss mailing list