一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第16天,点击查看活动详情。
做为Es6中新加的一个基本数据类型大家项目中都用了吗?
最近项目开发中出现了一个bug,具体是这样的,功能是一个表格组件显示序号的问题,可以设置该组件是否显示序号,如果为ttue,组件自动给table添加一个序号列,当时给该列起了一个serial名称,结果项目使用该组件时传递的表格列集合columns中也有一个serial名称的编号列,导致表格渲染时出现错误,在修改的时候开始像重新起一个名字特殊一点,又感觉也不好,这是想到了es6新增的symbol类型,表示独一无二的值,之前一直没有用过它,后来研究了一下。
定义
Symbol 表示独一无二的值,最大的用法是用来定义对象的唯一属性名。
优缺点:
1.可以用来解决命名冲突的问题,保证常量的值是唯一性 保证常量与变量不相等。
2.不能与其它数据进行运算。
3.目前只能在前端使用,不能持久化。
4.兼容性差,只支持es5以上版本。
用法
用法和调用函数一样,括号内参数仅用来描述此变量,两个相同的描述定义的symbol不相等,
let serial = Symbol("序号");
console.log(serial); // Symbol(序号)
let serial1 = Symbol("序号");
serial === serial1; // false
symbol值能作为对象的属性名, 但是symbol定义的属性是不可枚举的,不能通过for..in或者Object.keys等获取到属性名, 我们可以通过Object.getOwnPropertySymbols()单独获取symbols定义的属性
let serial = Symbol("序号");
const obj= {
[serial]: 1,
name: '小明',
age: 12
}
Object.keys(obj); // ['name', 'age']
Object.getOwnPropertySymbols(obj); // ['Symbol(序号)']
我们也可以定义全局的symbol,通过Symbol.for([key])方法定义的symbol变量会放入全局中,在定义一个和其key一样的symbol会先从全局中查找有的化就不会之间使用不用重新生成。因此两个通过for函数定义的相同key的symbol变量相等。
const id = Symbol.for('id');
const id1 = Symbol.for('id');
id === id1; // true
总结
Symbol在业务开发时应用场景其实很少,但是在底层组件开发过程中其实作用还是很明显的。