zoukankan      html  css  js  c++  java
  • ES6-03 symbol数据类型,代理,遍历的使用

    一,Symbol
    类型:基本数据类型
    目的:解决对象的属性名冲突。
    注意点:
    (1),symbol永远都是独一无二的值,即使相同参数,描述相同,两个symbol也是不相等的
    (2),symbol类型的值作为对象的属性名的时候,一定要用中括号[ ],不能用点运算符
    (3),for...in,for...of,keys( )以上几种方法都无法获取到symbol类型的属性。
    symbol的方法
    (1),Object.getOwnPropertySymbols()
    找到symbol类型的属性并且返回一个数组(注意:用该方法前必须定义symbol类型)
    let name =Symbol()
    let age =Symbol()
    let person ={
        [age]:"张三",
        [name]:12,
    };
    var n=Object.getOwnPropertySymbols(person);
    console.log(n)//[Symbol(), Symbol()]
    
    (2),Reflect.ownKeys
    一次性获取所有类型的属性,不管它是字符串类型还是symbol类型
    let name =Symbol()
    let age =Symbol()
    let person ={
        [age]:"张三",
        [name]:12,
        sex:"男"
    };
    console.log(Reflect.ownKeys(person))//Array(3)0:"sex"1:Symbol()2:Symbol()
    
    (3),Symbol.for
    根据参数名,去全局环境中搜索是否有以该symbol.for()参数为名的symbol值,有就返回它,没有就以该参数名来创建一个新的symbol值。所以如果用symbol.for()写两次相同的描述的时候,只是把同一个地址的symbol给了 两个变量而已,所以这两个变量全等
    let name =Symbol.for()
    let age =Symbol.for()
    console.log(name===age)//true
    
    (4),Symbol.keyFor
    和symbol.for()用法相同
    二,代理(proxy)
    代理的步骤
    1,首先需要先有一个目标对象,让它被代理
    // 创建个人账户包含RMB和dollar
    var personCount = { RMB:10,dollar:0};
    
    2,创建代理实例
    传入两个参数,第一个参数是被代理的对象,第二个参数是代理的距离实现对象
    // 创建一个代理实例
    var banker = new Proxy(personCount,{
    get:function(target,property){
        if(target[property]>0){
            return target[property]
        }else{
            return '余额不足'
        }
    },
    set:function(target,property,value){
        // console.log(value)
        if(Number.isInteger(value)){
            console.log('请设置正确得数字') 
        }
            target[property] = value;
    }
    }) 
    
    3,取消代理
    let object = Proxy.revocable(personCount,banker)
    console.log(object) //{proxy: Proxy, revoke: ƒ}
    object.revoke();// 真正取消代理操作
    
    ...未完待续
    三,新增遍历的使用
    (1),for...of
    for...of可遍历的对象包括数组,对象,字符串,set和map结构等具有iterator 接口的数据结构。
    (2),for...of和for...in的区别
     for...of可以设置终止,通过if判断和break,continute的结合使用,for...in必须遍历完才会终止
     for...of 获取的索引或者其他内容,可以是数字类型,而for...in 一定是字符串类型
     for...of不可以遍历对象的属性,for...in可以遍历对象的属性
    
    原因:能够被for...of正常遍历的,都需要实现一个遍历器Iterator。而数组,Set和Map结构,早就内置好了遍历器Iterator(又叫迭代器),它们的原型中都有一个Symbol.iterator方法;而Object对象并没有实现这个接口,使得它无法被for...of遍历
  • 相关阅读:
    计算机的基本存储单位
    挖坑
    HEOI2017 游记
    bzoj4815 [Cqoi2017]小Q的表格
    bzoj4817 [Sdoi2017]树点涂色
    hdu5824 graph
    4.5&4.7联考题解
    高飞
    无题
    51Nod 算法马拉松23 开黑记
  • 原文地址:https://www.cnblogs.com/adylz111/p/13419656.html
Copyright © 2011-2022 走看看