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
     
     
  • 相关阅读:
    ES6中的find与filter的区别
    centos7上搭建http服务器以及设置目录访问
    JSON.parse()和JSON.stringify()的用法
    video 在iphone手机的ios系统和微信端无法自动播放
    JavaScript规范----DOM操作
    http与https的区别
    vw vh 的概念
    JS实现数组排序:升序和降序
    用Vue来实现音乐播放器(二十三):音乐列表
    JavaScript对象---递归遍历对象
  • 原文地址:https://www.cnblogs.com/zhaozhenghao/p/11194033.html
Copyright © 2011-2022 走看看