set類似於陣列,但是沒有重複的值,成員是唯一的。
set例項有兩個屬性:set.prototype.constructor指向set本身,set.prototype.size返回set例項的成員總數。
set例項的方法分為兩大類:操作方法(用於運算元據)和遍歷方法(用於遍歷成員):
array.from方法可以將set結構轉為數值。
var set = new set([1,2,3,4,5,4,3,2,1]);
var arr = array.from(set);
//因此可以這樣對陣列去重
function dedupe(arr);
dedupe([1,1,1,2,2,2]); // [1,2]
//另一種更簡潔的陣列去重方法:[...new set(arr)]
[...new set([111,222,111,222])]; // [111,222]
向set加入值的時候,不會發生型別轉換,所以5跟'5'是不同的值。
set內部判斷兩個值是否相同,使用的演算法叫'same-value equality',它類似於全等=,區別是nan ! nan,但是在set內部,nan是等於自身的。
var set = new set();
set.add('5').add(nan).add(5).add(nan);
set.size;//3
set;//
let set = new set(['red','green','blue']);
for(let item of set.keys())
//red
//green
//blue
for(let item of set.values())
//red
//green
//blue
for(let item of set.entries())
//['red','red']
//['green','green']
//['blue','blue']
set結構的例項預設可遍歷,它的預設遍歷器生成函式就是它的values方法,因此可以省略values方法,直接用for...of迴圈遍歷set.
let set = new set(['red','green','blue']);
for(let item of set);
//red
//green
//blue
set結構的例項foreach方法,用於對每個成員執行某種操作,沒有返回值
let set = new set([1,2,3]);
set.foreach((value,key) => console.log(value * 2));
//2,4,6
使用擴充套件運算子可以將陣列的map和filter方法用於set
let set = new set([1,2,3]);
set = new set([...set].map(x => x * 2));
set = new set([...set].filter(x => (x % 2) == 0)
因此可以使用set可以很容易實現並集,交集和差集
let a = new set([1,2,3]);
let b = new set([2,3,4]);
//並集
let union = new set([...a,...b]);
//交集
let intersect = new set([...a].filter(x => b.has(x)));
//差集
let difference = new set([...a].filter(x => !b.has(x)));
js的物件,object,是鍵值對的集合(hash結構),但是只能使用字串當作鍵。
var data = {},body = document.queryselector('body');
data[body] = 'bodyele';
data['[object htmlbodyelement]']; // 'bodyele' //dom節點作為data的鍵值被自動轉為字串
為了解決類似這種的問題,es6提供了map資料結構。object是『字串--值』的對應,map是『值--值』的對應,是一種更完善的hash結構
var m = new map(),
o = ;
m.set(o,'content');
m.get(o); // 'content'
m.has(o); // true
m.size; // 1
m.delete(o);// true
m.has(o); // false
m.size; // 0
var m = new map([
[true,'foo'],
['true','bar']
]);m.get(true); // 'foo'
m.get('true'); // 'bar' // true跟'true'是兩個不同的值
m.set(0,false).set(0,'false');
m.get(0); // 'false' // 對同乙個鍵多次賦值,後面的會覆蓋前面的
m.get(1); // undefined // 讀取乙個未知的鍵,返回undefined
對於引用型別的鍵值,要特別小心
var map = new map();
map.set(['a'],666);
map.get(['a']); // undefined // ['a'] != ['a']
var k1 = ['b'], k2 = ['b']; // k1 != k2
map.set(k1,111).set(k2,222);
map.get(k1); // 111
map.get(k2); // 222
對於基本型別的值,只要兩個值全等,map將其視為乙個鍵,包括0和-0。另外,在map裡,nan等於自身
let map = new map();
map.set(nan,123);
map.get(nan); // 123
map.set(0,456);
map.get(-0); // 456
let map = new map([
[0,false],
[1,true]
]);for(let key of map.keys())
for(let val of map.values())
for(let item of map.entries())
for(let [key,val] of map.entries())
for(let [key,val] of map.entries())
map轉化為陣列,比較快速的方法是使用擴充套件運算子(...)
let map = new map([
[1,'one'],
[2,'two'],
[3,'three']
]);[...map.keys()]; // [1,2,3]
[...map.values()];// ['one','two','three']
[...map.entries()];// [[1,'one'], [2, 'two'], [3, 'three']]
[...map]; // [[1,'one'], [2, 'two'], [3, 'three']]
//陣列轉化為map直接將陣列傳入map的建構函式
new map([[1,'one'],[2,'two']]);
map本身沒有filter,map方法,可以使用陣列來實現
let map0 = new map()
.set(1,'a')
.set(2,'b')
.set(3,'c');
let map1 = new map(
[...map0].filter(([key,val]) => key < 3)
);let map2 = new map(
[...map0].map(([key,val]) => [key*2,val+'a'])
)
map的foreach方法,與陣列的foreach方法類似,可以實現遍歷
map.foreach(function(val,key,map),window)
map與物件互轉
//如果所有map的鍵都是字串,則可以轉為物件
function maptoobj(strmap);
for(let [key,val] of strmap);
return obj;
}let mymap = new map().set('yes', true).set('no', false);
maptoobj(mymap);
// //物件轉map
function objtomap(obj)
return map;
}objtomap();
// [ [ 'yes', true ], [ 'no', false ] ]
es6學習之Set和Map結構
set結構是類似於陣列結構,但是成員都是不重複的值 判斷不重複類似object.is 方法,但是 0和 0又是相同的處理,object.is 0,0 false 缺點是沒辦法像陣列一樣通過下標取值的方法.weekset結構和set相似,但是成員只能是物件,且物件是弱引用 成員中的物件不存在了,在本結...
ES6入門之set和map
es6提供了新的資料結構set。它類似於陣列,但是成員的值都是唯一的,沒有重複的值。set函式可以接受乙個陣列 或類似陣列的物件 作為引數,用來初始化。例一 var set new set 1,2,3,4,4 set 1,2,3,4 var s newset 2,3,5,4,5,2,2 map x ...
ES6入門之set和map
es6提供了新的資料結構set。它類似於陣列,但是成員的值都是唯一的,沒有重複的值。set函式可以接受乙個陣列 或類似陣列的物件 作為引數,用來初始化。例一 var set new set 1,2,3,4,4 set 1,2,3,4 var s new set 2,3,5,4,5,2,2 map x...