Symbol

101 阅读1分钟

base use

const s1 = Symbol('Susu');
const s2 = Symbol('SharkDog');

const obj = {
    // 这样写就不能单纯的通过key取到了(因为key是唯一的且你并不知道这个key)
    [Symbol('name')]: 'susu',
    age: 18,
    [Symbol('name')]: 'SharkDog',
    [s1]: '这样才能获取到',
    [s2]: '这样才能获取到'
};
console.log(obj);

// 每一个Symbole生成的key都不会重复
console.log(s1 === s2);
// 获取Symbol中的描述(使用Symbol时括号内传入的内容)
console.log(s1.description, s2.description);
// 对象中的Symbol值要这样获取(值会相等但是Symbol生成的key永远不会相等)
console.log(obj[s1], obj[s2], obj[s1] === obj[s2]);

Get Symbol Key Value

// 这样是可以的
console.log(obj[s1]);
// 获取全部Symbol值(这样能全部取到包括内部定义的)
console.log(Object.getOwnPropertySymbols(obj));
// 遍历
for (const sKey of Object.getOwnPropertySymbols(obj)) {
    // 内部定义的值就被输出了
    console.log(obj[sKey]);
}
// 但以上都获取不到直接在obj中声明的Symbol值了

not often use

// 通过for创建相同符号(拿描述符当key)
const s3 = Symbol.for('test');
const s4 = Symbol.for('test');
console.log(s3 === s4);

// 获取一个Symbol key当key
const s3key = Symbol.keyFor(s3);
const s4key = Symbol.keyFor(s4);

console.log(s3key === s4key);