Symbol的理解和使用
es6新增基本数据类型:
symbol
引用类型:
Set、Map
一、Symbol存在的意义:
解决对象属性名重复问题
二、Symbol介绍
1、唯一性
console.log(Symbol() == Symbol()) // false
2、参数传入字符串,做Symbol区分及标识
console.log(Symbol('a') == Symbol('b')) // false
3、与其他数据类型做转换
console.log(String(Symbol()),Boolean(Symbol())) // Symbol() true
4、Symbol 作为对象属性
//Symbol 作为对象属性的写法
let mySymbol = Symbol()
// 写法一
let obj = {}
obj[mySymbol] = "Hello"
//写法二
let obj2 = {
[mySymbol]:'Hello'
}
//写法三
let obj3 = {};
Object.defineProperty(obj3,mySymbol,{value:'Hello'})
//以上写法读取值 举例
console.log(obj[mySymbol]) // Hello
三、遍历含有Symbol作为属性名的对象
使用Reflect.ownKeys 遍历
//遍历含有Symbol作为属性名的对象
let person = {
name:'Tyler',
age:24,
[Symbol('level')]:'A',
[Symbol('class')]:'一班',
}
// 1、for in 遍历
for (let i in person){
console.log(i) // Symbol 属性无法打印
}
// 2、for of 遍历
for (const i of person) {
console.log(i) // 报错=>person并不具备迭代器接口Symbol.iterator
}
// 3、Object.keys 遍历
console.log(Object.keys(person)) // ['name','age'] Symbol 属性不在数组内
// 4、Object.getOwnPropertySymbols 遍历
console.log(Object.getOwnPropertySymbols(person)) // [Symbol(level),Symbol(class)] 读取到Symbol属性组成的数组
// 5、(Object.getOwnPropertyNames 遍历
console.log(Object.getOwnPropertyNames(person)) // ['name', 'age'] 读取不到Symbol属性
// 6、Reflect.ownKeys 遍历
console.log(Reflect.ownKeys(person)) // ['name', 'age', Symbol(level), Symbol(class)] 读取到全部属性
四、Symbol.for()及Symbol.keyFor()的使用
// Symbol.for()创建Symbol 作用:几个变量使用同一个Symbol的值
let a = Symbol.for('fun') // 登记Symbol值的key为fun
let b = Symbol.for('fun')
console.log(a === b) // true
// Symbol.keyFor() 返回一个已登记的Symbol的值的key 仅对Symbol.for()方法登记的值key有效
let c = Symbol.for('fun')
let d = Symbol('fun') // 未登记Symbol值,keyFor无效
console.log(Symbol.keyFor(c),Symbol.keyFor(d))// fun undefined