美文网首页
ES6(七)Set与Map1

ES6(七)Set与Map1

作者: 蒋小花_4b6c | 来源:发表于2020-05-21 17:52 被阅读0次

    1.ES5 中的 Set Map

        ES6的SET

    2.创建 Set 并添加项目

    3.移除值

    4.处理数组中的每一项foreach()

    5.将 Set 转换为数组

    ES5 中的 Set 与 Map

    let set = Object.create(null);

    let set1 = Object.create({});

    set.foo = true;

    console.log(set, set1);

    // 检查属性的存在性

    if (set.foo) {

    // 一些操作

    }

    let map = Object.create(null);

    map.foo = "bar";

    // 提取一个值

    let value = map.foo;

    console.log(map, value);

    与 Set 不同, Map 多数被用来提取数据,而 不是仅检查键的存在性。

    创建 Set 并添加项目 

    let set = new Set(),

        key1 = {}

        key2 = {};

    set.add('001');

    set.add('AAA')

    set.add(key1);

    set.add(key2);

    set.add(5);

    set.add("5");

    set.add(5); // 重复了,会被忽略

    console.log(set, set.size);

    // 用has()来判断是否存在

    console.log(set.has(2)); // f

    console.log(set.has(5)); // t

    console.log(set.has('5')); //t

    let set2 = new Set([1, 2, 3, 4, 5,5, 5, 5, 5]);

    console.log(set2.size); // 6

    // 不重复统计

    移除值

     delete() 方法来移除单个值,

    clear() 方法 来移除所有值

    let set = new Set();

    set.add(5);

    set.add("5");

    set.add("123");

    console.log(set.has(5));

    set.delete(5);

    console.log(set.has(5));

    console.log(set);

    set.clear();

    console.log(set, set.size);

    对每个项执行一些操作: forEcah()

    处理数组中的每一项 

    foreach()

    let set = new Set([1, 2]);

    set.forEach(function(value, key, ownerSet) {

        console.log(key + " " + value);

        console.log(ownerSet === set);

    });

    // 1 1

    // true

    // 2 2

    // true

    let set1 = new Set(['a', 'b']);

    set1.forEach((index, value, item) => {

        console.log(index, value, item, item === set1);

    })

    // a a Set(2) {"a", "b"} true

    // b b Set(2) {"a", "b"} true

    在回调函数中使用 this  ,你可以给forEach()  传入一个 this值作为第二个参数

    let set = new Set([1, 2]);

    let processor = {

        output(value) {

            console.log(value);

        },

        process(dataSet) {

        dataSet.forEach(function(value) {

            this.output(value);

            }, this);

        }

    };

    processor.process(set);

    // 1

    // 2

    使用箭头函数来达到相同效果,而无须传入第二个参数

    let set = new Set([1, 2]);

    let processor = {

        output(value) {

            console.log(value);

        },

        process(dataSet) {

            dataSet.forEach((value) => this.output(value));

        }

    };

    processor.process(set);

    // 1

    // 2

     Set能非常好地追踪值,并且 forEach() 可以让你按顺序处理每一项,但是却 无法像数组那样用索引来直接访问某个值。如果你想这么做,最好的选择是将 Set 转换为数 组。

     

    Set 转换为数组

    数组 => Set, 以将数组传递给 Set 构造器,

    Set => 数组, 扩展运算符( ... )

    let set = new Set([1, 2, 3, 3, 3, 4, 5]),

        array = [...set];

    console.log(array); // [1, 2, 3, 4, 5]

     Set清除了重复值之后,将数据复制到了新数组。

    由于 Set 类型存储对象引用的方式,它也可以被称为 Strong Set 。对象存储在 Set 的一个 实例中时,实际上相当于把对象存储在变量中。只要对于 Set 实例的引用仍然存在,所存储 的对象就无法被垃圾回收机制回收,从而无法释放内存。

    let set = new Set(),

        key = {},

        key1 = 'abc';

    set.add(key);

    set.add(key1);

    console.log(set.size, set);

    key = null;

    key2 = '123'

    key3 = null;

    set.add(key3);

    console.log(set.size, set);

    本来应该是赋值为null时取消引用,但实际还是被引用的

    使用 Weak Set 很像在使用正规的 Set:

    add()  方法、 

    has() 方法 

    delete() 方法

    let set = new WeakSet(),

    key = {};

    // 将对象加入 set

    set.add(key);

    console.log(set.has(key)); // t

    set.delete(key);

    console.log(set.has(key)); // f

    相关文章

      网友评论

          本文标题:ES6(七)Set与Map1

          本文链接:https://www.haomeiwen.com/subject/brigohtx.html