6
3

More than 5 years have passed since last update.

Symbolプリミティブは文字列や数値への暗黙的な型変換をしない。

Last updated at Posted at 2017-08-08

Symbol("foo").toString()とすると文字列に変換されるけど Symbol("foo") + ""とすると TypeError: Cannot convert a Symbol value to a string となる。ポイントは明示的(explicit)か暗黙的(implicit)かで、Symbolでは明示的にtoString()を使用する分には問題ないけれど、暗黙的に型変換が行われようとすると TypeErrorを返す仕様となっている。暗黙的でなければ良いので、Symbol("foo").toString() + ""とすれば問題なく使える。

文字列への型変換(Type Conversion)については、http://www.ecma-international.org/ecma-262/6.0/#sec-tostring のあたりが仕様となる。Objectを文字列へ型変換する場合はtoString()があればそれが使われる。一方、SymbolではTypeErrorとなる(SymbolにもtoStringメソッドはあるのだけど)。数値への型変換でも同様にTypeErrorとなる。

Symbolの利用目的 (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol) を考えると、ユニークなはずの値を暗黙的な型変換によってユニークに扱われずに問題を起こす... みたいなことは容易に想像できるので、妥当な感じはある。

Every symbol value returned from Symbol() is unique. A symbol value may be used as an identifier for object properties; this is the data type's only purpose. Some further explanation about purpose and usage can be found in the glossary entry for Symbol.

とはいえ、(console.logに出すとか)何の気なしにSymbolと合わせて文字列作ろうとしてTypeErrorが出て混乱することもありそう。

なので「Symbolでは文字列と数値への暗黙的な型変換はされない」という点は覚えておいてもいいかもしれない。

6
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
3