JavaScriptデータ型(二)


Objectタイプ
ECMAScriptのオブジェクトは、データと機能のセットです.
オブジェクトの作成
const o = new Object();
const o = new Object; //   ,         
const o = {};

インスタンスのプロパティとメソッド:
  • constructor:コンストラクション関数.
  • hasOwnProperty(propertyName):チェックpropertyName(入力された属性)現在のオブジェクトインスタンス(インスタンスプロトタイプではない)に存在するかどうかを確認します.
  • isPrototypeOf(object):入力されたオブジェクトが現在のオブジェクトのプロトタイプであるかどうかをチェックします.
  • propertyIsEnumerable(propertyName):チェックpropertyName(入力された属性)使用可能かfor-in文列挙.
  • toLocaleString():実行環境の地域に対応するオブジェクトを返す文字列表示.
  • toString():オブジェクトを返す文字列表示.
  • valueOf():オブジェクトの文字列、数値またはブール値を返します.通常はtoString()と同じ値を返します.
  • const o = new Object();
    console.log(o.toLocaleString()); // "[object Object]"
    console.log(o.toString()); // "[object Object]"
    console.log(o.valueOf()); // "{}"

    Symbolタイプ
    ユニークな値を表します.は、基本データ型です.各Symbol()から返されるsymbol値は一意です.1つのsymbol値はオブジェクト属性の識別子とすることができる.これは、このデータ型の唯一の目的です.文法はサポートされていません:new Symbol().元のデータ型を中心とした明示的なラッピングオブジェクトの作成は、ECMAScript 6からサポートされません.しかしながら、new Boolean、new String、およびnew Numberのような既存のオリジナルパッケージオブジェクトは、残存する理由により作成することができる.
    作成
    Symbol([description])
    description:オプションの文字列.Symbolの説明は、デバッグ(コンソール表示、文字列変換など)に使用できますが、symbol自体にアクセスできません.Symbolのパラメータがオブジェクトである場合、オブジェクトのtoStringメソッドが呼び出され、文字列に変換されてからSymbol値が生成されます.
    var sym1 = Symbol();
    var sym2 = Symbol('foo');
    var sym3 = Symbol('foo');
    
    typeof sym1 // "symbol"
    
    sym1 // Symbol()
    sym2 // Symbol('foo')
    sym3 // Symbol('foo')
    
    sym1.toString() // "Symbol()"
    sym2.toString() // "Symbol(foo)"
    sym3.toString() // "Symbol(foo)"
    
    sym2 === sym3 // false
    
    var sym = new Symbol(); // TypeError
    
    //     Symbol     
    var sym = Symbol("foo");
    typeof sym;     // "symbol"
    var symObj = Object(sym);
    typeof symObj;  // "object"
    
    //   
    `your symbol is ${sym}`
    // TypeError: can't convert symbol to string
    Boolean(sym) // true
    Number(sym) // TypeError

    Symbol.for([description])
    Symbol.for()とSymbol()の両方の書き方で、新しいSymbolが生成されます.これらの違いは、前者は検索のためにグローバル環境に登録され、後者は検索しません.Symbol.for()は、呼び出すたびに新しいSymbolタイプの値を返すのではなく、指定したkeyがすでに存在するかどうかを確認し、存在しない場合に新しい値を作成します.
    Symbol.for("bar") === Symbol.for("bar"); // true
    Symbol.for() === Symbol.for(); // true
    
    Symbol("bar") === Symbol("bar"); // false
    

    Symbol.prototype.description
    Symbolの説明を取得します.ES 2019は、インスタンス属性を提供する.
    
    const sym = Symbol('foo');
    
    sym.description // "foo"

    Symbol.keyFor()
    登録されたSymbolタイプ値のkeyを返します.
    
    Symbol.keyFor(); // TypeError
    
    const sym1 = Symbol('a');
    Symbol.keyFor(sym1); // undefined
    
    const sym2 = Symbol.for("b");
    Symbol.keyFor(sym2); // "b"
    

    Object.getOwnPropertySymbols()
    指定したオブジェクトのすべてのSymbol属性名を取得します.Symbolは属性名として機能するため、この属性はfor...infor...ofループには現れず、Object.keys()Object.getOwnPropertyNames()JSON.stringify()には戻されない.
    const obj = {};
    let a = Symbol('a');
    let b = Symbol('b');
    
    obj[a] = 'Hello';
    obj[b] = 'World';
    
    for (let i in obj) {
      console.log(i); //    
    }
    
    Object.getOwnPropertyNames(obj); // []
    
    Object.getOwnPropertySymbols(obj); // [Symbol(a), Symbol(b)]
    

    Reflect.ownKeys()
    通常のキー名とSymbolキー名を含むすべてのタイプのキー名を返します.
    const obj = {
      [Symbol('a')]: 1,
      name: 'Ashin',
      age: 3
    };
    
    Reflect.ownKeys(obj); // ["name", "age", Symbol(a)]
    

    内蔵Symbol値
    ...
    リファレンス
    『JavaScriptプレミアムプログラミング』(第3版)ECMAScript 6入門-チェン一峰