es6新的数据类型Symbol
程序员文章站
2023-12-21 13:11:22
...
* 学习Symbol
* 首先Symbol是什么?它是新的(第七种)原始数据类型 null undefined Object Boolean String Number
* 其次Symbol可以用来做什么? 可以作为对象的属性名,可以保证不会与其他属性名产生冲突
* 特点:
* 1. 不能使用new命令 值不是对象 类似于字符串的一种数据类型
* 2. Symbol值是通过Symbol函数生成的 Symbol函数可以接受一个字符串作为参数
* 3. Symbol值不能和其他字符串拼接 也不能转换成数值 可以显式的转换成Boolean值
* 4. Symbol值就算参数相同 值也不一样,所以可以作为标识符,用于对象的属性名,为了保证不同名 不被覆盖
// 第一: 简单的列举
let a = Number()
let b = String()
let c = Boolean()
let d = Symbol()
console.log(typeof a, typeof b, typeof c, typeof d) // number string boolean symbol
// 第二: 没有参数 || 相同参数的情况下
let a = Symbol()
let b = Symbol()
console.log(a===b) // false
let c = Symbol('hello')
let d = Symbol('hello')
console.log(c === d) // false
// 结论: 独一无二, 无参数不好区分
// 第三: 例子 有参数 参数是字符串的情况下
let a = Symbol('hello')
let b = Symbol('nihao')
console.log(a, b) // Symbol(hello) Symbol(nihao)
// 第四: 例子 有参数 参数是对象的情况下
let obj = {
name: '婷'
}
let myname = Symbol(obj)
console.log(myname) // Symbol([object Object])
// 第五: 有参数 参数是对象时 需要调用toString()一下
let obj = {
toString() {
return '婷'
}
}
let myname = Symbol(obj)
console.log(myname) // Symbol(婷)
// 第六 Symobol值和其他值
let myname = Symbol('婷')
console.log('my name is'+ myname) // 报错: Cannot convert symbol value to string 无法将符号值转换为字符串
let num = Symbol() // Symbol('nihao') Symbol('1') Symbol(false) 六个数据类型放里面
Boolean(num)
if(num){
console.log('正确') // 永远是正确
}
//结论: 和其他值不能像其他字符串那样拼接使用 但是可以显式的转换成Boolean值 但是永远是true
// 第七: Symbol 描述 description
const sym = Symbol('婷')
let str = String(sym)
let newstr = str.toString()
console.log(str, newstr) // Symbol(婷) Symbol(婷)
let newstr = sym.description
console.log(newstr) // 婷
// 第八 作为属性名的 赋值的方法 Symbol 不能用. 用.之后后面就是字符串 而不是一个变量
let myage = Symbol()
// 第一种:
let a = {}
a.myage = '123' // {myage: 123} 错误
a[myage] = '12' // {Symbol(): "12"} 正确
// 第二种:
let a = {
[myage]: '26'
}
console.log(a) // {Symbol(): "26"} 正确
// 第三种:
let a = {};
Object.defineProperty(a, myage,{value: '18'})
console.log(a) // {Symbol(): "18"} 正确
// 第九 对象内部使用Symbol值定义属性时 将Symbol值放在[], [Symbol值]这样还是代表的这个值,如果不放[]的话。和.没什么两样,就成了普通的字符串
let sym = Symbol('nihao');
// 第一种:
let obj = {
[sym]: (arg)=>{
return arg +'哈哈'
}
}
// 第二种: 稍微简写一点
let obj = {
[sym](arg){
return arg +'哈哈'
}
}
console.log(obj[sym](123)) // 123哈哈 obj={Symbol(nihao):f}
// 第十: 定义常量
const log= {}
log.levels = {
DEBUG: Symbol('debug'),
INFO: Symbol('info'),
WARN: Symbol('warn')
}
console.log(log.levels.DEBUG,log.levels.INFO,log.levels.WARN)
// 结论: 意义暂时不清楚
// 第十一: 当Symbol作为对象的属性名, 遍历对象时,这个属性不会出现在常用的循环方法中,有一个方法:Object.getOwnPropertySymbols() 可以获取Symbol作为的键名
const obj = {}
let a = Symbol('a')
let b = Symbol('b')
obj[a] = '我是a'
obj[b] = '我是b'
console.log(obj) // {Symbol(a): "我是a", Symbol(b): "我是b"}
// 想要获取obj中所有的属性
//1: for...in
for(let key in obj){
console.log(key, 'key')// 什么也没有
}
//2: for...of
for(let key of obj){
console.log(key, obj[key]) //报错: obj is not iterable
}
//3. getOwnPropertyNames
console.log(Object.getOwnPropertyNames(obj)) // []
//4.getOwnPropertySymbols
console.log(Object.getOwnPropertySymbols(obj)) // [Symbol(a), Symbol(b)]
// 第十二: Reflect.ownKeys() 获取所有的键名 常规的包括Symbol值作为的键名
let obj = {
[Symbol('name')]: '婷',
age: 26,
like: 'smile',
}
console.log(Reflect.ownKeys(obj)) // ["age", "like", Symbol(name)] 顺序会有点不一样 数组前面是常规的键名最后是Symbol键名
未完待续…