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]);  后边的会覆盖掉前面的

posted on 2019-08-30 19:18  渐凸强、啊哈  阅读(147)  评论(0编辑  收藏  举报