Set

Set 对象允许你存储任何类型的唯一值,无论是原始值或者是对象引用。

Set对象是值的集合,你可以按照插入的顺序迭代它的元素。 Set中的元素只会出现一次,即 Set 中的元素是唯一的。因为 Set 中的值总是唯一的,所以需要判断两个值是否相等。这和===操作符中使用的算法不同。对于 Set s,+0 (+0 严格相等于-0)和-0是不同的值。

另外,NaNundefined都可以被存储在Set 中, NaN之间被视为相同的值(NaN被认为是相同的,尽管 NaN !== NaN)。

 

Set()构造函数

Set()只能用new构建,否则会抛出TypeError。

语法:

1)new Set()

  不指定参数,那么新的Set为空。
2)new Set(iterable)

  如果可迭代对象为null,则新Set为空;  

  指定一个可迭代对象为参数,则所有元素会被不重复的添加到新的Set中。

const mySet1=new Set([1,2,3,4,5]);
console.log(mySet1);//Set(5) { 1, 2, 3, 4, 5 }

//将字符串直接转换
const mySet2=new Set("houdunren");
console.log(mySet2);//Set(7) { 'h', 'o', 'u', 'd', 'n', 'r', 'e' }

返回值:

一个新的Set对象。

 

静态属性

get Set[@@species]

构造函数用来创建派生对象.

实例属性

Set.prototype.size

返回 Set 对象中的值的个数,size的值是一个整数,表示Set对象有多少条目。size的集合访问函数是undefined; 你不能改变这个属性。
//Set.prototype.size()方法
const set1 = new Set();
const object1 = {};
//set.prototype.add()方法会往后添加元素
set1.add(42);
set1.add('forty two');
set1.add('forty two');//重复了,添加不进去
set1.add(object1);

console.log([...set1]);//[ 42, 'forty two', {} ]

console.log(set1.size);
// expected output: 3

实例方法

Set.prototype.add(value)

Set对象尾部添加一个元素。返回该Set对象。此方法可以链式调用,例如:mySet.add(5).add('some text')。重复的值不会被重复添加。
const mySet = new Set();

mySet.add(1);
mySet.add(5).add('some text'); // 可以链式调用

console.log(mySet);
// Set [1, 5, "some text"]

Set.prototype.clear()

移除Set对象内的所有元素。返回值是undefined。
const mySet = new Set();
mySet.add(1);
mySet.add("foo");
mySet.add("张三”);

console.log(mySet.size);       // 3
console.log(mySet.has("foo")); // true

mySet.clear();//清空所有

console.log(mySet.size);       // 0
console.log(mySet.has("foo")); // false

Set.prototype.delete(value)

移除Set中与这个值相等的元素,或者说从set对象中移除指定的(value)元素。成功删除返回 true,否则返回 false。
const mySet=new Set();
mySet.add({x:10, y:20}).add({x:20, y:30});

//删除Set对象中x>10的值
//使用Set.prototype.forEach()方法
mySet.forEach((item)=>{
    if(item.x>10){
        //使用Set.prototype.delete()方法删除当前元素
        mySet.delete(item);
    }
});

console.log(mySet);
console.log(mySet.size);
//增加一个元素,然后再删除它,返回的是true
mySet.add("foo");
let result1=mySet.delete("foo");
console.log(result1);//true

//删除一个不存在的元素,会返回false
let result2=mySet.delete("bar");
console.log(result2);//false

Set.prototype.has(value)

返回一个布尔值,表示该(value)值在Set中存在与否。
var mySet = new Set();
mySet.add('foo');

mySet.has('foo');  // 返回 true
mySet.has('bar');  // 返回 false

var set1 = new Set();
var obj1 = {'key1': 1};
set1.add(obj1);

set1.has(obj1);        // 返回 true
set1.has({'key1': 1}); // 会返回 false,因为其是另一个对象的引用
set1.add({'key1': 1}); // 现在 set1 中有2条(不同引用的)对象了

Set.prototype.entries()

entries() 方法返回一个新的迭代器对象 ,这个对象的元素是类似 [value, value] 形式的数组,value 是集合对象中的每个元素,迭代器对象元素的顺序即集合对象中元素插入的顺序。由于集合对象不像 Map 对象那样拥有 key,然而,为了与 Map 对象的 API 形式保持一致,故使得每一个 entry 的 key 和 value 都拥有相同的值,因而最终返回一个 [value, value] 形式的数组。
var mySet = new Set();
mySet.add("foobar");
mySet.add(1);
mySet.add("baz");

var setIter = mySet.entries();

console.log(setIter.next().value); // ["foobar", "foobar"]
console.log(setIter.next().value); // [1, 1]
console.log(setIter.next().value); // ["baz", "baz"]

  

Set.prototype.forEach(callbackFn[, thisArg])

按照插入顺序,为Set对象中的每一个值调用一次callBackFn,哪怕这个值是undefined。如果提供了thisArg参数,回调中的this就是这个参数。

回调函数有三个参数:

  • 元素的值
  • 元素的索引
  • 正在遍历的集合对象

但是由于集合对象中没有索引(keys),所以前两个参数都是Set中元素的值(values),之所以这样设计回调函数是为了和Map 以及Array的 forEach 函数用法保持一致。

如果提供了一个 thisArg 参数给 forEach 函数,则thisArg参数将会作为回调函数中的 this值。否则 this 值为 undefined。回调函数中 this 的绑定是根据函数被调用时通用的 this 绑定规则来决定的。

forEach 函数为集合对象中每个值都执行一次回调;它不会返回任何值。

function logSetElements(value1, value2, set) {
    console.log("s[" + value1 + "] = " + value2);
}

new Set(["foo", "bar", undefined]).forEach(logSetElements);

// logs:
// "s[foo] = foo"
// "s[bar] = bar"
// "s[undefined] = undefined"   

Set.prototype.values()

返回一个新的迭代器对象,该对象包含Set对象中的(按插入顺序排列的)所有元素的值。

Set.prototype.keys() (en-US)

  values()方法相同,返回一个新的迭代器对象,该对象包含Set对象中的(按插入顺序排列的)所有元素的值。

 

Set.prototype[@@iterator]()

返回一个新的迭代器对象,该对象包含Set对象中的按插入顺序排列的所有元素的值。
 

Set从Function继承了.apply(), .bind(), .call(), .toString()方法

posted on 2022-04-30 15:09  前端码牛  阅读(188)  评论(0编辑  收藏  举报

导航