美文网首页
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