在 ES5 中 对象属性名都是字符串, 这容易造成属性名的冲突, 比如, 你使用了一个他人提供的对象, 但又想为这个对象添加新的方法 (mixin 模式), 新方法的名字就有可能与现有方法产生冲突, 于是 ES6 引入了 Symbol.Symbol 是一种新的原始数据类型, 表示独一无二的值. 它是继 undefined,null, 布尔值(Boolean), 字符串(String), 数值(Number), 对象(Object) 六种数据类型之后的第七种数据类型. 凡是属性名属于 Symbol 类型, 就都是独一无二的, 可以保证不会与其他属性名产生冲突.
1. 声明 Symbol
Symbol 函数可以接受一个字符串作为参数, 表示对 Symbol 实例的描述, 主要是为了在控制台显示, 或者转为字符串时, 比较容易区分.
- var f= Symbol();//Symbol()
- var f= Symbol('foo');//Symbol(foo)
- // 没有参数的情况
- let s1 = Symbol();
- let s2 = Symbol();
- s1 === s2 // false
- // 有参数的情况
- let s1 = Symbol('foo');
- let s2 = Symbol('foo');
- s1 === s2 // false
注意, Symbol 函数的参数只是表示对当前 Symbol 值的描述, 因此相同参数的 Symbol 函数的返回值是不相等的.
s1 和 s2 都是 Symbol 函数的返回值, 而且参数相同, 但是它们是不相等的.
2.Symbol 在对象中的应用
Symbol 作为属性名:
- let mySymbol = Symbol();
- // 第一种写法
- let a = {};
- a[mySymbol] = 'Hello!';
- // 第二种写法
- let a = {
- [mySymbol]: 'Hello!'
- };
- // 第三种写法
- let a = {};
- Object.defineProperty(a, mySymbol, { value: 'Hello!' });
- // 以上写法都得到同样结果
- a[mySymbol] // "Hello!"
赋值 - 括号形式:
a[mySymbol]='web';
3.Symbol 对象元素的保护作用
在对象中有很多值, 但是循环输出时, 并不希望全部输出, 那我们就可以使用 Symbol 进行保护.
没有进行保护的写法:
- var obj={name:'小明',skill:'web',age:18};
- for (let item in obj){
- console.log(obj[item]);
- }
现在我不想别人知道我的年龄, 这时候我就可以使用 Symbol 来进行循环保护.
- let obj={name:'小明',skill:'web'};
- let age=Symbol();
- obj[age]=18;
- for (let item in obj){
- console.log(obj[item]);// 小明, Web
- }
- console.log(obj[age]);
待续.....
来源: https://www.cnblogs.com/bfwbfw/p/10068369.html