1. 程式人生 > >ES6新增的資料結構Map和WeakMap

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物件;