你一定很好奇 Symbol
这货是啥,解决啥问题得,我也很好奇啊,于是在仔(hu)细(lun)浏(tun)览(zao)了参考链接里两篇很好得文章之后,一言以概之就是给一个对象创建一个绝对绝对不会重复得属性用的(如有错误请不吝赐教,拜谢)。下面这篇文章只是Symbol的一个小小的使用方向,先别急着换台,即使这个小小的方向,使用好了也妙处无穷。
定义
Symbol
是es6新增的一种数据类型(其他得是number、boolean、string、object、null、undefined),(其中阮大神说的是这6种,而MDN上得专业术语‘基本类型’有出入,应该是名词不一样,一个是数据类型,另一个是基本类型,我就不较真了,咱们已常用的为主)。- 最大特点是:每个从Symbol()返回的symbol值都是 唯一 的。
- 存在的目的或者说意义:作为对象属性的标识符,(就是给一个对象上再挂一个属性,你怕重复造成覆盖或者冲突,所以使用 Symbol())
- 声明方式,不能使用
new Symbol(),这是错误的,应该使用let test = Symbol([description]);
(可以把它类比为一种特殊的唯一的string类型,如果实在不好记忆的话)。 - description 是可选的,字符串类型。对symbol的描述,可用于调试(console.log)但不是访问symbol本身。
let test1 = Symbol('test'); let test2 = Symbol('test'); console.log(test1 === test2); // false // Symbol在设置为对象属性名的时候不能用 · 运算符,不然会被当做字符串来理解了 let test3 = Symbol(); let obj = {}; obj.test3 = 't'; // 检验一下 · 运算符是否起作用 obj[test3]; obj['test3'];
使用
赋值定义
比如,我们有这么一个需求,一个公共页面可能供好几个活动使用,有可能是‘普通活动(normal
)’、‘免支付活动(nonpayment
)’、‘话费活动(phone
)’。根据不同的入参类型决定页面展示不同的按钮文案,为了避免后来再出现一个活动与之前的活动重复,现在就是使用 Symbol
的最好时机。
使用前:
function getButtonContent(type) {
let content = '';
switch(type) {
case 'normal':
content = '普通活动';
break;
case 'nonpayment':
content = '免支付活动';
break;
case 'phone':
content = '话费活动';
break;
default:
content = '活动异常';
break;
}
return content;
}
getButtonContent('normal');
使用后:
let activeType = {
normal: Symbol(),
nonpayment: Symbol(),
phone: Symbol()
} // 这样就不会和其他属性的值冲突了,后期再来个活动 免支付充话费,可以添加 nonpayPhone: Symbol(),属性值不同
function getButtonContent(type) {
let content = '';
switch(type) {
case activeType.normal:
content = '普通活动';
break;
case activeType.nonpayment:
content = '免支付活动';
break;
case activeType.phone:
content = '话费活动';
break;
default:
content = '活动异常';
break;
}
return content;
}
查找Symbol
let test = {};
a = Symbol('a');
b = Symbol.for('b'); // 检索是否有 b 描述的 Symbol,有则重新使用,没有就创建
test[a] = 'aaa';
test[b] = 'bbb';
let testSymbols = Object.getOwnPropertySymbols(test);
// (2) [Symbol(a), Symbol(b)]
参考链接
感谢,我们之所以看的更远,是因为站在了巨人肩膀上。