ES 6データタイプSymbol(一意)


データの種類
目次
  • データタイプ
  • データ分類
  • Symbolデータタイプ
  • 概要
  • 属性名
  • 属性名のエルゴード
  • は、プライベート属性
  • を定義する.
  • は、プライベート方法を定義する
  • .
  • Symbol.for()、Symbol.keyFor()
  • その他の方法
  • BigIntデータタイプ
  • はなぜ導入されたのですか?
  • BigIntオブジェクト
  • データ分類
  • 基本タイプ:直接アクセス基本タイプ
  • null
  • undefined
  • Symbol(ES 6)
  • BigInt(ES 2020)
  • 複雑なタイプ:引用による複雑なタイプへのアクセス
  • は、上部ディレクトリ
  • に戻る.
    Symbolデータタイプ
    概要
    なぜこのタイプを導入しますか?
    ES 5のオブジェクト属性名はすべて文字列で、属性名の衝突を引き起こしやすいです.
    Symbol:唯一無二の値を表し、最大の使い方はオブジェクトの固有属性名を定義するためのもので、しかも値の種類です.
    let sym1 = Symbol();
    let sym2 = Symbol();
    
    console.log(sym1)  // Symbol()
    console.log(typeof sym1)  // 'symbol'
    console.log(sym1 == sym2) // false
    console.log(sym1 === sym2) // false
    
    Symbol関数は、パラメータとして文字列を受け入れ、Symbolの例についての説明を表します.
    主にコンソールで表示するか、文字列に変換する場合に区別しやすいためです.
    let s1 = Symbol('foo');
    let s2 = Symbol('bar');
    
    console.log(s1) // Symbol(foo)
    console.log(s2) // Symbol(bar)
    console.log(s1.toString()) // "Symbol(foo)"
    console.log(s2.toString() )// "Symbol(bar)"
    
  • Symbol値は他のタイプの値とは演算できません.
  • エラーが発生します.
  • Symbol値は、明示的に文字列に変換しても良いし、ブール値に変換しても良いが、数値
  • には変換できない.
  • は、ES 2019にSymbolの記述.description
  • を読み取るためのdescriptionを追加した.
    属性名として
    Symbolは一意性を持っており、対象の属性名に使用すると、同名の属性が現れないことが保証されます.
    const my = Symbol();
    const s = Symbol();
    
    // 1
    const a = {};
    a[my] = 'hello';
    
    // 2
    const b = {
        [my]: 'hello',
        [s](arg) { ... }
    };
    
    // 3
    const c = {};
    Object.defineProperty(a, my, {value: 'hello'});
    
  • Symbol値を対象属性名とした場合、ポイント演算子
  • は使えません.
  • Symbol値が属性名である場合、この属性は公開属性であり、プライベート属性
  • ではない.
    属性名の巡回
    Symbolは属性名としてクエリされないいくつかの方法です.
  • for…in、for…ofサイクル中
  • Object.keys()
  • Object.getOwn PropertyNames()
  • JSON.strigify()
  • Symbolを属性名として取得できる方法:
  • Object.getOwn PropertySymbors()方法
    この方法は、現在のオブジェクトのすべてが属性名として使用されているSymbol値である行列を返します.
  • Reflect.ownKeys()メソッドは、通常のキー名とSymbolキー名
  • を含むすべてのタイプのキーを返すことができます.
    トップディレクトリに戻る
    プライベート属性を定義
    let size = Symbol('size');
    
    class Count{
        constructor(){
            this[size] = 0;
        }
        add(item){
            this[this[size]] = item;
            this[size] ++;
        }
        static sizeOf(instance){
            return instance[size];
        }
    }
    
    let x = new Count();
    console.log(Count.sizeOf(x));// 0
    
    x.add('foo');
    console.log(Count.sizeOf(x));// 1
    
    console.log(Object.keys(x)); // ["0"]
    console.log(Object.getOwnPropertyNames(x));// ["0"]
    console.log(Object.getOwnPropertySymbols(x));// [Symbol(size)]
    
    //   x size      Symbol  ,  Object.keys(x)、Object.getOwnPropertyNames(x)      。                  
    
    プライベートメソッドを定義
    const Hero = (() =>{
        const getRandom = Symbol()   //     
        return class{
        
            constructor(attack,hp,defence){
                this.attack = attack;
                this.hp = hp;
                this.defence;
            }
            gongji(){
                const dmg = this.attack * this[getRandom](0.7,1.2);
                console.log(dmg)
            }
            [getRandom](min,max){
                return Math.random() * (max - min) + min;
            }
        }
    })();
    const h = new Hero(3,100,3);
    console.log(h)
    
    Symbol.for()、Symbol.keyFor()
  • Symbol.for():同じSymbol値を再使用します.
    文字列をパラメータとして受け入れて、そのパラメータを名前とするSymbol値があるかどうかを検索します.ある場合は、このSymbol値を返します.そうでない場合は、この文字列を名称とするSymbol値を新たに作成し、グローバルに登録します.
  • let s1 = Symbol.for('foo');
    let s2 = Symbol.for('foo');
    
    s1 === s2 // true
    
  • Symbol.keyFor()方法は、登録されたSymbolタイプ値のkey
  • を返す.
    let s1 = Symbol.for("foo");
    Symbol.keyFor(s1) // "foo"
    
    let s2 = Symbol("foo");
    Symbol.keyFor(s2) // undefined
    
    Symbol.for()はSymbol値として登録された名前で、グローバル環境の場合、グローバル環境で実行されているかどうかにかかわらず
    その他の方法の詳細
    追加演算子:**(指数演算子)
    トップディレクトリに戻る
    BigIntデータタイプ
    なぜ導入しますか?
  • JavaScriptのすべての数字は64ビットの浮動小数点数として保存されています.これは数値の表現に2つの制約を与えました.(数値が小さいと精度が失われます.)
  • が2以上の1024乗の数値です.JavaScriptは表現できません.Infinity(無限大)
  • に戻ります.
  • 科学と金融の正確な計算に適合するために
    //    53         ,      
    Math.pow(2, 53) === Math.pow(2, 53) + 1 // true
    
    //    2   1024      ,    
    Math.pow(2, 1024) // Infinity
    
  • BigInt:タイプのデータは、拡張子n
  • を追加しなければならない.
  • BigInt:通常の整数とは2つの値であり、それらの間は
  • とは等しくない.
  • typeof BigInt == bigint
  • BigInt:基本的にNumberは同じです.アップグレード版
  • です.
    Big IntオブジェクトBigInt(123) //==> 123n
  • BigInt()構造関数にはパラメータが必要であり、パラメータは正常に数値
  • に変換できる必要がある.
  • パラメータが小数であれば、
  • をエラーします.
  • 用newキーワードでもエラーが発生します.
    計算:
  • BigIntタイプの除算は、小数
  • を省略します.
  • BigIntは、通常の数値との混合演算ができない
  • .
  • BigInt他はnumberと同じ
  • です.
    トップディレクトリに戻る