ES6 | Map与Set

本文详细介绍了JavaScript中的Map和Set数据结构。Map对象保存键值对,其键可以是任意值,而Object的键仅限于字符串或Symbol。Map的迭代可通过for...of或forEach实现。Set对象则存储唯一值,包括特殊值如+0/-0、undefined和NaN。文章还展示了Map与Set之间的转换、克隆、合并及数组去重等操作。
摘要由CSDN通过智能技术生成

目录

一、Map

1.概念

2. Map与Object的区别

(1).当Map中的key是字符串时 

(2).当Map中的key值是对象时

(3).当Map中的key值是函数时 

 2.Map的迭代

(1) for...of

 (2) forEach 

3.Map对象的操作 

 二、Set

1. 概念

2. Set中的特殊值

 3. 类型转换

 4. Set对象的操作


一、Map

1.概念

Map 对象保存键值对。任何值(对象或者原始值) 都可以作为一个键或一个值。

2. Map与Object的区别

  • 一个 Object 的键只能是字符串或者 Symbols,但一个 Map 的键可以是任意值。
  • Map 中的键值是有序的(FIFO 原则),而添加到对象中的键则不是。
  • Map 的键值对个数可以从 size 属性获取,而 Object 的键值对个数只能手动计算。
  • Object 都有自己的原型,原型链上的键名有可能和你自己在对象上的设置的键名产生冲突。

(1).当Map中的key是字符串时 

    <script>
        var myMap = new Map();
        var keyString = "a string";
        myMap.set(keyString, "和键'a string'关联的值");
        
        console.log(myMap)
        console.log(myMap.get(keyString))
        console.log(myMap.get('a string'))
    </script>

 

 我们可以看到Map中是一个键值对:【'a string' => "和键'a string'关联的值"】。但是我们 console.log(myMap.get(keyString))和 console.log(myMap.get('a string'))得到的值是相同的,这是为什么呢?我来自问自答一下,因为 keyString === 'a string'。

(2).当Map中的key值是对象时

        var myMap = new Map();
        var keyObj = {};
        myMap.set(keyObj, "和键 keyObj 关联的值");
        console.log(myMap.get(keyObj))
        console.log(myMap.get({}))

 

为什么 console.log(myMap.get({}))为undefined呢?因为 keyObj !== {}。

(3).当Map中的key值是函数时 

        var myMap = new Map();
        var keyFunc = function () { }; // 函数
        myMap.set(keyFunc, "和键 keyFunc 关联的值");

        console.log(myMap.get(keyFunc)); 
        console.log(myMap.get(function () { }))

 

 为什么console.log(myMap.get(function () { }))是undefined呢?因为 keyFunc !== function () {}。

 2.Map的迭代

(1) for...of

        var myMap = new Map();
        myMap.set(0, "zero");
        myMap.set(1, "one");
        console.log(myMap)
        for (var [key, value] of myMap) {
            console.log(key + " = " + value);
        }

 (2) forEach 

        var myMap = new Map();
        myMap.set(0, "zero");
        myMap.set(1, "one");
        console.log(myMap)
        myMap.forEach(function(value, key) {
            console.log(key + " = " + value);
        }, myMap)

3.Map对象的操作 

        // Map与array之间的转换
        var kvArray = [["key1", "value1"], ["key2", "value2"]];
        var newMap = new Map(kvArray)
        console.log(newMap)
        var outArray = Array.from(newMap);
        console.log(outArray)

        // 克隆
        var myMap1 = new Map([["key1", "value1"], ["key2", "value2"]]);
        var myMap2 = new Map(myMap1)
        console.log(myMap2)

        // Map的合并
        var first = new Map([[1, 'one'], [2, 'two'], [3, 'three'],]);
        var second = new Map([[1, 'uno'], [2, 'dos']]);
        var hebin = new Map([...first, ...second])
        console.log(hebin)

 二、Set

1. 概念

Set 对象允许你存储任何类型的唯一值,无论是原始值或者是对象引用。

2. Set中的特殊值

Set 对象存储的值总是唯一的,所以需要判断两个值是否恒等。有几个特殊值需要特殊对待:

  • +0 与 -0 在存储判断唯一性的时候是恒等的,所以不重复;
  • undefined 与 undefined 是恒等的,所以不重复;
  • NaN 与 NaN 是不恒等的,但是在 Set 中只能存一个,不重复。
let mySet = new Set();
 
mySet.add(1); // Set(1) {1}
mySet.add(5); // Set(2) {1, 5}
mySet.add(5); // Set(2) {1, 5} 这里体现了值的唯一性
mySet.add("some text"); 
// Set(3) {1, 5, "some text"} 这里体现了类型的多样性
var o = {a: 1, b: 2}; 
mySet.add(o);
mySet.add({a: 1, b: 2}); 
// Set(5) {1, 5, "some text", {…}, {…}} 
// 这里体现了对象之间引用不同不恒等,即使值相同,Set 也能存储

 3. 类型转换

    <script>
        //数组转Set
        var mySet = new Set(["value1", "value2", "value3"]);
        console.log(mySet)
        //Set转数组
        var newArray = [...mySet]
        console.log(newArray)
    </script>

 4. Set对象的操作

        // 数组去重
        var mySet = new Set([1, 2, 3, 4, 4]);
        var newArr = [...mySet];
        console.log(newArr)

        // 并集
        var a = new Set([1, 2, 3]);
        var b = new Set([4, 3, 2]);
        var union = new Set([...a, ...b]);
        console.log(union)

        // 交集
        var a = new Set([1, 2, 3]);
        var b = new Set([4, 3, 2]);
        var intersect = new Set([...a].filter(x => b.has(x)));
        console.log(intersect)

        // 差集
        var a = new Set([1, 2, 3]);
        var b = new Set([4, 3, 2]);
        var difference = new Set([...a].filter(x => !b.has(x)));
        console.log(difference)

 本文章参考菜鸟教程!!!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值