1. 程式人生 > >ES6新特性使用小結(三)

ES6新特性使用小結(三)

數組 col kset 布爾值 key 報錯 false 新特性 垃圾

九、數據類型  Symbol

/*
*   Symbol  數據類型   概念: Symbol 提供一個獨一無二的值
* */

{
    let a1 = Symbol();
    let a2 = Symbol();
    console.log(a1===a2,a1,a2);           //false

    let a3 = Symbol.for(‘a3‘);      //*Symbol.for 會檢查window下是否存在 ‘a3‘
    let a4 = Symbol.for(‘a3‘);
    console.log(a3===a4);           //true
} { //用法 let a1 = Symbol.for(‘abc‘); let obj = { [a1]:‘123‘, //獨一無二的key 值 ‘abc‘:345, ‘c‘:‘456‘ } console.log(‘obj‘,obj); //{abc: 345, c: "456", Symbol(abc): "123"} for(let [key,value] of Object.entries(obj)){ console.log(key,value);
//abc 345 c 456 // * for in/of 取不到Symbol類型key值 } Object.getOwnPropertySymbols(obj).forEach(function (item) { console.log(obj[item]); //123 可以拿到Symbol類型的key 但拿不到常規的key值 }) Reflect.ownKeys(obj).forEach(function (item) { //
可以拿到Symbol類型的key和常規的key console.log(‘ownKeys‘,obj[item]); //ownKeys 345 ownKeys 456 ownKeys 123 }) }

十、數據結構   Map()、Set()、WeakMap()、WeakSet()

/*
 *   ES6中的數據結構           Set()  WeakSet()        Map()   WeakMap()
 * */

{
    let list = new Set();
    list.add(5);
    list.add(7);

    console.log(‘size‘, list.size)               //獲取 長度 size  2
}

{
    let arr = [1, 2, 3, 4, 5];
    let list = new Set(arr);

    console.log(‘size‘, list.size)       //size  5
}

{
    let list = new Set();
    list.add(1);
    list.add(2);
    list.add(1);                    //往Set 數據類型中添加重復的值      不會報錯,只是不會生效

    console.log(‘list‘, list)        //Set(2) {1, 2}
}

{   /*  利用Set數據類型的特性去重        **Set 在轉換元素的的時候不會進行數據類型的轉換      */
    let arr = [1, 2, 3, 1, 5, ‘2‘, 4];
    let list = new Set(arr);

    console.log(‘unique‘, list);      //Set(6) {1, 2, 3, 5, "2", 4}       字符串‘2’和數值2同時存在
}

/*
 *   Set實例方法    add     delete  clear   has
 * */

{
    let arr = [‘add‘, ‘delete‘, ‘clear‘, ‘has‘];
    let list = new Set(arr);

    console.log(‘has‘, list.has(‘add‘));     //true
    console.log(‘delete‘, list.delete(‘add‘), list);     //Set(3) {"delete", "clear", "has"}
    console.log(‘clear‘, list.clear(), list)              //Set(0) {}
}

/*
 *   對Set數據結構的遍歷
 * */

{
    let arr = [‘add‘, ‘delete‘, ‘clear‘, ‘has‘];
    let list = new Set(arr);

    for (let key of list.keys()) {
        console.log(‘keys‘, key);   //keys add  keys delete keys clear  keys has
    }

    for (let v of list.values()) {
        console.log(‘values‘, v);   //values add    values delete   values clear    values has
    }

    for (let [k,v] of list.entries()) {
        console.log(‘entries‘, k, v); //entries add add   entries delete delete   ...
    }

    list.forEach(function (item) {
        console.log(item);      //add, delete, clear, has
    })
}


/*
 *   WeakSet  支持的數據類型必須是 *對象
 *            WeakSet中的對象都是弱引用  不會和垃圾回收機制掛鉤
 *
 *            WeakSet 不能遍歷,是因為成員都是弱引用,隨時可能消失,遍歷不能保證成員的存在。
 *            可能剛剛遍歷結束,成員就取不到了。WeakSet的一個用處是存儲DOM節點,而不用擔心這些節點從文檔移除時,會引起內存的泄露。
 *            WeakSet結構有以下方法
 *            WeakSet.add(value):向WeakSet實例添加一個新成員。
 *            WeakSet.delete(value):刪除WeakSet實例指定成員。
 *           WeakSet.has(value):返回一個布爾值,表示某個值是否在WeakSet實例中。
 * */

{
    let weakList = new WeakSet();
    let arg = {};
    weakList.add(arg);
    //weakList.add(1);        //Invalid value used in weak set
}

/*
 *   Map數據結構     Map的key值可以為任意類型
 * */

{
    let map = new Map();
    let arr = [1, 2, 3];

    map.set(arr, 456)
    console.log(‘map‘, map)          //Map(1) {Array(3) => 456}      使用數組作為key
}

{
    let map = new Map([[‘a‘, 123], [‘b‘, 456]]);

    console.log(‘map args‘, map);         //Map(2) {"a" => 123, "b" => 456}
    console.log(‘size‘, map.size);       //size  2
    console.log(‘get‘, map.get(‘a‘));    //get 123
    console.log(‘delete‘, map.delete(‘a‘), map);  //delete true Map(1) {"b" => 456}
    console.log(‘clear‘, map.clear(), map);       //clear undefined Map(0) {}
}


/*
 *   WeakMap     WeakMap 接受的key值必須為對象    其他同WeakSet
 * */

{
    let weakMap = new WeakMap();
    let o = {};

    weakMap.set(o, 123);
    console.log(‘weakMap‘, weakMap.get(o));        //weakMap 123
}
/*
 *    Set 和 Array
 * */

{
    let set = new Set();
    let arr = [];

    //
    set.add({‘t‘: 1});
    arr.push({‘t‘: 1});
    console.log(‘ser-arr‘, set, arr);

    //
    let set_exist = set.has({t: 1});         //false  引用類型的地址不同
    let arr_exist = arr.find(item=>item.t);

    //
    set.forEach(item=>item.t ? item.t = 2 : ‘‘);
    arr.forEach(item=>item.t ? item.t = 2 : ‘‘);
    console.log(‘set-arr-modify‘, set, arr);

    //
    set.forEach(item=>item.t ? set.delete(item) : ‘‘)
    let index = arr.findIndex(item=>item.t);     //查找每個元素中包含t的索引
    arr.splice(index, 1);
    console.info(‘set-arr-empty‘, set, arr);         //map-delete Set(0) {} []
}

/*
 *   Map 和 Array
 * */

{
    //數據結構橫向對比  ,增刪改查
    let map = new Map();
    let arr = [];
    //
    map.set(‘t‘, 1);
    arr.push({‘t‘: 1});

    console.info(‘map-array‘, map, arr);

    //
    let map_exist = map.has(‘t‘);           //boolean
    let array_exist = arr.find(item=>item.t);       //如果存在 則返回數據的值

    console.info(‘map-array‘, map_exist, array_exist);    //map-array     true    {t: 1}

    //
    map.set(‘t‘, 2);
    arr.forEach(item=>item.t ? item.t = 2 : ‘‘);
    console.info(‘map-modify‘, map, arr);             //map-modify Map(1) {"t" => 2} [{t:2}]

    //刪除
    map.delete(‘t‘);
    let index = arr.findIndex(item=>item.t);     //查找每個元素中包含t的索引
    arr.splice(index, 1);
    console.info(‘map-empty‘, map, arr);         //map-delete Map(0) {} []
}

/*
 *   Map,Set,Object 的對比
 * */

{
    let item = {‘t‘: 1};
    let map = new Map();
    let set = new Set();
    let obj = {};

    //
    map.set(‘t‘, 1);
    set.add(item);
    obj[‘t‘] = 1;

    console.info(‘map-set-obj‘, map, set, obj);     //map-set-obj Map(1) {"t" => 1} Set(1) {{t:1}} {t: 1}

    //
    console.info({
            map_exist: map.has(‘t‘),
            set_exist: set.has(item),
            obj_exist: ‘t‘ in obj
        }
        //{map_exist: true, set_exist: true, obj_exist: true}
    )

    //
    map.set(‘t‘,2);
    item.t=2;           //set 保存引用地址
    obj[‘t‘]=2;

    console.info(‘map-set-obj-modify‘, map, set, obj);      //map-set-obj-modify Map(1) {"t" => 2} Set(1) {{…}} {t: 2}

    //
    map.delete(‘t‘);
    set.delete(item);
    delete obj[‘t‘];

    console.info(‘map-set-empty‘, map,set, arr);
}
/*
*   對比小結:       Map>Set>Array=Object
*           1、在開發過程中涉及到的數據結構   能使用Map 不使用 Array 尤其是復雜的數據結構使用
*           2、如果對數據結構中的唯一性有要求 考慮使用Set   放棄使用Object做存儲
* */

ES6新特性使用小結(三)