zoukankan      html  css  js  c++  java
  • Map对象,Set对象使用(1)

    Map对象:包含所有类型。可以是对象,函数,或字符串等,本质上是键值对的集合

    let m = new Map();
    let keyarr = [1,23,"发广告"];
    let keyfun = function(){}
    let keyobj = {"想什么": "无语"};
    /*
    * 添加键
    */
    m.set(keyarr,"我是值");
    m.set(keyfun,{});
    m.set(keyobj,[123456,10]);
    /*  
    * 读取值
    */
    m.get(keyarr);//"我是值"
    m.get(keyfun);//{}
    m.get(keyobj);//[123456,10]
    console.log(m);

     上面是Map的两种方法set(),get()(存入和读取)

    如果读取未知的键,则返回undefined

    Map还有size属性,has()方法:

    //继续上面的代码
    console.log(m.size);//3
    size属性返回 Map 结构的成员总数。
    /*
    * has()方法
    * has方法返回一个布尔值,表示某个键是否在当前 Map 对象之中。
    */
    console.log(m.has("100"));//false
    console.log(m.has({ "想什么": "无语" }));//false  !?
    console.log(m.has([1, 23, "发广告"]));// false
    console.log(m.has(function () { }));// false
     
    m.set(false);//这里添加一个布尔值进行判断
    console.log(m.has(false));//true

    在上面把对应的对象进行了判断。但却给了false,这是为何?(数组和函数一会会提到,别急)

    明明Map数据结构中是有这键的,判断却给了false,

    其实原因很简单,每个对象都有唯一的地址,即使建立了相同的对象,也还会是false,如果还不明白的继续往下看,

    这里需要知道一下堆栈的知识

    栈(stack):先进后出;自动分配内存空间,由系统自动释放;使用的是一级缓存,他们通常都是被调用时处于存储空间中,调用完立即释放。

    堆(heap):队列优先,先进先出;动态分配内存,大小不定也不会自动释放;存放在二级缓存中,生命周期由虚拟机的垃圾回收算法来决定;一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。

    基本类型有 Undefined、Null、Boolean、Number 和String。这些类型在内存中分别占有固定大小的空间,他们的值保存在栈空间,我们通过按值来访问的。

    引用类型,值大小不固定,栈内存中存放地址指向堆内存中的对象。是按引用访问的。当我们需要访问引用数据类型 (对象 / 数组 / 函数) 的值时,首先从栈中获得该对象的地址指针,然后再从堆内存中取得所需的数据。

    所以,现在就可以解释 Map中存在的对象,函数,数组 为false了。

    再直白点变量a实际保存的是指向堆内存中对象的一个指针,而b保存的是指向堆内存中另一个对象的一个指针;虽然这两个对象的值是一样的,但它们是独立的2个对象,占了2份内存空间;所以 a==b 为 false。

    以下再来介绍Map的遍历方法:

    • Map.prototype.keys():返回键名的遍历器。
    • Map.prototype.values():返回键值的遍历器。
    • Map.prototype.entries():返回所有成员的遍历器。
    • Map.prototype.forEach():遍历 Map 的所有成员。
    const map = new Map([
      ['F', 'no'],
      ['T',  'yes'],
    ]);
    
    for (let key of map.keys()) {
      console.log(key);
    }
    // "F"
    // "T"
    
    for (let value of map.values()) {
      console.log(value);
    }
    // "no"
    // "yes"
    
    for (let item of map.entries()) {
      console.log(item[0], item[1]);
    }
    // "F" "no"
    // "T" "yes"
    
    // 或者
    for (let [key, value] of map.entries()) {
      console.log(key, value);
    }
    // "F" "no"
    // "T" "yes"
    
    // 等同于使用map.entries()
    for (let [key, value] of map) {
      console.log(key, value);
    }
    // "F" "no"
    // "T" "yes"
    
    function logMapElements(value, key, map) {
        console.log("m[" + key + "] = " + value);
    }
    Map([["foo", 3], ["bar", {}], ["baz", undefined]]).forEach(logMapElements);
    // logs:
    // "m[foo] = 3"
    // "m[bar] = [object Object]"
    // "m[baz] = undefined"

    entries() 方法返回一个新的包含 [key, value] 对的 Iterator 对象,返回的迭代器的迭代顺序与 Map 对象的插入顺序相同。

    Map.prototype.clear() : 会移除Map对象中的所有元素。

    Map.prototype.delete() : 用于移除 Map 对象中指定的元素。

    var map1 = new Map();
    map1.set('bar', 'foo');
    
    console.log(map1.delete('bar'));
    // expected result: true
    // (true indicates successful removal)
    
    console.log(map1.has('bar'));
    // expected result: false
    
    
    var map1 = new Map();
    
    map1.set('bar', 'baz');
    map1.set(1, 'foo');
    
    console.log(map1.size);
    // expected output: 2
    
    map1.clear();
    
    console.log(map1.size);
    // expected output: 0
     
     
  • 相关阅读:
    算法训练 P1103
    算法训练 表达式计算
    算法训练 表达式计算
    基础练习 时间转换
    基础练习 字符串对比
    Codeforces 527D Clique Problem
    Codeforces 527C Glass Carving
    Codeforces 527B Error Correct System
    Codeforces 527A Glass Carving
    Topcoder SRM 655 DIV1 250 CountryGroupHard
  • 原文地址:https://www.cnblogs.com/zhaozhenghao/p/11194033.html
Copyright © 2011-2022 走看看