Symbol 和 Symbol属性Symbol: 符号ESMAScript6:原始数据类型:字符串、数字型、布尔型、null、undefined 以及 Symbol创建 Symbol:所有原始值除了Symbol都有各自的字面量形式,例如 布尔类型的 truelet firstName = Symbol();let person = {};person[firstName] = "song"console.log(person[firstName]);// 创建时添加一个描述信息,描述文字不可以访问let name = Symbol("desc info");console.log("desc info" in person); // false// Symbol的辨识方法console.log(typeof firstName); // symbol// Symbol的使用方法// 使用一个可计算对象字面量属性person = {[firstName] : "Apple"};// 将属性设置为可读Object.defineProperty(person, firstName, {writable: false});let lastName = Symbol("egg");Object.defineProperties(person, {[lastName] : {value : 'age',writable: false}});console.log(person[firstName]); // Appleconsole.log(person[lastName]); // egg// Symbol共享体系 有时候希望在不同的代码中共享同一个Symbol// 创建可共享的Symbollet uid = Symbol.for("uid");let obj = {};obj[uid] = "12345";console.log(obj[uid]); // 12345console.log(uid); // Symbol(uid)/** Symbol.for("uid") 首先会在Symbol注册表中搜索键为 uid的Symbol是否存在* 如果存在:* 直接返回已有的Symbol* 如果不存在:* 创建一个新的Symbol并使用这个键在Symbol全局注册表中注册, 随机返回创建的Symbol* */let uid2 = Symbol.for("uid");console.log(uid == uid2); // trueconsole.log(obj[uid2]); // 1234console.log(uid2); // Symbol(uid)// 可以使用 Symbol.keyFor() 方法在全局注册表中检索与Symbol有关的键console.log(Symbol.keyFor(uid)); // 返回 uid 的键console.log(Symbol.keyFor(uid2)); // 返回 uid 的键// console.log(Symbol.keyFor(uid3)); undefined// Symbol与类型强制转换, 不能将Symbol强制转换成字符串和数字类型let str = Symbol();// console.log(str + ""); Cannot convert a Symbol value to a stringconsole.log(typeof Symbol.for("uid")); // symbol// Symbol属性检索/*检索对象的所有属性名Object.keys()Object.getOwnPropertyNames()Object.getOwnPropertySymbols()*/let lab_id = Symbol();let json = {[lab_id] : 123};let keys = Object.getOwnPropertySymbols(json);console.log(keys.length);console.log(keys[0]); // Symbolconsole.log(json[keys[0]]); // 123