ES6新特性使用小结(三)

九、数据类型  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做存储
* */
时间: 2024-08-30 06:54:33

ES6新特性使用小结(三)的相关文章

ES6新特性使用小结(一)

一.let const 命令 'use strict'; /*function test(){ //let a = 1; for(let i=1;i<3;i++){ console.log(i) } console.log(i); //引用错误 let a = 1; let a= 2; //报错 let 不能重复定义同一个变量 } test(); */ function last(){ const PI = 3.1515926; //const 也具有块级作用域 const 声明变量时 *必须赋

ES6新特性三: Generator(生成器)函数详解

本文实例讲述了ES6新特性三: Generator(生成器)函数.分享给大家供大家参考,具体如下: 1. 简介 ① 理解:可以把它理解成一个函数的内部状态的遍历器,每调用一次,函数的内部状态发生一次改变. ② 写法: function* f() {} ③ 作用:就是可以完全控制函数的内部状态的变化,依次遍历这些状态. ④ 运行过程:当调用Generator函数的时候,该函数并不执行,而是返回一个遍历器(可以理解成暂停执行).通过调用next()开始执行,遇到yield停止执行,返回一个value

javascript ES6 新特性之 扩展运算符 三个点 ...

对于 ES6 新特性中的 ... 可以简单的理解为下面一句话就可以了: 对象中的扩展运算符(...)用于取出参数对象中的所有可遍历属性,拷贝到当前对象之中. 作用类似于 Object.assign() 方法,我们先来看一下 Object.assign() 方法: Object.assign() 方法用于将所有可枚举属性的值从一个或多个源对象复制到目标对象.它将返回目标对象.如下: const target = { a: 1, b: 2 }; const source = { b: 4, c: 5

ES6新特性

ES6新特性概览 箭头操作符 如果你会C#或者Java,你肯定知道lambda表达式,ES6中新增的箭头操作符=>便有异曲同工之妙.它简化了函数的书写.操作符左边为输入的参数,而右边则是进行的操作以及返回的值Inputs=>outputs. 我们知道在JS中回调是经常的事,而一般回调又以匿名函数的形式出现,每次都需要写一个function,甚是繁琐.当引入箭头操作符后可以方便地写回调了.请看下面的例子. var array = [1, 2, 3]; //传统写法 array.forEach(f

你不知道的JavaScript--Item24 ES6新特性概览

ES6新特性概览 本文基于lukehoban/es6features ,同时参考了大量博客资料,具体见文末引用. ES6(ECMAScript 6)是即将到来的新版本JavaScript语言的标准,代号harmony(和谐之意,显然没有跟上我国的步伐,我们已经进入中国梦版本了).上一次标准的制订还是2009年出台的ES5.目前ES6的标准化工作正在进行中,预计会在14年12月份放出正式敲定的版本.但大部分标准已经就绪,且各浏览器对ES6的支持也正在实现中.要查看ES6的支持情况请点此. 目前想要

ES6新特性概览

转自:http://www.cnblogs.com/Wayou/p/es6_new_features.html ES6学习可参考:http://es6.ruanyifeng.com/ 本文基于lukehoban/es6features ,同时参考了大量博客资料,具体见文末引用. ES6(ECMAScript 6)是即将到来的新版本JavaScript语言的标准,代号harmony(和谐之意,显然没有跟上我国的步伐,我们已经进入中国梦版本了).上一次标准的制订还是2009年出台的ES5.目前ES6

JavaScript学习--Item24 ES6新特性概览

ES6新特性概览 本文基于lukehoban/es6features ,同时参考了大量博客资料,具体见文末引用. ES6(ECMAScript 6)是即将到来的新版本JavaScript语言的标准,代号harmony(和谐之意,显然没有跟上我国的步伐,我们已经进入中国梦版本了).上一次标准的制订还是2009年出台的ES5.目前ES6的标准化工作正在进行中,预计会在14年12月份放出正式敲定的版本.但大部分标准已经就绪,且各浏览器对ES6的支持也正在实现中.要查看ES6的支持情况请点此. 目前想要

34.JS 开发者必须知道的十个 ES6 新特性

JS 开发者必须知道的十个 ES6 新特性 这是为忙碌的开发者准备的ES6中最棒的十个特性(无特定顺序): 默认参数 模版表达式 多行字符串 拆包表达式 改进的对象表达式 箭头函数 =&> Promise 块级作用域的let和const 类 模块化 注意:这个列表十分主观并且带有偏见,其他未上榜的特性并不是因为没有作用,我这么做只是单纯的希望将这份列表中的项目保持在十个. 首先,一个简单的JavaScript时间线,不了解历史的人也无法创造历史. 1995年:JavaScript以LiveS

ES6 新特性

ES6新特性 1.变量 (1).var 的问题:可以重复声明;  无法限制修改;  没有块级作用域; (2).新加let: 不能重复声明;  变量-可以重新进行赋值;  块级作用域; (3).新加const:不能重复声明;  常量-不可以重新进行赋值;  块级作用域; //var a=1; //var a=2; //alert(a); //可以重复声明 //let a=1; //let a=2; //alert(a);//不可以重复声明 const a=1; const a=2; alert(a