Symbol 和 Symbol属性
Symbol: 符号
ESMAScript6:
原始数据类型:字符串、数字型、布尔型、null、undefined 以及 Symbol
创建 Symbol:
所有原始值除了Symbol都有各自的字面量形式,例如 布尔类型的 true
let 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]); // Apple
console.log(person[lastName]); // egg
// Symbol共享体系 有时候希望在不同的代码中共享同一个Symbol
// 创建可共享的Symbol
let uid = Symbol.for("uid");
let obj = {};
obj[uid] = "12345";
console.log(obj[uid]); // 12345
console.log(uid); // Symbol(uid)
/*
* Symbol.for("uid") 首先会在Symbol注册表中搜索键为 uid的Symbol是否存在
* 如果存在:
* 直接返回已有的Symbol
* 如果不存在:
* 创建一个新的Symbol并使用这个键在Symbol全局注册表中注册, 随机返回创建的Symbol
* */
let uid2 = Symbol.for("uid");
console.log(uid == uid2); // true
console.log(obj[uid2]); // 1234
console.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 string
console.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]); // Symbol
console.log(json[keys[0]]); // 123 Symbol 和 Symbol属性
Symbol: 符号
ES