• es6 Symbol类型


    es6 新增了一个原始类型Symbol,代表独一无二的数据

      javascript 原来有6中基本类型, Boolean ,String ,Object,Number, null , undefined (typeof null 是等于object)

    //es6 引进Symbol 表示独一无二的值
    console.log(typeof(null)) //objert
    let person = {
        name: '2121'
    }
    console.log(typeof(person)) //objert
    
    let s = Symbol();
    console.log(typeof(s)) //symbol

    Symbol表示独一无二的值,所有创建的不同Symbol 一定不相等,Symbol 不是对象,不能使用new去创建 ,Symbol 不能与其他类型进行运算,会报错

    let aa = Symbol('11')
    let bb = Symbol('11')
    console.log(aa===bb) //false
    
    //let cc = new Symbol() //报错 Symbol is not a constructor
    
    //aa + 1 //报错 Cannot convert a Symbol value to a number
    //symbol 可以传入一个参数,主要代表 描述,无实际意义
    
    //Symbol 作为一个独一无二的值,主要用来作为属性名 ,保证不会出现同名字属性,且不会被覆盖
    
    let sym = Symbol();
    let amains = {
        [sym]: '123456'
    }
    console.log(amains[sym]) //使用 symbol作为属性名 一定是表达式属性名
    //case 适合使用symbol , 不会出现重复的条件

    symbol 可以用来消除魔术字符串,魔术字符串,一个在代码中出现多次的字符串,有时候语义还不明确,

      在强类型语言中,我们可以使用枚举类型, 枚举类型一定是 int 类型,独一无二,还可以定义描述,而symol刚好符合这些

    let typebook = Symbol ('资源类型图书')
    
    function getResourcetype (type) {
        let price = 0
        switch(type) {
            case typebook:
                price = 50
                break;
            default:
                price = 30
                break;
        }
        return price
    }
    console.log(getResourcetype(typebook))

    属性名的遍历

      回顾一下对象的遍历

      对象遍历的一共有几种方式 1.for in  2. Object.keys() 3.Object.getOwnPropertyNames() 4.Object.Object.getOwnPropertySymbols 5.Reflect.oenKeys

      而对于属性名是symbil 只有第四和第五能读取的到,1,for in 是读取自身对象上和原型链上可枚举的属性 2.Object.keys 读取自身,可枚举,非Symbol 属性名
      3. Object.getOwnPropertyNames 读取自身,包括不可枚举,非Symbol 属性 4.Object.getOwnPropertySymbols 读取自身 Symbol 属性,包括不可枚举
      5.Reflect.ownKeys 反射,这个后端同学就恨熟悉了,不管啥,都给你读取出来,但是只读取自身上的属性
    let typebook = Symbol ('资源类型图书')
    let wfywxhs = {
        [typebook]: '无人与我',
        1: 'ddd',
        'dsa': '是不是'
    }
    Object.defineProperty(wfywxhs,'zizun',{
        writable: false,
        enumerable: false,
        value: 'czcz',
        configurable: 'wozhis'
    })
    const proto = {
        foo: 'hello'
    }
    
    Object.setPrototypeOf(wfywxhs,proto)
    console.log(wfywxhs)
    for(let item in wfywxhs) {
        console.log(item) // 1 dsa foo  foo为原形上的属性  读取不到不可枚举zizun 和symbol
    }
    console.log(Object.keys(wfywxhs)) //["1", "dsa"]  读取不到原形上foo属性 he symbol
    console.log(Object.getOwnPropertyNames(wfywxhs)) //["1", "dsa", "zizun"] 读取自身上所有部位symbol 属性,不可枚举也能读取到
    console.log(Object.getOwnPropertySymbols(wfywxhs))// [Symbol ('资源类型图书')] //读取为symbol 的属性
    console.log(Reflect.ownKeys(wfywxhs)) //["1", "dsa", "zizun", Symbol(资源类型图书)] 读取自身上所有的属性,包括不可枚举和Symbol
  • 相关阅读:
    机器学习踩坑之Win10+Ubuntu双系统安装踩坑经验
    面向对象
    模块(三)
    模块(二)
    模块之日志
    包的基础使用
    模块介绍
    递归
    匿名函数与三元表达式
    生成器与迭代器
  • 原文地址:https://www.cnblogs.com/czkolve/p/10611445.html
Copyright © 2020-2023  润新知