A purposely boxed Symbol object type, e.g., created via Object(Symbol('key')). This works perfectly fine when used as an object's symbol-key.
Symbol
Object(Symbol('key'))
Consider the following example:
const mySymbolKey = Symbol('key');const symbolObject = Object(mySymbolKey);console.log('(mySymbolKey === symbolObject) ...', (mySymbolKey === symbolObject)); // falseconsole.log('(mySymbolKey == symbolObject) ...', (mySymbolKey == symbolObject)); // trueconst myObject = { foo: 'Foo' };myObject[mySymbolKey] = 'value set by `mySymbolKey`.';// ^^^^^^^^^^^console.log({ myObject }); // { "myObject": { "foo": "Foo", Symbol(key): "value set by `mySymbolKey`." } }console.log('myObject[symbolObject] ...', myObject[symbolObject]); // 'value set by `mySymbolKey`.'// ---------^^^^^^^^^^^^ ---------^^^^^^^^^^^^myObject[symbolObject] = 'value overwritten by `symbolObject`.';// ^^^^^^^^^^^^console.log({ myObject }); // { "myObject": { "foo": "Foo", Symbol(key): "value overwritten by `symbolObject`." } }console.log('myObject[mySymbolKey] ...', myObject[mySymbolKey]); // 'value overwritten by `symbolObject`.'// ---------^^^^^^^^^^^ ---------^^^^^^^^^^^ Copy
const mySymbolKey = Symbol('key');const symbolObject = Object(mySymbolKey);console.log('(mySymbolKey === symbolObject) ...', (mySymbolKey === symbolObject)); // falseconsole.log('(mySymbolKey == symbolObject) ...', (mySymbolKey == symbolObject)); // trueconst myObject = { foo: 'Foo' };myObject[mySymbolKey] = 'value set by `mySymbolKey`.';// ^^^^^^^^^^^console.log({ myObject }); // { "myObject": { "foo": "Foo", Symbol(key): "value set by `mySymbolKey`." } }console.log('myObject[symbolObject] ...', myObject[symbolObject]); // 'value set by `mySymbolKey`.'// ---------^^^^^^^^^^^^ ---------^^^^^^^^^^^^myObject[symbolObject] = 'value overwritten by `symbolObject`.';// ^^^^^^^^^^^^console.log({ myObject }); // { "myObject": { "foo": "Foo", Symbol(key): "value overwritten by `symbolObject`." } }console.log('myObject[mySymbolKey] ...', myObject[mySymbolKey]); // 'value overwritten by `symbolObject`.'// ---------^^^^^^^^^^^ ---------^^^^^^^^^^^
This demonstrates that, although the primitive symbol and its boxed object are not strictly equal (===), their loose equality (==) is enough for them to act as interchangeable property keys.
===
==
A purposely boxed
Symbolobject type, e.g., created viaObject(Symbol('key')). This works perfectly fine when used as an object's symbol-key.Consider the following example:
This demonstrates that, although the primitive symbol and its boxed object are not strictly equal (
===), their loose equality (==) is enough for them to act as interchangeable property keys.