JavaScript中Set和WeakS

JavaScript中Set和WeakS

创建Set实例的基本方法letset=newSet();//或newSet(null);g(set);或这样:

letset=newSet([1,2,3,4,4,4,4,4]);g(om(set));//输出:[1,2,3,4]可以看到,以上重复的4,在set里面只保存了一个,所以Set对象可以用来给数组去重;

Set也能用来保存NaN和undefined,如果有重复的NaN,Set会认为就一个NaN(实际上NaN!=NaN);

实例Set以后的对象具有这些属性和方法:

属性

ze

方法

d()ear()lete()tries()rEach()s()lues()ototype[

iterator]()

Set这类类型的数据结构其实我们可以直接用数组摹拟出来,虽然不能和原生的比,只能摹拟以上列表的一些方法和属性(还有一些功能没法实现的,Set实例的[ecies]指向自己,但是chrome中没有[ecies]这个玩艺儿….)

使用数组摹拟一个Set构造器htmlheadmetacharset="utf-8"/headbodyscript"usestrict";classSet{//对_set进行去重;staticrefresh(){let_this=this;let__set=[]this._rEach(function(obj){if(__dexOf(obj)===-1obj!=undefined){__sh(obj);}});_this._set=__set;ze=_this._ngth;}constructor(arg){ze=0;this[ecies]=this;this._set=Array(arg)arg[];ll(this)}add(obj){this._sh(obj);ll(this)returnthis;}clear(){this._ngth=0;returnthis;}delete(obj){if(this._dexOf(obj)!=-1){this._set[this._dexOf(obj)]=undefined;};ll(this);returnthis;}/***

desc*

returnEntries[[],[],[],[]]**/entries(){letresult=[];rEach(function(key,value){sh([key,value]);});returnresult;}has(){if(this._dexOf(obj)!=-1)returntrue;}keys(){returnthis[erator]();}values(){returnthis[erator]();}//直接使用数组的forEach方便啊;forEach(fn,context){let_this=this;this._rEach((value)=ll(contextvalue,value,value,_this));}//必须支持生成器的写法;*[erator](){letindex=0;letval=undefined;while(ze){val=this._set[index];yieldval;index++;}}}varset=newSet([0,0]);//对Set进行基本的操作;d(1).add(2).add(3).add({1:1})lete(1);d(1);//使用Set的forEach方法;rEach(function(key,value,s){g(key,value,s,"this")},{this:"this"})//检测生成器是不是正常运行;for(letsofset){g(s)}//由于这个对象有erator,所以使用扩大符也是好使的;g([...set]);/script/body/htmlSet实例的属性size属性:size是指这个Set的长度,和数组的length效果一样的”constructor属性:这个属性指向Set构造函数,这个代码便可实现(newSet).constructor===Set//输出:true

Set实例的方法add方法,往set添加数据;

om((newSet([1,2])).add(3));//输出:[1,2,3]/script

clear方法,把set里面的数据清空;

letset=(newSet([1,2,3,4]));ear();om(set);

delete方法,删除set里面的指定数据:

letset=(newSet([1,2,3,4]));lete(1);om(set);//输出:[2,3,4]

entries方法:

letset=(newSet([1,2,3,4]));om(tries());

forEach方法:set的forEach有两个参数,第一个参数为一个函数,第二个参数是非必须的,如果传了第二个参数,那末该函数的上下文this就是我们传的第二个参数:

scriptletset=(newSet([1,2,3,4]));rEach(function(){g(arguments);g(this)},"");/script

输出:

has方法,has是判断这个set是不是有指定的值,返回false或true;

scriptletset=(newSet([1,2,3,4]));g(s(1))//输出:true;g(s(5))//输出:false/script

keys方法和values()方法,这两个方法都是返回一个迭代器;

scriptletset=newSet([1,2,3,4]);g(ys());g(lues());varkeys=ys();for(letkeyofkeys){g(key);};/script

iterator()方法,

iterator方法是set默许的迭代器;

scriptletset=newSet([1,2,3,4]);letsetIner=set[erator]();g(xt().value)//输出:g(xt().value)//输出:g(xt().value)//输出:g(xt().value)//输出:4/script

实际上我们可以重写set[erator],但是不会对set的keys和values方法产生影响;

全部DEMO:

varmySet=newSet();//往mySet里面添加数据,1,d(1);d(5);d("sometext");//添加对象varo={a:1,b:2};d(o);s(1);//返回:s(3);//返回:s(5);//返回:s(rt(25));//返回:s("SomeText".toLowerCase());//t返回:s(o);//返回:ze;//lete(5);//从mySet里面删除s(5);//输出:false,5已被删除了ze;//现在的长度为:3//通过for...or循环获得数据;//输出:1,"sometext"for(letitemofmySet)g(item);//输出:1,"sometext"for(ys())g(item);//输出:1,"sometext"for(lues())g(item);//输出:1,"sometext",对Set来讲:key和value是一样的for(let[key,value]tries())g(key);//把迭代器转化为数组的第一种方式;varmyArr=[vfor(vofmySet)];//[1,"sometext"]//把迭代器转化为数组的第二种方式;varmyArr=om(mySet);//[1,"sometext"]//也可以用next()方法,手动去获得每个值;

Set的实际用途:

利用set可以方便的进行交集和并集:

求并集,我们可以给两个方案或更多:

varunion=(setA,setB)={//[...setA]这类方式目前只有babel才支持returnnewSeet([...setA,...setB]);};varunion=(setA,setB)={returnnewSet(om(setA).concat(om(setB)));}

这类获得交集的方式,和数组求交集差不多;

varintersect=(set1,set2)={//return[xfor(xofset1)if(s(x))];这类写法完全不行嘛....varresultSet=newSet();for(letsetofset1){if(s(set)){d(set);};};returnresultSet;};

以下这类代码更短,太酷了啊,这个方法来自:









































北京看白癜风哪家医院好点
有治好白癜风的患者吗



转载请注明:http://www.92nongye.com/txjg/1930.html