// 对象的属性键只能是string类型和symbol类型
// “Symbol”值代表用给定名称作为唯一标识
// 存在系统级symbol
// 用于区别对待对内操作和对外选择性输出
// let id = Symbol('id')
// let ids = Symbol('id')
// console.log(id)
// console.log(ids)
// console.log(id == ids)
let testObj = {
name: 'test'
}
//
let testId = Symbol('id')
testObj[testId] = 'test_id'
console.log(testObj[testId])
let user = { name: "John" };
let id = Symbol("id");
user[id] = "ID Value";
console.log(user[id]);
let age = Symbol('age')
let symbolObj = {
gender: 'girl',
[age]: 12, // 这是symbol对象键
years: 14 // 这是普通的字符串键
}
let allKeys = Reflect.ownKeys(symbolObj) // 返回对象的全部键(包括字符串键名和symbol键名),以数组形式返回
console.log('全部键')
console.log(allKeys)
console.log(symbolObj)
let allSymbols = Object.getOwnPropertySymbols(symbolObj) // 返回对象中所有symbol键名,以数组形式
console.log('全部symbol键')
console.log(allSymbols)
// 用for in遍历不到symbol键
// JSON.stringify()时候也将symbol排除在外
for (let i in symbolObj) {
console.log(i)
}
// 通过全局Symbol注册能实现两个名字相同的symbol是同样的 Symbol.for(name)
let name1 = Symbol.for('name') // name1是全局symbol
let name2 = Symbol.for('name')
console.log(name1 == name2) // true
let keyName = Symbol.keyFor(name2)
console.log(keyName) // 通过symbol对象名字找symbol键名,找不到返回undefined,只对全局symbol好使