欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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键名

未完待续…

相关标签: js

上一篇:

下一篇: