Symbol history

# T.J. Crowder (6 years ago)

I've tried to glean this from the meeting notes and such, but many who were actively involved are on the list, so:

Am I right that Symbols started out as "private Name objects" then over time their name was changed, they became primitives, and the privacy aspect was dropped; but having guaranteed-unique values was still useful, and found application (amongst other places) in solving the problem of adding a default iterator to Array.prototype without name conflicts with existing code in the wild?

Thanks,

-- T.J. Crowder

# Allen Wirfs-Brock (6 years ago)

That's a pretty good summary

⁣Sent from BlueMail ​

# Michael Dyck (6 years ago)

On 2018-05-28 02:09 PM, T.J. Crowder wrote:

Am I right that Symbols started out as "private Name objects" then over time their name was changed, they became primitives,

As far as the spec is concerned...

Symbols were introduced in draft 12 of ES6. They were defined as a kind of exotic object, stateless and immutable.

In draft 15, Symbol became a primitive type. In draft 16, it went back to being a kind of exotic object. In draft 19, it went back to being a primitive type.

You can find the drafts here: web.archive.org/web/20131017074027/http://wiki.ecmascript.org:80/doku.php?id=harmony:specification_drafts

# Mark Miller (6 years ago)

There was at some point an attempt at elaborating "symbol" into some kind of "private name" or "private symbol", which failed for well explained reasons. However, this is not where symbols started. Symbols started as a way to introduce new properties while avoiding conflict with possible property names, IOW, as a way to introduce new property "names" that were guaranteed not to collide with any existing names. This is still their primary purpose.

# Mike Samuel (6 years ago)

esdiscuss.org/topic/private-slots """ Allen Wirfs-Brock (5 years ago)

As further evidence, the word "private" does not even occur in sections 8.1.6 and 8.1.6.1 of the current ES6 draft. These are the sections that define the ES6 object model. Small changes and additions had to be made to allow for property keys to be either strings or symbols but those changes are independent of whether a symbol is private or not. The only place that the privateness of a symbol comes into play (besides in proxies) is in the context of a few reflection operations whose behavior is predicated upon whether a symbol property key is a private symbol or not. This is very similar to the tests that the same or similar operations make on individual property attributes. """ I don't know when Object.getOwnPropertySymbols made symbols useless for private-like symbols, bit IIUC, 5 years ago they were kind of being advanced for both to allow properties visible only to a symbol holder and for cooperative namespace separation.

# Allen Wirfs-Brock (6 years ago)

For a while TC39 considered syntactic support for referencing Symbol-keyed properties. EG:

let pri = new Symbol; obj. at pri = 42;

When we realized that symbols weren't private enough, we decided that [ ] would suffice.

At that point using Symbols for "soft private" was no more convenient and perhaps  less then just using a _ prefix to be indicate soft-private.

# Allen Wirfs-Brock (6 years ago)

A good starting point for researching the history is: web.archive.org/web/20110505015255/http://wiki.ecmascript.org:80/doku.php?id=strawman:private_names

And the pages it links to. ⁣

# T.J. Crowder (6 years ago)

Thanks all!

On Mon, May 28, 2018 at 7:36 PM, Michael Dyck <jmdyck at ibiblio.org> wrote:

As far as the spec is concerned...

Thanks. Sorry Michael, I should have been more clear: I'm talking about the history leading up to the spec.

On Mon, May 28, 2018 at 7:33 PM, Allen Wirfs-Brock <allen at wirfs-brock.com>

wrote:

That's a pretty good summary

On Tue, May 29, 2018 at 2:51 AM, Allen Wirfs-Brock <allen at wirfs-brock.com>

wrote:

A good starting point for researching the history is: web.archive.org/web/20110505015255/http://wiki.

ecmascript.org:80/doku.php?id=strawman:private_names

Thanks Allen. If the summary was good enough, that's as much detail as I need to get into.

Thanks again all!

-- T.J. Crowder

# kai zhu (6 years ago)

As far as the spec is concerned...

Symbols were introduced in draft 12 of ES6. They were defined as a kind of exotic object, stateless and immutable.

In draft 15, Symbol became a primitive type. In draft 16, it went back to being a kind of exotic object. In draft 19, it went back to being a primitive type.

can i ask why they were changed to primitive-type instead of exotic-object? what are the disadvantages of keeping symbols as objects (with an extra Object.isSymbol subtype-check)?

because one obvious advantage from what i see, is to avoid breaking backwards-compatibility with previously stable-code (since es1 in 1997 [1]) that rely on typeof checks:

if (typeof foo === ...) {
    ...
} else {
    // break backwards-compatibility with stable-code since es1
    // due to unexpected symbol-case
    ...
}

[1] ECMA-262, 1st edition, June 1997 www.ecma-international.org/publications/files/ECMA-ST-ARCH/ECMA-262, 1st edition, June 1997.pdf, www.ecma-international.org/publications/files/ECMA-ST-ARCH/ECMA-262, 1st edition, June 1997.pdf

kai zhu kaizhu256 at gmail.com