ES 6新規データタイプ(Symbol)

25580 ワード

ES 6新規データタイプ(Symbol)
基本タイプと引用タイプはSymbolを知る前に、JSのデータタイプを知る必要があります.JSではデータタイプは2種類に分けられます.基本タイプと引用タイプです.
  • 基本タイプ:数値タイプ(Number)、文字タイプ(String)、ブール値タイプ(Boolean)、null、undefined
  • 参照タイプ:オブジェクト
  • ここでSymbolも基本タイプです.
    概説ES 6は、新しい元のデータタイプSymbolを導入し、ユニークな値を表し、最大の使用法は、オブジェクトを定義するための唯一の属性名である.
    	let syb1 = Symbol();
    	let syb2 = Symbol();
    	
    	console.log(syb1)  // Symbol()
    	console.log(typeof syb1)  // 'symbol'
    	console.log(syb1 == syb2) // false
    	console.log(syb1 === syb2) // false
    
    したがって、Symbolの記述値パラメータが同じであっても、それらの値は同じではなく、記述値が記述の役割を果たしているだけで、Symbol値自体に対して何の変化もしないことを示している.記述値に関して注意すべき点は、Symbol値以外のすべての値を受け入れることである.
    	let s1 = Symbol('foo');
    	let s2 = Symbol('bar');
    	let s3 = Symbol(3.6);
    	let s4 = Symbol({
         foo:'bar'});
    	
    	console.log(s1) // Symbol(foo)
    	console.log(s2) // Symbol(bar)
    	console.log(s1.toString()) // "Symbol(foo)"
    	console.log(s2.toString() )// "Symbol(bar)"
    	console.log(s3) //Symbol(3.6)
    	console.log(s4) //Symbol([object Object])
    
    
    なぜSymbolは基本的な(値)タイプですか?参照タイプではありません.Symbol関数はコンストラクタではないので、new方法を使ってSymbolオブジェクトを生成できません.そうでないと、コンパイラは次のコードを実行するように異常を投げます.
    	new Symbol	//TypeError: Symbol is not a constructor
    
  • Symbol値は他のタイプの値とは演算できません.
  • エラーが発生します.
  • smbolによって得られたシンボルは永遠に等しくありません.
  • Symbol値は、明示的に文字列に変換しても良いし、ブール値に変換しても良いが、数値
  • には変換できない.
  • ES 2019にSymbolの記述を読み取るためにdescriptionを追加しました.description
  • 属性名としてはSymbolの値が等しくないので、Symbolを対象とした属性名は、属性が名前を重ねないことを保証することができます.
    	const syb1 = Symbol("          ");
    	const obj = {
         
    		 a : 1,
    		 b : 2,
    		 [syb1] : 3
    	}
    	console.log(obj[syb1])	//3
    
  • Symbolは対象属性名としては使えません.演算子は、四角い括弧
  • を使います.
  • Symbol値が属性名である場合、この属性は共有属性であり、プライベート属性ではなく、クラスの外部アクセス
  • である.
    属性名の遍歴Symbolは属性名として遍歴されないいくつかの方法です.
  • for…in、for…ofサイクル中
  • Object.keys()
  • Object.getOwn PropertyNames()
  • Symbolは属性名として照会できます.
  • Object.getOwn PropertySymbors()
    この方法は、現在のオブジェクトのすべてが属性名として使用されているSymbol値である行列を返します.
  • プライベートメソッドを定義
    		const Hero = ( () =>{
         
                const getli = Symbol();		//   
                return  class Hero{
         
                    constructor(gong,fang,hp){
         
                        this.gong = gong;
                        this.fang = fang;
                        this.hp = hp; 
                    }
                    getgong(){
         
                        console.log(this.gong * this.getli(0.8,1.1))
                    }
                    [getli](min,max){
         
                        return Math.random() * (max - min) + min; 
                    }
                }
            
            } )()
    
            const hero = new Hero(50,10,1000);
            console.log(hero)	//Hero {gong: 50, fang: 10, hp: 1000}
    
    Symbol.for()、Symbol.keyFor()
  • Symbol.for():同じSymbol値を再利用する
  • 文字列をパラメータとして受け入れ、そのパラメータを名前とするSymbol値があるかどうかを検索します.もしあるなら、このSymbol値を返します.そうでないと、新しいSymbol値を作成して、グローバルに登録します.
    	let syb1 = Symbol.for('foo');
    	let syb2 = Symbol.for('foo');
    	
    	syb1 === syb2 // true
    
  • Symbol.keyFor()方法は、登録されたSymbolタイプ値のkey
  • を返す.
    	let syb1 = Symbol.for("foo");
    	Symbol.keyFor(syb1) // "foo"
    	
    	let syb2 = Symbol("foo");
    	Symbol.keyFor(syb2) // undefined
    
    知名な記号(特殊な共有記号)
  • Symbol.has Instanceは、instance ofの値に影響を与えることができ、この方法はinstance ofステートメントの使用のために呼び出され、オブジェクトがあるクラスのインスタンスかどうかを確認する.
     		function A() {
         }
            const a = new A();
            
            console.log(a instanceof A);    //true
    		console.log(A[Symbol.hasInstance](a));  //true
    
    		function A() {
         }
            const a = new A();
            
            Object.defineProperty(A,Symbol.hasInstance, {
         
    			value : function(){
         
    				return false;
    			}
    		})
    
            console.log(a instanceof A);    //false
    		console.log(A[Symbol.hasInstance](a));  //false
    
  • Symbol.isConcat Spreadableは、配列を構成するconcat方法をどのようにスティッチングしても良いですか?オブジェクトに属性を定義するための
  • 		const arr1 = [1,2,3];
            const arr2 = [4,5,6];
            arr2[Symbol.isConcatSpreadable] = false;
            const arr3 = arr1.concat(arr2);
            console.log(arr3)	// [1, 2, 3, [4,5,6]]
    
  • Symbol.toPrimitiveこの方法は、オブジェクトが値タイプに変換する必要があるときに呼び出すことができ、プログラムの動作に応じてオブジェクトの変換が必要な値を決定することができる.
    		const obj = {
         
    		    a: 1,
    		    b: 2
    		}
    		// obj[Symbol.toPrimitive] = function() {
         
    		//     return 100;
    		// }
    		console.log(obj + 123); 
    		console.log(obj * 123); 
    
    		class Temperature {
         
    		    constructor(degree) {
         
    		        this.degree = degree;
    		    }
    		        [Symbol.toPrimitive](type) {
         
    		            console.log(type)
    		            if (type === "default") {
         
    		                return this.degree + "   ";
    		            } else if (type === "number") {
         
    		                return this.degree;
    		            } else if (type === "string") {
         
    		                return this.degree + "℃"
    		            }
    		        }
    		}
    		const t = new Temperature(30);
    		// console.log(t + 1)
    		console.log(String(t))
    
  • Symbol.toStrigTagこの有名なシンボルはObject.prototype.toStringの戻り値
  • に影響を及ぼします.
    		class A{
         
                [Symbol.toStringTag] = 'hello'
            }
            const a = new A();
            console.log(a);		//A {Symbol(Symbol.toStringTag): "hello"}
            console.log(Object.prototype.toString.call(a));	//[object hello]