JavaScript的默認對象表示方式{}可以視爲其他語言中的Map或者Dictionary的數據結構,是一組鍵值對。
Map:是一組鍵值對的結構,具有極快的查找速度。
var m = new Map([['michael',95],['Bob',75],['zs',85]]);
console.log(m.get('zs'));
初始化的使用:
var m = new Map();
m.set('zs',67);
m.set('ls',100);
//是否存在key 'zs':true
m.has('zs');
// 67
m.get('zs');
//刪除key 'zs'
m.delete('zs');
m.get('ls');
由於一個key只能對應一個value,所以,多次對一個key放入value,後面的值會把前面的值沖掉:
var m = new Map();
m.set('admin',67);
m.set('admin',88);
m.get('admin');//88
Set
也是一組key的集合,但是不存儲value,由於key不能重複,所以在Set中,沒有重複的key,
在Set中重複的元素會自動被過濾掉
var s = new Set([1, 2, 3, 3, '3']);
s; // Set {1, 2, 3, "3"};
//添加元素到s中
s.add(4);
//刪除元素
s.delete(2)
總結:
Map和Set是ES6標準新增的數據類型,請根據瀏覽器的支持情況決定是否要使用。
iterable
通常情況下遍歷Array可以採用下標循環,但是在遍歷Map和Set就無法使用下標爲了統一集合類型,ES6標準引入了新的iterable類型,Array、Map和Set集合都屬於iterable類型。
iterable集合可以通過for…of循環來遍歷
例如:
var m = new Map();
var s = new Set();
m.set('zs',10);
m.set('ls',20);
s.add(12);
s.add(15);
for (var x of s) {
console.log("Set:"+x);
}
for (var x of m) {
console.log("Map:"+x);
}
兩者的區別:
for...in循環遍歷的是集合的索引名
for...of循環則只遍歷集合本身的元素`
例子:
var a = ['a','b','c'];
a.name = 'hello';
for(var x in a){
console.log("for...in:"+x);
}
for (var s of a) {
console.log("for...of:"+s);
}
使用for…of是爲了更好的使用iterable內置的forEach方法
var a = ['A', 'B', 'C'];
a.forEach(function (element, index, array) {
// element: 指向當前元素的值
// index: 指向當前索引
// array: 指向Array對象本身
console.log(element + ', index = ' + index);
});
Set與Array類似,但Set沒有索引,因此回調函數的前兩個參數都是元素本身:
var s = new Set(['A', 'B', 'C']);
s.forEach(function (element, sameElement, set) {
console.log(element);
});
Map的回調函數參數依次爲value、key和map本身:
var m = new Map([[1, 'x'], [2, 'y'], [3, 'z']]);
m.forEach(function (value, key, map) {
console.log(value);
});
如果對某些參數不感興趣,由於JavaScript的函數調用不要求參數必須一致,因此可以忽略它們。例如,只需要獲得Array的element:
var a = ['A', 'B', 'C'];
a.forEach(function (element) {
console.log(element);
});