ES6第七种数据类型-----Symbol
一:创建的是唯一的值
// 没有参数的情况
var s1 = Symbol();
var s2 = Symbol();
s1 === s2 // false
// 有参数的情况
var s1 = Symbol("foo");
var s2 = Symbol("foo");
s1 === s2 // false
应用1
// 作为属性名的使用
var mySymbol = Symbol();
// 第一种写法
var a = {};
a[mySymbol] = 'Hello!';
// 第二种写法
var a = { [mySymbol]: 'Hello!'};
// 第三种写法
var a = {};
Object.defineProperty(a, mySymbol, { value: 'Hello!' });
// 以上写法都得到同样结果
a[mySymbol] // "Hello!"
应用2
// 只需定义一个唯一不同值,但不需追究名称时
// (1)没事用Symbol
var shapeType = { triangle: 'Triangle'};
function getArea(shape, options) {
var area = 0;
switch (shape) {
case shapeType.triangle:
area = .5 * options.width * options.height;
break;
}
return area;
}
getArea(shapeType.triangle, { width: 100, height: 100 });
//(2)用Symbol
var shapeType = { triangle: Symbol()};
function getArea(shape, options) {
var area = 0;
switch (shape) {
case shapeType.triangle:
area = .5 * options.width * options.height;
break;
}
return area;
}
getArea(shapeType.triangle, { width: 100, height: 100 });
二:Object.getOwnPropertySymbols
// 获取指定对象的所有 Symbol 属性名
var obj = {};
var key = Symbol('description');
obj[key] = 'data';
var symbols = Object.getOwnPropertySymbols(obj);
console.log(symbols[0].toString());
// Reflect.ownKeys(obj)//获取所有的属性名
Reflect.ownKeys(obj)
三:Symbol.for和Symbol.keyFor
// Symbol.for搜索有没有以该参数作为名称的Symbol值。
// 如果有,就返回这个Symbol值,否则就新建并返回一个以该字符串为名称的Symbol值。
// Symbol.keyFor
let s = Symbol.for("这个Symbol.keyFor");
console.log(Symbol.keyFor(s));