情報アイランド

「情報を制する者は世界を制す」をモットーに様々な情報を提供することを目指すブログです。現在はプログラミング関連情報が多めですが、投資関連情報も取り扱っていきたいです。

ECMAScript 6の新機能(5)シンボル

2016/05/27

シンボル

ECMAScript 6でシンボルという新しい型が導入されました。

シンボルはユニークな値を表します。

シンボルの生成

シンボルを生成するにはSymbol関数を使用します。

第1引数にシンボルに対する説明を文字列として指定します。この引数は指定しなくても構いません。

C:\work\node>node
> var s1 = Symbol()
undefined
> var s2 = Symbol()
undefined
> var s3 = Symbol('description')
undefined
> var s4 = Symbol('description')
undefined

シンボルの比較

シンボルはユニークな値を表すため全て互いに異なります。

そのため、=====で2つのシンボルを比較した場合には必ずfalseが返ります。!=!==の場合も同様です。

> s1 == s2
false
> s1 === s2
false
> s3 == s4
false
> s3 === s4
false
> s1 != s2
true
> s1 !== s2
true
> s3 != s4
true
> s3 !== s4
true

勿論、=====で同じシンボルを比較した場合にはtrueが返ります。!=!==の場合も同様です。

> s1 == s1
true
> s1 === s1
true
> s1 != s1
false
> s1 !== s1
false

シンボルの変換

シンボルを文字列に変換するにはString関数又はtoString関数を使用します。

> String(s1)
'Symbol()'
> s1.toString()
'Symbol()'
> String(s3)
'Symbol(description)'
> s3.toString()
'Symbol(description)'

暗黙的に文字列に変換しようとするとエラーが発生しますので注意してください。

> s1 + 'string'
TypeError: Cannot convert a Symbol value to a string
    at repl:1:4
    at REPLServer.defaultEval (repl.js:272:27)
    at bound (domain.js:280:14)
    at REPLServer.runBound [as eval] (domain.js:293:12)
    at REPLServer.<anonymous> (repl.js:441:10)
    at emitOne (events.js:101:20)
    at REPLServer.emit (events.js:188:7)
    at REPLServer.Interface._onLine (readline.js:219:10)
    at REPLServer.Interface._line (readline.js:561:8)
    at REPLServer.Interface._ttyWrite (readline.js:838:14)

シンボルを数値に変換することはできません。

> Number(s1)
TypeError: Cannot convert a Symbol value to a number
    at repl:1:1
    at REPLServer.defaultEval (repl.js:272:27)
    at bound (domain.js:280:14)
    at REPLServer.runBound [as eval] (domain.js:293:12)
    at REPLServer.<anonymous> (repl.js:441:10)
    at emitOne (events.js:101:20)
    at REPLServer.emit (events.js:188:7)
    at REPLServer.Interface._onLine (readline.js:219:10)
    at REPLServer.Interface._line (readline.js:561:8)
    at REPLServer.Interface._ttyWrite (readline.js:838:14)
> s1 + 100
TypeError: Cannot convert a Symbol value to a number
    at repl:1:4
    at REPLServer.defaultEval (repl.js:272:27)
    at bound (domain.js:280:14)
    at REPLServer.runBound [as eval] (domain.js:293:12)
    at REPLServer.<anonymous> (repl.js:441:10)
    at emitOne (events.js:101:20)
    at REPLServer.emit (events.js:188:7)
    at REPLServer.Interface._onLine (readline.js:219:10)
    at REPLServer.Interface._line (readline.js:561:8)
    at REPLServer.Interface._ttyWrite (readline.js:838:14)

シンボルを真偽値に変換するにはBoolean関数を使用します。

全てのシンボルがtrueに変換されます。

> Boolean(s1)
true

暗黙的に真偽値に変換することもできます。

> !s1
false

シンボルの型名

シンボルの型名はsymbolです。

> typeof s1
'symbol'

グローバルシンボルレジストリ

ECMAScript 6でグローバルシンボルレジストリが導入されました。

グローバルシンボルレジストリとはシンボルを複数のコードで共有するための保管場所です。

Symbol.for

グローバルシンボルレジストリでシンボルの作成及び取得を行うにはSymbol.for関数を使用します。

第1引数にシンボルに対する説明を文字列として指定します。この説明はグローバルシンボルレジストリにおけるシンボルに対するキーとしても使用されます。

返り値としてシンボルが得られます。

グローバルシンボルレジストリでシンボルがまだ作成されていなかった場合にはシンボルを作成してからそのシンボルを返します。

> var foo = Symbol.for('foo')
undefined
> var foo2 = Symbol.for('foo')
undefined
> foo
Symbol(foo)
> foo2
Symbol(foo)
> foo === foo2
true
> var bar = Symbol.for('bar')
undefined
> bar
Symbol(bar)
> foo === bar
false

Symbol.keyFor

シンボルからグローバルシンボルレジストリにおけるキーを取得するにはSymbol.keyFor関数を使用します。

第1引数にシンボルを指定します。

返り値としてキーが得られます。

ただし、グローバルシンボルレジストリにシンボルが存在しない場合にはundefinedが返ります。

> Symbol.keyFor(foo)
'foo'
> Symbol.keyFor(bar)
'bar'
> Symbol.keyFor(Symbol('baka'))
undefined
pizyumi
プログラミング歴19年のベテランプログラマー。業務システム全般何でも作れます。現在はWeb系の技術を勉強中。
スポンサーリンク

-ecmascript 2015, ecmascript 6, Javascript