乐趣区

关于ecmascript:Symbol

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); //symbol
console.log(Symbol() === Symbol(),Symbol("aa") === Symbol("aa")); //false false
console.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()]
退出移动版