symbol
- 基本数据类型,可以创建第一无二的值
- 可以传递参做为唯一标识 只支持 string 和 number类型的参数
const s1 = Symbol()
const s2 = Symbol()
// s1 === s2 =>false
- 有一个转换机制。参数为number的时候,会先进将number转换成字符串,然后将字符串传给symbol
const s3 = Symbol('唯一标识')
const s4 = Symbol(222)
console.log(s1, s2, s3, s4, typeof s4)
- 如下写法会有tslint 的提示,所以你可以直接chrome的控制台中看下效果。会返回 Symbol([object,object])
- 因为object.toString() 返回的就是[object,object]
const s5 = Symbol({ a: 1 })
- symbol 值不可以和其他类型的值进行运算,可以进行类型转换
s4.toString()
Boolean(s4) // symbol值 永远是真
// 可以取反 !s4
console.log(s2.toString(), Boolean(s2), !s2)
let prop = 'name'
const obj = {
name: 'zhangsan'
}
console.log(obj)
- es6 中可以直接把变量或者表达式作为属性名
let objAddname = 'name'
let firstName = 'name'
const objAdd = {
name: 'lisi',
[objAddname]: 'xoapming',
[`my${firstName}is`]: 'zhangsan'
}
console.log(objAdd)
- 你还记得吗?Do your remember symbol是唯一的,所以当你使用symbol作为属性的时候,可以保证此属性的唯一性
const symbol1 = Symbol('userName')
let objInfo = {
[symbol1]: '王会'
}
- 只能通过objInfo[symbol] 的方式修改属性值
- 你知道的,对象获取的属性的方式。 obj.a || obj['a'] 但是symbol只能通过 obj[a] 的方式
console.log(objInfo)
console.log(objInfo[symbol1])
- 对象属性的遍历
- 使用symbol定义的属性,是不能通过如下方式遍历拿到的,具体如下写法
const symbol2 = Symbol('like')
const objInfo1 = {
[symbol1]: '小明',
[symbol2]: '游泳',
age: 19,
sex: '女'
}
// 1 for in 遍历
for (const key in objInfo1) {
// 注意在console看key,是不是没有遍历到symbol1
console.log(key)
}
// 2 Object.keys 遍历
Object.keys(objInfo1)
console.log(Object.keys(objInfo1))
// 3 getOwnPropertyNames
console.log(Object.getOwnPropertyNames(objInfo1))
// 4 JSON.stringfy
console.log(JSON.stringify(objInfo1))
- 那么要怎么拿到对象中的symbol 属性呢
// 1 拿到具体的symbol 属性,对象中有几个就会拿到几个
Object.getOwnPropertySymbols(objInfo1)
console.log(Object.getOwnPropertySymbols(objInfo1))
// 2 es6 的 Reflect 拿到对象的所有属性
Reflect.ownKeys(objInfo1)
console.log(Reflect.ownKeys(objInfo1))
symbol 的两个静态方法,都会返回symbol类型的值
- symbol.for() symbol.keyFor()
const m1 = Symbol('lisi')
const m2 = Symbol('lisi')
// console.log(m1 === m2) false
// 会在全局下创建一个symbol的值,全局指当前页面,当前页面的iframe、service worker、
const m3 = Symbol.for('lisi')
const m4 = Symbol.for('lisi')
const m5 = Symbol.for('zhansan')
// console.log(m3 === m4) true
// console.log(m4 === m5) false
- symbol.keyFor() 返回使用Symbol.for全局注册symbol时传入的标识,如果用基本的symbol创建的,拿到的就是undefined
console.log(Symbol.keyFor(m1),Symbol.keyFor(m3))