新しいデータ型のシンボル
1.概要
オブジェクトのプロパティのES5名が競合属性名を引き起こす可能性がある文字列です。たとえば、あなたが他の人によって提供されるオブジェクトを使用しますが、新しいアプローチのこのオブジェクト名は、既存の方法と競合する可能性があるため、新たな方法(ミックスインモード)を追加します。したがって基本的な属性名から競合を防ぐ、各プロパティの名前が十分に一意であることを保証するメカニズムが存在する場合。ES6のシンボルが導入された理由です。
ES6は、新しいプリミティブデータ型の記号を紹介するユニークな値を表します。これは、JavaScriptの言語第7のデータタイプです。
2.シンプルな使い方
- 最も簡単な声明
let a=Symbol();
console.log(a);//Symbol()
- それぞれがユニークです
let a=Symbol()
let b=Symbol()
console.log(a===b)//false
3.Symbol.for()、Symbol.keyFor()
時々、私たちは同じシンボル値を再利用したい、Symbol.forの方法はこれを行うには。これは、文字列引数を受け入れ、その後、シンボルとして名前の値への検索パラメータはありません。もしそうなら、それは、シンボルの値を返します。そうでない場合は、新しいシンボル値の名前で文字列を返します。
let a=Symbol.for('fw')
let b=Symbol.for('fw')
console.log(a===b);//true
Symbol("bar") === Symbol("bar")//false
記号()ので、登録メカニズムを書き込まれていないので、各コールは、異なる値を返します。
この方法は、登録されたキーのシンボル型の値を返します。
Symbol.keyFor
let s1 = Symbol.for("foo");
Symbol.keyFor(s1) // "foo"
let s2 = Symbol("foo");
Symbol.keyFor(s2) // undefined
属性名としてのシンボル4
各シンボル値は、シンボル値は、オブジェクトの属性名の識別子として使用できることを意味する、等しくないので、あなたは表示されません同じ名前のプロパティを保証することができます。これは、複数のモジュールによって目的のために有用であり、一つのキーが不用意に書き換えや上書きを防止することができます。
let testKey=Symbol();
// 第一种写法
let a={};
a[testKey]='hello world';
// 第二种
let a={
[testKey]:'hello world'
}
// 第三种
let a={};
Object.defineProperty(a,testKey,{value:'hello world'})
// 以上写法得到同样的结果
console.log(a[testKey]);//hello world
オブジェクトのname属性としてではなく、ドット演算子によるもの、シンボル値に注意してください。
- DEMO1
const mySymbol = Symbol();
const a = {};
a.mySymbol = 'Hello!';
a[mySymbol] // undefined
a['mySymbol'] // "Hello!"
- DEMO2
let a=Symbol('symbolA');
let obj={
[a]:1,
a:2
}
// 各种写法的结果
obj.a //2
obj['a']//2
obj[a] //1
シーン5(実施例)
- 古い言い回し
function getArea(shape, options) {
let area = 0;
switch (shape) {
case 'Triangele':
area = options.w * options.h / 2;
break;
case 'Squire':
area = options.w * options.h;
break;
/**more code */
}
return area;
}
getArea('Squire',{w:10,h:2});//20
- 新しい文言
const shapeType = {
Triangle: Symbol(),
Squire: Symbol()
}
function getArea(shape, options) {
let area = 0;
switch (shape) {
case shapeType.Triangle:
area = options.w * options.h / 2;
break;
case shapeType.Squire:
area = options.w * options.h;
break;
/**more code */
}
return area;
}
getArea(shapeType.Squire, { w: 10, h: 2 });