(Set 和Map)
Set和Map是ES6提出的兩種新的資料結構。我們先從Set開始學習
Set
Set類似於陣列,但是,它的成員必須是唯一的。沒有重複的值。
新建一個set const set = new Set([1,2,3,4,5]); Set的構造器函式接收一個引數來生成set。那就是可迭代物件。只要部署了Iterator介面的類陣列物件,都可以用來生成set;
Set的主要屬性: Set的主要屬性有兩個:
size(用來獲取Set的長度,類似於陣列的length) constructor(指向構造器函式Set) Set的基礎方法: Set作為一種新的資料結構,主要有下面四種方法:
add(value): 新增某個值,返回 Set 結構本身,類似於陣列的push操作 delete(value)刪除某個值,返回一個布林值,表示刪除是否成功。 has(value)返回一個布林值,表示該值是否為Set的成員。 clear():清除所有成員,返回undefined。 Set的遍歷方法: Set主要有下面幾種遍歷方法:
keys();返回一個鍵的遍歷器。 values();返回鍵值的遍歷器。 entries();返回一個帶鍵值對的遍歷器。 forEach。同陣列的forEach行為一直。 注意點:
因為set是沒有鍵的,所以,所有的鍵實際上都等於value。 因為set沒有鍵,所以,你無法像陣列一樣直接去的其中某個值。。。。。類似於set[1].是取不到值的。 set的主要應用場景:
陣列的去重 既然set不允許出現重複的元素,那麼,我們可以這麼實現陣列的去重。
let arr = [1,3,56,88,88]; arr = [...new Set(arr)]; console.log(arr);
WeakSet weakSet 與Set類似,但是隻能存放物件。也是不能有重複的值。
值得注意的是:兩個物件之間是否屬性值相等不能使用WeakSet判定。
例如:
const obj1 = { name: 1 } const obj2 = { name: 2 }
const wset = new WeakSet([obj1,obj2]);
這種情況下,還是會插入兩個物件。因為,在js中,物件比較的是棧區的地址。兩個物件棧區地址不一致,所以,js認為這兩個物件不相等。如果想要判斷兩個物件是否屬性值相等這種情況,還是需要使用類似深拷貝的思路去解決。
const obj1 = { name: 1 } const obj3 = obj1
const wset = new WeakSet([obj1,obj3]); 上述情況下,obj3不會被插入。
Map Map是ES6當中的新的資料型別,在過去,我們知道,物件總是以鍵值對的形式存在,我們的物件的鍵僅能使用字串來充當。在ES6當中,我們可以使用map的結構,他的結構類似於物件,但是,允許鍵為任何資料型別。
const obj = { name: "小張" } const m = new Map(); m.set(obj, "描述物件") console.log(m);
得到了Map的廬山真面目 image
Map的構造器函式,還接受一個陣列作為引數去新建一個Map物件。當然,這個陣列的格式是有要求的。接收一個陣列,該陣列中的元素,必須也是一個陣列,且長度為2.
程式碼如下:
const arr = [ [{name: "馮小剛"}, "著名導演"], [{name: "馬化騰"}, "著名CEO"], [{name: "逢澤莉娜"}, "著名網紅"] ]
const m = new Map(arr); console.log(m);