es6新的数据类型Symbol

一曲冷凌霜 提交于 2019-12-10 01:36:11
     *  学习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键名

未完待续…

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!