Set遍历操作:
- keys():返回键名的遍历器
- values(): 返回健值对的遍历器
- entries():返回键值对的遍历器
- forEach(): 每个成员
Set属性
-
Set.length 属性length的值为0。
-
Set.prototype 表示Set构造器的原型。允许向所有Set对象添加新的属性。
Set实例
所有Set对象的实例都会继承Set.prototype。
-
Set.prototype.constructor 返回创建给set实例的构造函数,默认是Set函数。
-
Set.prototype.size 返回Set对象的键值对的数量。
var sset = new Set([‘one‘, ‘two‘, ‘three‘]);
console.log(sset.constructor); //function Set() { [native code] }
console.log(sset.size); //3
Set方法
//创建Set实例
//1.
var sset = new Set();
sset.add(‘one‘);
sset.add(‘two‘);
sset.add(‘three‘);
//2.
var sset= new Set([‘one‘, ‘two‘, ‘three‘]);
1.Set.prototype.add(value) 在Set对象尾部添加一个元素。返回该Set对象。
sset.add(‘four‘);
console.log(sset); //Set {"one", "two", "three", "four"}
2.Set.prototype.clear() 移除Set对象内的所有元素。
sset.clear();
console.log(sset.size); //0
3.Set.prototype.delete(value) 移除Set的中与这个值相等的元素,返回Set.prototype.has(value)在这个操作前会返回的值(即如果该元素存在,返回true,否则返回false)。Set.prototype.has(value)在此后会返回false。
console.log(sset.has(‘one‘)); //true
sset.delete(‘one‘);
console.log(sset.has(‘one‘)); //false
4.Set.prototype.entries() 返回一个新的迭代器对象,该对象包含Set对象中的按插入顺序排列的所有元素的值的[value, value]数组。为了使这个方法和Map对象保持相似, 每个值的键和值相等。
5.Set.prototype.forEach(callbackFn[, thisArg]) 按照插入顺序,为Set对象中的每一个值调用一次callBackFn。如果提供了thisArg参数,回调中的this会是这个参数。
sset.forEach(function(value, key, setObj) {
console.log(value + ‘---‘ + key + ‘---‘ + setObj);
//value - Set对象里每一个键值对的值
//key - Set对象里每一个键值对的键 === 值
//mapObj - Set对象本身
console.log(this); //this === window
});
sset.forEach(function(value, key, setObj) {
console.log(value + ‘---‘ + key + ‘---‘ + setObj);
console.log(this); //this === sset
}, sset)
6.Set.prototype.has(value) 返回一个布尔值,表示Map实例是否包含键对应的值。
sset.has(‘one‘); // true
sset.has(‘fivr‘); //false
7.Set.prototype.keys() 与values()方法相同,返回一个新的迭代器对象,该对象包含Set对象中的按插入顺序排列的所有元素的值。
sset.keys(); //SetIterator {"one", "two", "three"}
8.Set.prototype.values() 返回一个新的Iterator对象,它按插入顺序包含了Map对象中每个元素的值。
sset.values(); //SetIterator {"one", "two", "three"}
使用for..of方法迭代映射
var sset = new Set();
sset.add(1);
sset.add(2);
for (var value of sset) {
console.log(value);
}
// 1 2
for (var key of sset.keys()) {
console.log(key);
}
// 1 2
for (var value of sset.values()) {
console.log(value);
}
// 1 2
Set 与 Array
var myArray = ["value1", "value2", "value3"]; // 用Set构造器将Array转换为Set var mySet = new Set(myArray); mySet.has("value1"); // returns true // 用...(展开操作符)操作符将Set转换为Array console.log([...mySet]); // 与myArray完全一致
Array.from方法可以将Set结构转换为数组。
var items = new Set([1, 2, 3, 4, 5]); var array = Array.from( items );
这也提供了一种除去数组中重复元素的方法。
function dedupe( array ) { return Array.from( new Set(array) ); }
或者如下写也可以,比较简单的数组去重
[...new Set([1,3,4,5,1,2,3,3,4,8,90,3,0,5,4,0])]
Set 注意
1、var sset = new Set(‘one‘, ‘two‘, ‘three‘); //这样的错误的
2、值的相等规则:NaN 是与NaN是相同的(虽然NaN !== NaN),除此之外所有的值都根据‘===‘判断。
var sset= new Set(); sset.add(Number(‘aa111‘)); sset.add(Number(‘bb222‘)); sset.add(‘cc333‘)); //Set {NaN, "cc333"}
3、向Set加入值的时候,不会发生类型转换。这意味着,在Set中5和”5”是两个不同的值。
weakset对象
WeakSet结构与Set类似,也是不重复的值的集合。
WeakSet和Set的区别:
- 1.WeakSet的成员只能是对象,而不能是其他类型的值
- 2.WeakSet中的对象都是弱引用,即垃圾回收机制不考虑WeakSet对该对象的引用,也就是说,如果其他对象都不再引用该对象,那么垃圾回收机制会自动回收该对象所占用的内存,不考虑该对象还存在于WeakSet之中。这个特点意味着,无法引用WeakSet的成员,因此WeakSet是不可遍历的。
WeakSet结构的三个方法
add
delete
has
WeakSet的一个用处是储存DOM节点,而不用担心这些节点会从文档中移除时,会引发内存泄露。