1. 特点:每个Symbol实例都是唯一的。因此,当你比较两个Symbol实例的时候,将总会返回false,产生唯一数据
let test = Symbol()
let test1 = Symbol()
console.log(test === test1) // false
let test = Symbol() // 初始化一个Symbol
console.log(typeof test) // symbol
2. 添加描述
let test = Symbol('好的')
let test1 = Symbol('美丽中国')
console.log(test.description) // 好的
console.log(test1.description) // 美丽中国
3. 另一种定义Symbol的方式 Symbol.for()
使用Symbol.for定义,区别是系统会在内存中进行记录(全局声明)相同的只会定义一次,如果下次再同样定义,会把之前定义过的直接拿过来,全局共享
Symbol.for() 仅接受单个字符串类型的参数
let a = Symbol.for('html')
console.log(a) // Symbol(html)
let b = Symbol.for('html')
console.log(a === b) // true
Symbol.for() 首先会全局搜索符号注册表,看看是否存在一个键值为‘html’ 的符号值,如果存在,则返回这个符号值,如果不存在,则创建一个符号值,并返回新的符号值。
如果一个Symbol反复被使用可以使用Symbol.for()进行定义
4. 使用Symbol.for 定义,用Symbol.keyFor() 获取描述
let a = Symbol.for('html')
console.log(Symbol.keyFor(a)) // html
let symbol = Symbol('uid')
console.log(Symbol.keyFor(symbol)) // undefined
使用Symbol创建的,Symbol.keyFor 搜不到
5. css解决字符串耦合问题
对象里面使用变量作为 key 和 value 要加 []
let user = 'lucy'
let name = 'lucy'
let obj = {
user: {
Math: 94,
Chinese: 88
},
name: {
Math: 99,
Chinese: 80
}
}
console.log(obj)
user、name 完全没有被解析成 lucy
正确做法加上[]
let user = 'lucy'
let name = 'lucy'
let obj = {
[user]: {
Math: 94,
Chinese: 88
},
[name]: {
Math: 99,
Chinese: 80
}
}
console.log(obj)
名字lucy渲染出来了,但是同名的key前面把后面的覆盖了,一个班级有重名的人很常见,不能够进行覆盖,这时候就可以利用Symbol了
let user = {
name: 'lucy',
type: Symbol()
}
let name = {
name: 'lucy',
type: Symbol()
}
let obj = {
[user.type]: {
Math: 94,
Chinese: 88
},
[name.type]: {
Math: 99,
Chinese: 80
}
}
console.log(obj)
console.log(obj[user.type])
console.log(obj[name.type])
主要思路:以 Symbol 作为key进行存储,永远不会重复,如果遇到想要唯一字段,避免同名覆盖,就是用Symbol
6. Symbol遍历
Reflect.ownKeys()
let symbol = Symbol()
let obj = {
name: 'zhou',
[symbol]: 23
}
for(const key of Reflect.ownKeys(obj)) {
console.log(key)
}
//name
// Symbol()
不能用普通的遍历 否则获取不到
Object.getOwnPropertySymbols() 只能遍历 Symbol