## 一、Map
  Map類似于Object(對象),可用來存儲鍵值對,但需要通過SameValueZero算法保持鍵的唯一性。與Set一樣,在使用之前也得要實例化,如下代碼所示,構造函數Map()中的參數也是一個可選的可迭代對象,但此對象得是鍵值對的集合或兩列的二維數組。
~~~
new Map(); //Map(0) {}
new Map([["name", "strick"], ["age", 28]]); //Map(2) {"name" => "strick", "age" => 28}
~~~
**1)屬性和方法**
  Map比Set多一個讀取方法:get(),并且寫入方法改成了set(),其它的屬性和方法在功能上基本都一致,只是有些參數在含義上略有不同,例如delete()的參數表示鍵而不是值。方法的具體使用,可參加下面的代碼。
~~~
var people = new Map();
//寫入和讀取
people.set("name", "strick").set("age", 28); //Map(2) {"name" => "strick", "age" => 28}
people.get("name"); //"strick"
people.size; //2
//遍歷
[...people.keys()]; //["name", "age"]
[...people.values()]; //["strick", 28]
[...people.entries()]; //[["name", "strick"], ["age", 28]]
/*
"strick" "name" Map(2) {"name" => "strick", "age" => 28}
28 "age" Map(2) {"name" => "strick", "age" => 28}
*/
people.forEach(function(value, index, map) {
console.log(value, index, map);
});
//移除
people.delete("name")
people.has("name"); //false
people.clear();
people.has("age"); //false
~~~
**2)比較對象**
  本節開篇就提到Map和Object很類似,但其實兩者之間還是有一些很重要的區別,具體如表10所列。
:-: 
:-: 表10 Map和Object的對比
## 二、WeakMap
  WeakMap是Map的變體,也是鍵值對的集合,但它的鍵必須是弱引用的對象,并且不可枚舉,而值沒有限制,還是保持任意類型。當WeakMap的鍵所指的對象不再被引用時,其鍵和值將被GC自動回收。
**1)創建和方法**
  WeakSet也需要像Map那樣實例化(如下代碼所示),但沒有Map的size屬性,并且只包含Map中的四個方法:set()、get()、has()和delete(),諸如清空和遍歷相關的方法都是不存在的。
~~~
var weak = new WeakMap(),
arr = [1];
weak.set(arr, 10); //WeakMap {Array(1) => 10}
weak.get(arr); //10
weak.has(arr); //true
weak.delete(arr);
weak.has(arr); //false
~~~
**2)用途**
  WeakMap的主要優勢在于不干擾垃圾收集,從而能夠有效的防止內存泄漏。它適用于隱藏信息、存儲DOM節點等場景。下面是一個隱藏信息的示例,privates變量是一個WeakMap,它的鍵是當前實例化的People對象,存儲的私有數據是一個對象,兩個原型方法分別用于寫入和讀取name屬性。
~~~
var people = (function() {
var privates = new WeakMap();
function People() {
privates.set(this, {}); //初始化私有數據
}
People.prototype.setName = function(name) {
privates.get(this).name = name; //寫入
};
People.prototype.getName = function() {
return privates.get(this).name; //讀取
};
return new People();
})();
people.setName("strick");
people.getName(); //"strick"
~~~
  這種存儲方式不僅能讓數據保持私有狀態,并且當與之關聯的對象實例被銷毀后,這些私有數據將被GC一并刪除,從而釋放內存。
  下面是另一個存儲DOM節點的示例,node變量是一個WeakMap,它的鍵是文檔中的元素(即DOM的一個節點),在該元素的事件處理程序中可更新digit屬性。當從文檔中移除該元素時,與之關聯的數據也會隨之被刪除。
~~~
<div id="container"></div>
<script>
var container = document.getElementById("container");
var node = new WeakMap();
node.set(container, { digit: 0 });
container.addEventListener("click", function() {
var current = node.get(this);
current.digit++;
node.set(this, current);
},
false
);
</script>
~~~
*****
> 原文出處:
[博客園-ES6躬行記](https://www.cnblogs.com/strick/category/1372951.html)
[知乎專欄-ES6躬行記](https://zhuanlan.zhihu.com/pwes6)
已建立一個微信前端交流群,如要進群,請先加微信號freedom20180706或掃描下面的二維碼,請求中需注明“看云加群”,在通過請求后就會把你拉進來。還搜集整理了一套[面試資料](https://github.com/pwstrick/daily),歡迎瀏覽。

推薦一款前端監控腳本:[shin-monitor](https://github.com/pwstrick/shin-monitor),不僅能監控前端的錯誤、通信、打印等行為,還能計算各類性能參數,包括 FMP、LCP、FP 等。
- ES6
- 1、let和const
- 2、擴展運算符和剩余參數
- 3、解構
- 4、模板字面量
- 5、對象字面量的擴展
- 6、Symbol
- 7、代碼模塊化
- 8、數字
- 9、字符串
- 10、正則表達式
- 11、對象
- 12、數組
- 13、類型化數組
- 14、函數
- 15、箭頭函數和尾調用優化
- 16、Set
- 17、Map
- 18、迭代器
- 19、生成器
- 20、類
- 21、類的繼承
- 22、Promise
- 23、Promise的靜態方法和應用
- 24、代理和反射
- HTML
- 1、SVG
- 2、WebRTC基礎實踐
- 3、WebRTC視頻通話
- 4、Web音視頻基礎
- CSS進階
- 1、CSS基礎拾遺
- 2、偽類和偽元素
- 3、CSS屬性拾遺
- 4、浮動形狀
- 5、漸變
- 6、濾鏡
- 7、合成
- 8、裁剪和遮罩
- 9、網格布局
- 10、CSS方法論
- 11、管理后臺響應式改造
- React
- 1、函數式編程
- 2、JSX
- 3、組件
- 4、生命周期
- 5、React和DOM
- 6、事件
- 7、表單
- 8、樣式
- 9、組件通信
- 10、高階組件
- 11、Redux基礎
- 12、Redux中間件
- 13、React Router
- 14、測試框架
- 15、React Hooks
- 16、React源碼分析
- 利器
- 1、npm
- 2、Babel
- 3、webpack基礎
- 4、webpack進階
- 5、Git
- 6、Fiddler
- 7、自制腳手架
- 8、VSCode插件研發
- 9、WebView中的頁面調試方法
- Vue.js
- 1、數據綁定
- 2、指令
- 3、樣式和表單
- 4、組件
- 5、組件通信
- 6、內容分發
- 7、渲染函數和JSX
- 8、Vue Router
- 9、Vuex
- TypeScript
- 1、數據類型
- 2、接口
- 3、類
- 4、泛型
- 5、類型兼容性
- 6、高級類型
- 7、命名空間
- 8、裝飾器
- Node.js
- 1、Buffer、流和EventEmitter
- 2、文件系統和網絡
- 3、命令行工具
- 4、自建前端監控系統
- 5、定時任務的調試
- 6、自制短鏈系統
- 7、定時任務的進化史
- 8、通用接口
- 9、微前端實踐
- 10、接口日志查詢
- 11、E2E測試
- 12、BFF
- 13、MySQL歸檔
- 14、壓力測試
- 15、活動規則引擎
- 16、活動配置化
- 17、UmiJS版本升級
- 18、半吊子的可視化搭建系統
- 19、KOA源碼分析(上)
- 20、KOA源碼分析(下)
- 21、花10分鐘入門Node.js
- 22、Node環境升級日志
- 23、Worker threads
- 24、低代碼
- 25、Web自動化測試
- 26、接口攔截和頁面回放實驗
- 27、接口管理
- 28、Cypress自動化測試實踐
- 29、基于Electron的開播助手
- Node.js精進
- 1、模塊化
- 2、異步編程
- 3、流
- 4、事件觸發器
- 5、HTTP
- 6、文件
- 7、日志
- 8、錯誤處理
- 9、性能監控(上)
- 10、性能監控(下)
- 11、Socket.IO
- 12、ElasticSearch
- 監控系統
- 1、SDK
- 2、存儲和分析
- 3、性能監控
- 4、內存泄漏
- 5、小程序
- 6、較長的白屏時間
- 7、頁面奔潰
- 8、shin-monitor源碼分析
- 前端性能精進
- 1、優化方法論之測量
- 2、優化方法論之分析
- 3、瀏覽器之圖像
- 4、瀏覽器之呈現
- 5、瀏覽器之JavaScript
- 6、網絡
- 7、構建
- 前端體驗優化
- 1、概述
- 2、基建
- 3、后端
- 4、數據
- 5、后臺
- Web優化
- 1、CSS優化
- 2、JavaScript優化
- 3、圖像和網絡
- 4、用戶體驗和工具
- 5、網站優化
- 6、優化閉環實踐
- 數據結構與算法
- 1、鏈表
- 2、棧、隊列、散列表和位運算
- 3、二叉樹
- 4、二分查找
- 5、回溯算法
- 6、貪心算法
- 7、分治算法
- 8、動態規劃
- 程序員之路
- 大學
- 2011年
- 2012年
- 2013年
- 2014年
- 項目反思
- 前端基礎學習分享
- 2015年
- 再一次項目反思
- 然并卵
- PC網站CSS分享
- 2016年
- 制造自己的榫卯
- PrimusUI
- 2017年
- 工匠精神
- 2018年
- 2019年
- 前端學習之路分享
- 2020年
- 2021年
- 2022年
- 2023年
- 2024年
- 日志
- 2020