ES 6新特性のSymbol使用詳細

2135 ワード

ローズマリーの章で「Symbol.iterator」という属性が現れましたが、果たしてSymboとは何ですか?
答え:SymbolはES 6で新しく定義された値で、文字列でもオブジェクトでもない、javaScriptのために追加された第7の基本的なタイプで、属性として、古いコードとの競合を修復するために多く使われます.
typeof Symbol()
//"symbol"
Symbolを作成するには3つの方法があります.
  • はSymbol()を呼び出し、この方式では毎回呼び出しごとに新しい一意のsmbolを返します.
  • はSymbol.forを呼び出して、このように作成したsmbolをsmbolレジストリに入れます.既に存在していると、smbolは同じ値に戻ります.これにより、異なるページでSymbolを共有することができます.
  • は、Symbol.iteratorなどの標準的に定義されたSymbolを使用する. .
  • オブジェクトではないので、newを使って作成する必要はありません.
    var s1 = Symbol("dog"); //dog     ,   console.log().  .toString()      ,      
    var s2 = Symbol("dog");
    console.log(s1 == s2); //false
    var s3 = Symbol.for("dog");
    console.log(s3 == s1); //false
    var s4 = Symbol.for("dog");
    console.log(s3 == s4); //true
    Symbolは属性のキーとして使用できますが、[]のみでアクセスできます.
    var s1 = Symbol("dog");
    //    
    var obj = {};
    obj[s1] = "dog";
    obj.s1 = "dog"; //error
    
    //    
    var obj = {
    	[s1]: "dog"
    }
    smbolが既に分かっているなら、それにアクセスしたり、削除したりすることができます.
    var s1 = Symbol("dog");
    var obj = {};
    obj[s1] = "dog";
    //       
    if(s1 in obj)
    //   
    delete obj[s1]
    が、一般的なオブジェクト検出は、for-innサイクル、Object.keys(obj)、Object.getOwn PropertyNames(obj)などのsmbolキーを無視する.これはjavaのprvateのようですが、Object.getOwn PropertySymbools(Obj)を通じて対象のすべてのsmbolキーをリストすることができます.Reflect.ownKeys(obj)は、すべての文字列キーとSymbolキーを返すので、完全にプライベートではありません.
    また、
    smbolは弱いカプセル化機構を持っています.現在の作用領域でのみ有効です.だから、他のモジュールとの衝突を心配することなく、一つのモジュールまたは一つのクローズドにsmbolを作成できます.
    var obj = (function(){
    	var s1 = Symbol("dog");
    	var obj = {};
    	obj[s1] = "dog";
    	console.log(obj[s1]);//dog
    	return obj;
    })();
    console.log(obj[s1]); //undefined
    はこのように使う以外にObject.getOwnPropertySymbols()以外はs 1というSymbolに外部からアクセスできません.
    smbolは他の基本タイプとは違います.
    自動的に文字列タイプに変換されませんので、smbolを+でつなぎ合わせないようにします.
    var s1 = Symbol("dog");
    console.log("cat" + s1);//TypeError: can't convert symbol to string
    console(123 - s1); //TypeError: can't convert symbol to number
    以上がSymbolの基本内容です.