资讯专栏INFORMATION COLUMN

【ES6入门09】:Set和Map数据结构

Codeing_ls / 3191人阅读

摘要:类似于与的区别和的对比与对比数据结构横向对比,增查改删增查改删与对比增查改删与对比增查改删建议优先使用,不使用,特别是复杂的数据结构考虑数据唯一性,使用,放弃和

Set

1.add()方法和size属性

{
    let list = new Set();
    // add()方法向Set数据添加元素
    list.add(5);
    list.add(7);
    // size属性返回数据的长度
    console.log(list.size); // 2

    let arr = [1, 2, 3, 4, 5];
    let set = new Set(arr);
    console.log(set, set.size); // Set(5) {1, 2, 3, 4, 5} 5
}

2.Set的元素必须是唯一的

{
    let list = new Set();
    list.add(1);
    list.add(2);
    list.add(1); // 重复元素不会添加进去
    console.log(list); // Set(2) {1, 2}

    // 数组去重
    let arr = [1, 2, 3, 1, "2"];
    let list2 = [...new Set(arr)];
    console.log(list2); // [1, 2, 3, "2"]
}

3.has(),delete(),clear()

{
    let arr = ["add", "delete", "clear", "has"];
    let list = new Set(arr);
    console.log(list.has("add")); // true
    list.delete("add");
    console.log(list); // Set(3) {"delete", "clear", "has"}
    list.clear();
    console.log(list); // Set(0) {}
}

4.Set的遍历

{
    let arr = ["add", "delete", "clear", "has"];
    let list = new Set(arr);
    // Set结构的数据,key和value是同一个值
    for (let value of list) {
        console.log("value", value); // "add" "delete" "clear" "has"
    }
    for (let key of list.keys()) {
        console.log("keys", key); // "add" "delete" "clear" "has"
    }
    for (let value of list.values()) {
        console.log("values", value); // "add" "delete" "clear" "has"
    }
    for (let [key, value] of list.entries()) {
        console.log("entries", key, value);
    }
    list.forEach(function (item) {
        console.log(item); // "add" "delete" "clear" "has"
    });
}
WeakSet

WeakSet和Set的不同点:

WeakSet的元素只能是对象,不能是数值、字符串、布尔值...

WeakSet中的对象都是弱引用,垃圾回收机制不考虑WeakSet对该对象的引用。WeakSet里面的引用,都不计入垃圾回收机制,所以不会引发内存泄漏的问题。所以,WeakSet适合临时存放一组对象,以及存放跟对象绑定的信息。只要这些对象在外部消失,它在WeakSet里面的引用就会自动消失。

{
    let weakList = new WeakSet();
    let arg = {name: "hhh"};
    weakList.add(arg); // WeakSet的元素只能是对象
    // weakList.add(2); // Uncaught TypeError: Invalid value used in weak set
    console.log(weakList); // WeakSet {{name: "hhh"}}
    // 注意:WeakSet没有size属性,没有clear方法,不能遍历。其他的用法和Set相同
}
Map

1.set()方法和get()方法

{
    let map = new Map();
    let arr = ["123"];
    // Map的key可以是任意数据类型
    map.set(arr, 456); // map.set(key, value),这里用数组作为key,添加一个值为456的元素
    console.log(map.get(arr)); // 456
}

2.Map的另一种定义方式

{
    let map = new Map([["a", 123], ["b", 456]]); // 接收一个数组作为参数,数组的每一项为:[key,value]
    console.log(map); // Map(2) {"a" => 123, "b" => 456}
    console.log(map.size); // 2
    console.log(map.has("b")); // true
    map.delete("a");
    console.log(map); // Map(1) {"b" => 456}
    map.clear();
    console.log(map); // Map(0) {}
}
WeakMap

WeakMap和Map的不同点:

WeakMap的key只能是对象

WeakMap的键名所引用的对象都是弱引用,垃圾回收机制不考虑对此对象的引用。(注意,WeakMap弱引用的只是键名,而不是键值。键值依然是正常引用。)基本上,如果你要往对象上添加数据,又不想干扰垃圾回收机制,就可以使用WeakMap。

{
    let weakmap = new WeakMap();
    let o = {};
    weakmap.set(o, 123);
    console.log(weakmap.get(o)); // 123
    // 注意:WeakMap没有size属性,没有clear方法,不能遍历。类似于Set与WeakSet的区别
}
Set,Map和Array,Object的对比 Map与Array对比
{
    // 数据结构横向对比,增 查 改 删
    let map = new Map();
    let array = [];

    // 增
    map.set("t", 1);
    array.push({"t": 1});
    console.log(map, array); // {"t" => 1} [{"t": 1}]

    // 查
    let map_exist = map.has("t");
    let array_exist = array.find(item => item.t);
    console.log(map_exist, array_exist); // true {t: 1}

    // 改
    map.set("t", 2);
    array.forEach(item => item.t ? item.t = 2 : "");
    console.log(map, array); // {"t" => 2} [{"t": 2}]

    // 删
    map.delete("t");
    let index = array.findIndex(item => item.t);
    array.splice(index, 1);
    console.log(map, array); // {} []
}
Set与Array对比
{
    let set = new Set();
    let array = [];
    let item = {"t": 1};

    // 增
    set.add(item);
    array.push(item);
    console.log(set, array); // {{"t": 1}} [{"t": 1}]

    // 查
    let set_exist = set.has(item);
    let array_exist = array.find(item => item.t);
    console.log(set_exist, array_exist); // true {t: 1}

    // 改
    set.forEach(item => item.t ? item.t = 2 : "");
    array.forEach(item => item.t ? item.t = 2 : "");
    console.log(set, array); // {{"t": 2}} [{"t": 2}]

    // 删
    set.forEach(item => item.t ? set.delete(item) : "");
    let index = array.findIndex(item => item.t);
    array.splice(index, 1);
    console.log(set, array); // {} []
}
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.log(obj, map, set); // {t: 1} Map(1) {"t" => 1} Set(1) {{t: 1}}

    // 查
    console.log(map.has("t"), set.has(item), "t" in obj); // true true true

    // 改
    map.set("t", 2);
    item.t = 2;
    obj["t"] = 2;
    console.log(obj, map, set); // {t: 2} Map(1) {"t" => 2} Set(1) {{t: 2}}

    // 删
    map.delete("t");
    set.delete(item);
    delete obj["t"];
    console.log(obj, map, set); // {} Map(0) {} Set(0) {}
}

建议:

优先使用map,不使用array,特别是复杂的数据结构

考虑数据唯一性,使用set,放弃array和obj

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/98691.html

相关文章

  • ES6 知识整理一(es6快速入门

    摘要:函数调用会在内存形成一个调用记录,又称调用帧,保存调用位置和内部变量等信息。等到运行结束,将结果返回到,的调用帧才会消失。方法用于将一组值,转换为数组。,和遍历数组方法返回一个布尔值,表示某个数组是否包含给定的值,与字符串的方法类似。 ES6 简介 ES6, 全称 ECMAScript 6.0 ,是 JavaScript 的下一个版本标准,2015.06 发版。 let 和 const...

    elva 评论0 收藏0
  • 项目中常用的ES6

    摘要:看代码及注释就懂了把代码转换为代码解构赋值字符串反引号代替引号代替了正则表达式匹配数组展开符利用的实现对象对象属性有属性有值集合和添加元素,但是不会添加相同的元素,利用这个特性实现数组去重元素数量是否有指定元素删除元 看代码及注释就懂了 把ES6(es2015)代码转换为ES5代码 $ npm install -g babel-cli $ npm install babel-pres...

    Stardustsky 评论0 收藏0
  • es6快速入门

    摘要:快速入门简介以下简称是语言的下一代标准,已经在年月正式发布了。而且声明后必须立即初始化赋值,不能后面赋值。方法默认返回实例对象即,可以指定返回另外一个对象。参数搭配的变量是一个数组,该变量将多余的参数放入数组中。 es6快速入门 showImg(https://segmentfault.com/img/remote/1460000008519223?w=560&h=314); ES6简...

    liujs 评论0 收藏0
  • 带你入门 JavaScript ES6 (五) 集合

    摘要:一概述集合是引入的新的内置对象类型,其特点同数学意义的集合,即集合内所有元素不重复元素唯一。数组集合对比数组和集合,数组可以加入重复数据,而集合的所有元素是唯一的不允许重复。因此,适合临时存放一组对象,以及存放跟对象绑定的信息。 本文同步带你入门 带你入门 JavaScript ES6 (五) 集合,转载请注明出处。 前面我们学习了: for of 变量和扩展语法 块作用域变量和解构...

    BetaRabbit 评论0 收藏0
  • ES6入门之对象的新增方法

    showImg(https://user-gold-cdn.xitu.io/2019/5/22/16adcec448a45d82); 1. Object.is() 用来解决在ES5中 两种相等运算符的缺点。用来比较两个值是否严格相等,行为和(===)基本一致。 在ES5中判断两个值是否相等,只能用(==)相等运算符和(===)严格相等运算符,但是这两货都有缺点,前者 两边的值都会转换数据类型,...

    zhou_you 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<