2015-11-22 13 views
15

C#からLisp、ScalaからHaskellまでのすべての言語で作業していた言語に関して、私はブロックを巡っていました。シンボルをサポートしているすべての言語でシンボルはほとんど同じでした。つまり、同じ名前の2つのシンボルは、シングルトンオブジェクトであるため同一であることが保証されています。ES6シンボルの理解

ラケット:(equal? 'foo 'foo)

のCommon Lisp:(eq 'foo 'foo)

ルビー::foo == :foo

スカラ:'foo == 'foo

ES6:Symbol('foo') === Symbol('foo')

シンボルがシングルトンであることの利点は明らかです:あなたのキーがあなたの入力と等しくないようにするために、マップ/辞書でそれらを使用することができます。なぜなら、言語が突然異なる方法でハッシュすることになるからです(Rubyを見て)。

ECMAScript 6はこれに対して別のアプローチをとっており、どうすれば回避できますか?

答えて

14

あなたはすることができます(ソートの)登録(グローバル)の記号を使用して名前で「知り得る」というシンボルの効果を得る:もちろん

var s1 = Symbol.for("foo"); 
var s2 = Symbol.for("foo"); 
s1 === s2; // true 

あなたが、あまりにも自分自身のシンボルのレジストリを作成することができますマップインスタンスまたはプレーンオブジェクト。私は新しいシンボルのインスタンスを作成する際に、オプションの文字列パラメータの意図は、プログラマにシンボルの意味と目的を識別する方法を提供することであることを追加します

編集 —。その文字列がなければ、SymbolはSymbolとしてはうまく動作しますが、デバッガでオブジェクトをダンプすると、そのような匿名Symbolインスタンスによってキーされたプロパティは値に過ぎません。 Symbolキーを持つオブジェクトに数値プロパティを保持している場合は、数字だけが表示されますが、それは混乱します。 Symbolインスタンスに関連付けられた説明文字列は、Symbolの一意性をキー値として損なうことなくプログラマの参照情報を提供します。

最後に、同じように構築された2つのSymbolインスタンスに対して、.toString()を呼び出した結果をいつでも比較できます。私は容疑者その練習は疑わしいと考えられるが、確かにそれを行うことができます。

編集より —それは、JavaScriptでのシンボル作成のデフォルト動作がアーランやClojureの中のキーの原子、たとえば、よりタイプがより便利になるという事実と私に起こります。言語はデフォルトで固有の値が保証されているため、名前空間の衝突の根本的な問題は非常にうまく解決されます。 「よく知られている」シンボルで作業することは可能ですが、衝突を避けたいと思うかもしれない他のコードとの衝突を心配することなく利用できるユニークな値があります。 JavaScriptには、プログラマが知らないコードによって汚染されているかもしれないグローバルな名前空間の問題があります。コードはブラウザ環境とは異なるパーティーのアクションのためにブラウザ環境で衝突する可能性があるため、ユニークで普遍的で制御不能な問題です、および未知数には、任意の数のソフトウェアアーキテクトが含まれます。

+1

なぜ 'sort-of' - 'それを乗り越えるための良い方法だと思われるのですか? –

+0

@JaromandaXよく彼らはどのようなスコープでもありませんが、私が知っている他の言語のシンボル、Clojure、...それは私が現時点で考えることができるすべてです)。 – Pointy

+0

この回答は「理由」には該当しません。 – Ben

関連する問題