zoukankan      html  css  js  c++  java
  • ES6基础-2

    Symbol 类型 这是ES6新添加分数据类型 

    ES6 数据类型除了 Number 、 String 、 Boolean 、 Objec t、 null 和 undefined ,还新增了 Symbol 。

    基本使用

    let sy = Symbol("key");
    console.log(sy);
    console.log(typeof(sy));
    let sy1 = Symbol("key");
    console.log(sy == sy1);

     作为属性名

    由于每一个 Symbol 的值都是不相等的,所以 Symbol 作为对象的属性名,可以保证属性不重名。

    Symbol 作为对象属性名时不能用.运算符,要用方括号。因为.运算符后面是字符串,所以取到的是字符串 sy 属性,而不是 Symbol 值 sy 属性。

    let test = {};
        let a = Symbol("a");
        let b 
    = Symbol("a"); test[a] = "aa"; test[b] = "bb"; console.log(test); let syObj = {}; let sy = Symbol("test"); Object.defineProperty(syObj,sy,{value:"kk"}); console.log(syObj); //注意一点在Symbol当中不管Symbol的传递的字符 这个只是为了容易标识 let w = Symbol(); let w1 = Symbol(); let t = {}; t[w] = "sad"; t[w1] = "sdf"; console.log(t);

     注意点

    Symbol 值作为属性名时,该属性是公有属性不是私有属性,可以在类的外部访问。但是不会出现在 for...in 、 for...of 的循环中,也不会被 Object.keys() 、 Object.getOwnPropertyNames() 返回。如果要读取到一个对象的 Symbol 属性,可以通过 Object.getOwnPropertySymbols() 和 Reflect.ownKeys() 取到。

    Symbol.for() 类似单例模式,首先会在全局搜索被登记的 Symbol 中是否有该字符串参数作为名称的 Symbol 值,如果有即返回该 Symbol 值,若没有则新建并返回一个以该字符串参数为名称的 Symbol 值,并登记在全局环境中供搜索。

    let yellow = Symbol("yellow");
    let yellow1 = Symbol.for("yellow");
    
    
    let yellow2 = Symbol.for("yellow");

    Symbol.keyFor() 返回一个已登记的 Symbol 类型值的 key ,用来检测该字符串参数作为名称的 Symbol 值是否已被登记。

    console.log(Symbol.keyFor(yellow2));



    Map和set对象 

    Map 对象保存键值对。任何值(对象或者原始值) 都可以作为一个键或一个值。

    Map的键值是有序的fifo

    Map的键的个数可以使用size属性获得

    Map的键可以是任意数据类型

        //key是字符串
        
    let m = new Map();
    let str = "hello";
    m.set(str,"hello相关联系");
    console.log(m.get(str));
    //key 是对象类型
    let obj = {};
    m.set(obj,"我是一个对象类型键");//注意m.get({});是不相等的
    console.log(m.get(obj));
    
    //函数类型键
    let func = function(){
    
    }
    m.set(func,"我是一个函数类型");
    console.log(m.get(func));
    //key 是 NaN NaN作为Map键是没有区别的
    m.set(NaN,"我是NaN");
    console.log(m.get(NaN));

    遍历Map

    for of方法

    let m = new Map();
    
        m.set(0,"a");
        m.set(1,"a1");
        m.set(2,"a2");
        m.set(3,"a3");
        console.log(m.values());
    
    
        //for of
        for( let [key,value] of m){
            console.log(key+"-"+value);
        }
        for( let [key,value] of m.entries()){
            console.log(key+"-"+value);
        }
        for( let key of m.keys()){
            console.log(key);
        }
        for( let value of m.values()){
            console.log(value);
        }

    forEach遍历

    m.forEach( function(key, value) {
            console.log(key+"-"+value);
        });

    Map和数组互相转换

    let arr = [["key","value"],["key1","value1"],["key2","value2"]];
        //将数组转换成Map
        let m = new Map(arr);
        console.log(m);
        //将Map转换成数组
        let test = Array.from(m);
        console.log(test);

     Map克隆可以将一个Map对象作为参数传递过去创建Map 虽然内容一致但属于不同实例 不完全相等

    Map合并  

    var merged = new Map([...first, ...second]);  后边的会覆盖掉前面的

  • 相关阅读:
    mysql主从延迟判断,监控和问题处理
    oracle备份
    oracle的查询命令
    Appcan 自定义数字加减控件
    PowerDesigner16.5 有用地址
    git远程仓库关联(码云)
    leetcode27.移除元素(双指针法)
    leetcode26.删除排序数组中的重复项(双指针法,顺序表删除)
    leetcode21.合并两个有序链表(链表使用,递归算法)
    leetcode20.有效的括号(hashmap使用,键值匹配)
  • 原文地址:https://www.cnblogs.com/webcyh/p/11436701.html
Copyright © 2011-2022 走看看