ES6 Symbol(符号描述)
Symbol是什么
ES6引入了一种新的原始数据类型Symbol,表示独一无二的值。最大的用法是用来定义对象的唯一属性名。
Symbol 函数栈不能用 new 命令,因为 Symbol 是原始数据类型,不是对象
可以接受一个字符串作为参数,为新创建的 Symbol 提供描述,用来显示在控制台或者作为字符串的时候使用,便于区分。
Symbol的特点
- 没有字面量的写法
- 新的数据类型,typeof返回的是symbol
- 每次去调用Symbol函数得到的符号永远不会相等,不管符号描述是否相同
- 符号可以作为对象的属性名使用,这种属性名叫符号属性(Symbol 作为对象属性名时不能用.运算符,要用方括号)
- 符号属性不能被枚举
可以通过 Object.getOwnPropertySymbols() 和 Reflect.ownKeys() 读取到一个对象的 Symbol 属性
Symbol的基本用法
const syb1 = Symbol(); //创建了一个符号
const syb2 = Symbol("asdfsdf");
const syb3 = Symbol("asdfsdf");
//是独一无二的
console.log(syb2 === syb3);//false
console.log(typeof syb1);//symbol
Symbol.for()
会在全局搜索被登记的 Symbol 中是否有该字符串参数作为名称的 Symbol 值,如果有即返回该 Symbol 值,若没有则新建并返回一个以该字符串参数为名称的 Symbol 值,并登记在全局环境中供搜索。
const a =Symbol('a');
const a1 =Symbol.for('a'); // 返回由给定的 key 找到的 symbol,否则就是返回新创建的 symbol
console.log(a === a1); // false
const a2 =Symbol.for('a');
console.log(a1 === a2); // true
Symbol.keyFor()
Symbol.keyFor() 返回一个已登记的 Symbol 类型值的 key ,用来检测该字符串参数作为名称的 Symbol 值是否已被登记。
const a =Symbol('a');
Symbol.keyFor(a); // undefined
const a1 =Symbol.for('a');
Symbol.keyFor(a1); // "a"
Symbol的应用场景
-
对象属性名(key)
let s_name= Symbol("name"); let obj= { [s_name]: "lilei", age: 18, sex:'男' }; //查询不到 console.log(Object.keys(obj))// ['age','sex'] for(let key in obj){ console.log(key) // age sex } Object.getOwnPropertyNames(obj) // ['age','sex'] JSON.stringify(obj) // {"age":18,"sex":"男"} //可以查询到 obj[s_name];//lilei //使用Object的api Object.getOwnPropertySymbols(obj) // [Symbol(name)] //使用新增的反射API Reflect.ownKeys(obj) // ["age", "sex", Symbol(name)]
-
定义常量
const Name = Symbol(); const Age = Symbol();
-
使用Symbol定义类的私有属性/方法
const speak = Symbol(); const name= Symbol(); class Person { constructor(name,type) { this.type = type this[name] = name } [speak]() { return `${this[name]}喜欢 ${this.type}` } }
Symbol在JS中还有很多应用,可以与很多东西结合使用,比如 迭代器 Iterator