Symbol新的原始数据类型 (符号)表示独一无二的值this
对象的key能够使用Symbolcode
具备静态属性和静态方法 不支持 new Symbol()对象
解决不一样文件使用公共变量,互相影响,字符串
//shared.js ================================== const cache = {} //a.js ====================================== //cache['a_foo'] || cache['b_foo'] 之前的作法,约定好不一样文件下的key,可是本质上并无解决问题只是规避了问题 cache['foo'] = "VLAUE" //b.js ======================================== cache['foo'] = "VALUE1111"
const s = Symbol() console.log(s); //Symbol() console.log(typeof s); //symbol console.log(Symbol() === Symbol(),Symbol("aa") === Symbol("aa")); //false false console.log(Symbol("aa"),Symbol("bb")) //描述文本 Symbol(aa) Symbol(bb)
能够添加为属性名get
const obj1 = { [Symbol()]:123 } console.log(obj1);
案例string
//建立私有变量 const name = Symbol() const person = { [name]:"zxa", say(){ console.log(this[name]); } } //b.js // person[Symbol()] //没法建立彻底相同的Symbol,取不到成员 person.say() //能够拿到普通成员
静态方法console
const s1 = Symbol.for() //内部维护了一个全局的注册表,为添加的标识字符串和Symbol值提供一一对应,下次再搜所给定key反现有symbol会返回不会新建立 const s2 = Symbol.for() console.log(s1 === s2); //true 若是添加描述字符串,则添加的描述字符串必须一致才true console.log(Symbol.for(true) === Symbol.for("true")); //true 会转化成字符串
注意Symbol做为key取不到变量
console.log(cache); //{ foo: 'VALUE1111', [Symbol()]: 100, [Symbol()]: 200 } for (var key in cache){ console.log(key); //拿不到Symbol的key foo } console.log(Object.keys(cache)) // [ 'foo' ] console.log(JSON.stringify(cache)); // {"foo":"VALUE1111"} //单独取Symbol()的方法 console.log(Object.getOwnPropertySymbols(cache)); //[ Symbol(), Symbol() ]