Symbol类型

Symbol新的原始数据类型 (符号)示意举世无双的值

对象的key能够应用Symbol

具备动态属性和静态方法 不反对 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); //symbolconsole.log(Symbol() === Symbol(),Symbol("aa") === Symbol("aa")); //false falseconsole.log(Symbol("aa"),Symbol("bb")) //形容文本 Symbol(aa) Symbol(bb)

能够增加为属性名

const obj1 = {  [Symbol()]:123}console.log(obj1);

案例

//创立公有变量const name = Symbol()const person = {  [name]:"zxa",  say(){    console.log(this[name]);  }}//b.js// person[Symbol()] //无奈创立完全相同的Symbol,取不到成员person.say() //能够拿到一般成员

静态方法

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() ]