Symbol的理解和使用

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值