Why Symbols not convert string implicitly

You can, however you're not meant to do so by accident.

console.log(''+String(Symbol('My symbol!')))
// Symbol(My other symbol!)

console.log(Symbol('My symbol!').description)
// My other symbol!

console.log(Symbol.keyFor(Symbol.for('My other symbol!')))
// My other symbol!    

Note: Symbol.keyFor only works for symbols created via the Symbol.for function.

Symbol.keyFor(Symbol('My symbol!')) will evaluate to undefined.

You can also use .description to get the string value used to create the symbol.

  • https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol/for
  • https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol/keyFor

According to ECMA-262, using the addition operator on a value of type Symbol in combination with a string value first calls the internal ToPrimitive, which returns the symbol. It then calls the internal ToString which, for Symbols, will throw a TypeError exception.

So calling the internal ToString is not the same as calling Symbol.prototype.toString.

So I guess the answer to:

Why does the implicit type conversion not work?

is "because the spec says so".

Tags:

Javascript