ES6新增的数据结构Map和WeakMap

一、Map

Map对象是一种有对应 键/值 对的对象, JS的Object也是 键/值 对的对象 ;

ES6中Map相对于Object对象有几个区别:

1、Object对象有原型, 也就是说他有默认的key值在对象上面, 除非我们使用Object.create(obj)创建一个没有原型的对象;
2、在Object对象中, 只能把String和Symbol作为键名。 但是在Map中,键名可以是任何基本数据类型(String, Number, Boolean, undefined, Null),或者对象(Map, Set, Object, Function , Array,Symbol );
3、通过Map中的size属性, 可以很方便地获取到Map长度, 要获取Object的长度, 你只能用别的方法了;
4、Map实例对象的key值可以为一个数组或者一个对象,或者一个函数,比较随意 ,而且Map对象实例中数据的排序是根据用户push的顺序进行排序的, 而Object实例中key,value的顺序就是有些规律的, (他们会先排数字开头的key值,然后才是字符串开头的key值);

Map对象实例的方法:

set(key, value), 给Map对象设置key/value 键/值对, 返回这个Map对象(相对于Javascript的Set,Set对象添加元素的方法叫做add(),而Map对象添加元素的方法为set(key, value); 
clear(), 删除所有的键/值对;
delete(key), 删除指定的键/值对;
entries(),返回一个迭代器, 迭代器按照对象的插入顺序返回[key, value];
forEach(callback , context), 循环执行函数并把键/值对作为参数;context为执行函数的上下文this;
get(key),返回Map对象key相对应的value值;
has(key) ,返回布尔值, 其实就是返回Map对象是否有指定的key;
keys(),返回一个迭代器,迭代器按照插入的顺序返回每一个key元素;
.size属性, 可以很方便地获取到Map长度;

1、通过set(key, value)添加数据
let myMap = new Map();

let keyString = "a string key",
    keyObj = {},
    keyFunction = function(){};

//给myMap对应的键名添加键值
myMap.set(22,66);
myMap.set(keyString,"字符串");
myMap.set(keyObj,"对象");
myMap.set(keyFunction,"函数");
console.log(myMap.size); //4
console.log(myMap); // {22 => 66, "a string key" => "字符串", {…} => "对象", ƒ => "函数"}


//获取键值
console.log(myMap.get(keyString)); // 字符串
console.log(myMap.get(keyObj)); // 对象
console.log(myMap.get(keyFunction)); // 函数

//如果不通过变量来存储那些复杂的数据类型,而是直接获取他们的键值会是undefined

console.log(myMap.get("a string key")); // 字符串
console.log(myMap.get({}));            // undefined
console.log(myMap.get(function(){}));  // undefined
2、通过参数来添加默认数据:(注意格式一定要对,不然会报错!
let keyString = "a string key",
    keyObj = {},
    keyFunction = function(){};

let myMap = new Map( [ ["a string key",123],[keyObj,456],[keyFunction,666],[22,66] ])

console.log(myMap); // {"a string key" => 123, {…} => 456, ƒ => 666, 22 => 66}

二、WeakMap

WeakMap是弱引用的Map对象, 如果对象在js执行环境中不存在引用的话,相对应的WeakMap对象内的该对象也会被js执行环境回收;

WeakMap对象内键名必须是对象(即typeof类型是object)!!
  WeakMap对象的无.size属性。
WeakMap对象的方法:
  delete(key) : 删除指定的键/值对;
  get(key) :返回WeakMap对象key相对应的value值;
  has(key):返回布尔值, 其实就是返回WeakMap对象是否有指定的key;
  set(key,value):给WeakMap对象设置key/value 键/值对, 返回这个WeakMap对象;

猜你喜欢

转载自blog.csdn.net/m0_38134431/article/details/83898714
今日推荐