シンボル 一意性を表す新しいプリミティブ データ型。これは、JavaScript の 7 番目のデータ型です。他の 6 つは、未定義、null、String、Number、および Object
。シンボル値は Symbol 関数を通じて生成されます。オブジェクトの属性名には 2 つのタイプがあり、1 つは元の文字列で、もう 1 つは新しいシンボル タイプです。属性名はシンボル タイプであり、一意であるため、他の属性名と競合しません。
s1=シンボル()とします s2=シンボル()とします コンソール.ログ(s1) //シンボル() コンソール.ログ(s2) //シンボル() console.log(s1===s2) //間違い //Symbol 関数は、Symbol インスタンスの説明を示す文字列をパラメータとして受け入れることができます let s1=Symbol('xxx') s2=シンボル('hh')とします コンソール.ログ(s1) //記号(xxx) コンソール.ログ(s2) //記号(ああ) console.log(s1===s2) //false コード
Symbol 関数をコピーする前に新しいコマンドを使用することはできず、エラーが報告されます。これは、生成されたシンボルがオブジェクトではなくプリミティブ型の値であるためです。つまり、Symbol値はオブジェクトではないため、プロパティを追加することはできません。特殊な文字列と同等です。
Symbol.for() はパラメータとして文字列を受け入れ、パラメータを名前として持つ Symbol 値を検索します。存在する場合は、Symbol 値を返します。存在しない場合は、文字列を名前として使用して新しい Symbol 値を作成し、グローバルに登録します。
s1 = Symbol.for('xxx') とします。 s2 = Symbol.for('xxx') とします。 console.log(s1 === s2) // true 関数 foo(){ return Symbol.for('hello') } const x=foo() const y=Symbol.for('hello') console.log(x === y)//true
Symbol.for() と Symbol() は新しいシンボルを生成します。違いは、前者は検索用にグローバル環境に登録されるのに対し、後者は登録されないことです。 Symbol.for() は呼び出されるたびに新しい Symbol 型の値を返すのではなく、指定されたキーが既に存在するかどうかを最初に確認し、存在しない場合は新しい値を作成します。
Symbol.keyFor() メソッドは、登録されたシンボル タイプ値のキーを返します。
const s1 = シンボル('foo') console.log(Symbol.keyFor(s1)) // 未定義 const s2 = Symbol.for('foo') console.log(Symbol.keyFor(s2)) //foo
。シンボル値が等しくないため、これはシンボル値を識別子として使用し、属性名に使用できることを意味します。同じ名前の属性が表示されないことを確認します。これは、オブジェクトが複数のモジュールで構成されている場合に、キーが誤って上書きされたり上書きされたりするのを防ぐのに役立ちます。
定数グレード={ 張三:{住所:'qqq',電話:'111'}, 李思:{住所:'aaa',電話:'222'}, 李思:{住所:'sss',電話:'333'}, } console.log(グレード) //張三: {アドレス: "qqq"、電話: "111"} 李思: {アドレス: "sss"、電話: "333"} //オブジェクトのキー値を繰り返すことはできません。繰り返しがある場合、後続の値が前の値を上書きします。 //シンボルを使用して解決します。これは一意の文字列 const stu1=Symbol('李思') に相当します。 const stu2=Symbol('李思') console.log(stu1===stu2) //間違い 定数グレード={ [stu1]:{アドレス:'aaa',電話:'222'}, [stu2]:{アドレス:'sss',電話:'333'}, } console.log(グレード) //ジョン・ドゥ: {アドレス:'sss',電話:'222'} ジョン・ドゥ: {アドレス:'sss',電話:'333'} console.log(グレード[stu1]) //リー・シー: {アドレス:'sss',電話:'222'} console.log(グレード[stu2]) //Li Si: {address:'sss',tel:'333'}
const sym=Symbol('imooc') クラス ユーザー{ コンストラクター(名前){ this.name=名前 this[sym]='imooc.com' } getName(){ this.name+this[sym] を返します } } const user=新しいユーザー('www') //for(let key in user){ が隠されているため、for in メソッドは Symbol 属性にアクセスできません。 console.log(key)//名前 } //Object.keys(obj) メソッドは Symbol プロパティにアクセスできません for(let key of Object.keys(user)){ console.log(key)//名前 } //Object.getOwnPropertySymbols(obj) は Symbol プロパティのみを取得できます for(let key of Object.getOwnPropertySymbols(user)){ console.log(key)//Symbol(imooc) } //Reflect.ownKeys(obj) オブジェクトのプロパティを取得できます for(let key of Reflect.ownKeys(user)){ コンソール.ログ(キー) //名前 //シンボル(imooc)
、
コード内に複数回出現し、コードと強い結合を形成する特定の文字列または値を指します。適切なスタイルのコードでは、マジック文字列を削除し、明確な意味を持つ変数に置き換えるように努める必要があります。
関数 getArea(形状) { 面積 = 0 とします スイッチ (形状) { ケース「三角形」: 面積=1 壊す ケース「円」: 面積=2 壊す } 返却エリア } console.log(getArea('Triangle')) //Triangle と Circle はマジック文字列です。これは何度も出現し、コードとの「強い結合」を形成し、その後の変更やメンテナンスには役立ちません。 const 形状タイプ = { 三角形: シンボル()、 丸:記号() } 関数 getArea(形状) { 面積 = 0 とします スイッチ (形状) { ケースの形状タイプ.triangle: 面積=1 壊す ケースの形状タイプ.circle: 面積=2 壊す } 返却エリア } console.log(getArea(shapeType.triangle))
私はフロントエンドの初心者です。記事に間違いがある場合は、アドバイスやディスカッションをお願いします。
[関連ビデオチュートリアルの推奨: Web フロントエンド]
上記は、JavaScript データ型の学習とシンボル型の簡単な分析の詳細な内容です。詳細については、PHP 中国語 Web サイトの他の関連記事に注目してください。