涓嶆槗鍐欙紝鏈粡浣滆€呰鍙紝绂佹浠ヤ换浣曞舰寮忚浆杞斤紒濡傛灉瑙夊緱鏂囩珷涓嶉敊锛屾杩庡叧娉ㄣ€佺偣璧炪€佸垎浜紒鎸佺画鍒嗕韩鎶€鏈崥鏂囷紝鍏虫敞寰俊鍏紬鍙佛煈夝煆诲墠绔帢閲戝師鏂嘩eakMap鍓嶇疆鐭ヨ瘑銆愭繁鍏ヨ瑙c€慗avaScriptGC鍨冨溇鍥炴敹鏈哄埗浠€涔堟槸WeakMap锛焀eakMap鏄敭鍜屽€肩殑缁勫悎銆俴ey鍙帴鍙楀璞★紝涓嶆帴鍙楀熀鏈被鍨嬨€傝鍊煎彲浠ユ槸浠讳綍绫诲瀷銆俿et(key,value)鏂规硶鍦╓eakMap涓缃竴缁勫叧鑱斿璞★紝杩斿洖WeakMap瀵硅薄get(key)杩斿洖key鐨勫叧鑱斿璞★紝涓嶅瓨鍦ㄥ垯杩斿洖undefinedhas(key)鏀惧洖涓€涓狟ooleanvaluedelete鏍规嵁鏄惁鏈塳ey鍏宠仈瀵硅薄(key)鍒犻櫎key鐨勫叧鑱斿璞★紝鐒跺悗鎵цhas(key)鏂规硶杩斿洖false鍜孧ap鏈変粈涔堝尯鍒紵Map鐨刱ey/value鍙互鏄换鎰忕被鍨嬨€俉eakMap鐨刱ey鍙兘鏄璞★紝value鍙互鏄换鎰忕被鍨嬨€俢onstname="LeBron";constperson={name:"LeBron",age:21,};letwk=newWeakMap();wk.set(person,"nice");console.log(wk.get(浜猴級锛?//nicewk.set(鍚嶇О,1);//TypeError:鐢ㄤ綔寮辨槧灏勯敭鐨勬棤鏁堝€糾ap=newMap();map.set(name,"JS");map.set(person,"nice");console.log(map.get(name));//JSconsole.log(map.get(person));//niceMap鐨刱ey/value鏄彲閬嶅巻鐨勶紝鍥犱负瀹冪殑key/value鏄繚瀛樺湪鏁扮粍涓殑銆俉eakMap娌℃湁瀛樺偍key/value鐨勬暟缁勶紝鎵€浠ユ棤娉曢亶鍘嗐€俢onstname="LeBron";constperson={name:"LeBron",age:21,};letwk=newWeakMap();wk.set(name,"JS");wk.set(person,"nice");console.log(wk.keys());//TypeError:wk.keys涓嶆槸鍑芥暟console.log(wk.values());//TypeError:wk.valuesisnotafunctionconsole.log(wk.entries());//TypeError:wk.entries涓嶆槸涓€涓猣unctionletmap=newMap();map.set(person,"nice");console.log(map.keys());//[MapIterator]{'LeBron',{name:'LeBron',age:21}}console.log(map.values());//[鍦板浘杩唬鍣╙{'JS','nice'}console.log(map.entries());//[MapEntries]{//['LeBron','JS'],//[{name:'LeBron',age:21},'nice']//}Mappairkey鐢ㄤ簬寮哄紩鐢紝鍗充娇key琚爣璁颁负null锛宬ey涓嶄細琚獹C锛屽洜涓轰粛鐒跺紩鐢ㄤ簡Map鐨刱ey/value鏁扮粍銆傚湪閿鏍囪涓簄ull涔嬪悗锛學eakMap瀵归敭杩涜寮卞紩鐢ㄣ€傚洜涓烘槸寮卞紩鐢紝娌℃湁key/value鏁扮粍寮曠敤锛屼笉褰卞搷key鐨凣C銆備互涓嬬▼搴忛渶瑕佹墜鍔ㄥ惎鍔℅C鏂规硶锛歯ode--expose-gcxxxMapfunctionmemmorySizeLogger(){global.gc();constused=process.memoryUsage().heapUsed;console.log((used/1024/1024).toFixed(2)+"M");}memmorySizeLogger();//1.79Mletperson={name:"LeBron",age:21,tmp:newArray(5*1024*1024),};memmorySizeLogger();//41.96Mletmap=newMap();memmorySizeLogger();//41.96Mmap.set(person,"nice");memmorySizeLogger();//41.96Mperson=null;memmorySizeLogger();//41.96MpersonhasnomemoryRecycled杩欑鎯呭喌濡傛灉鎯虫甯窯C锛岄渶瑕佹墽琛宮ap.delete(person)WeakMapfunctionmemorySizeLogger(){global.gc();constused=process.memoryUsage().heapUsed;console.log鍦ㄥ皢鍏舵爣璁颁负绌轰箣鍓?(used/1024/1024).toFixed(2)+"M");}memmorySizeLogger();//1.79Mletperson={name:"LeBron",age:21,tmp:newArray(5*1024*1024),};memmorySizeLogger();//41.96Mletwk=newWeakMap();memmorySizeLogger();//41.96Mwk.set(person,"nice");memmorySizeLogger();//41.96Mperson=null;memmorySizeLogger();//1.96Mperson鐨勫唴瀛樿鍥炴敹WhyWeakMap?JS涓殑MapAPI鍏变韩涓や釜鏁扮粍锛坘ey锛寁alue锛夈€傝缃殑閿拰鍊间細琚坊鍔犲埌涓や釜鏁扮粍鐨勬湯灏撅紝骞朵笖浼氬閿繘琛屽紩鐢ㄣ€備粠map涓彇鍊兼椂锛岄渶瑕侀亶鍘嗘墍鏈夌殑key锛岀劧鍚庨€氳繃绱㈠紩浠巚alue鏁扮粍涓幏鍙栧搴旂储寮曠殑鍊笺€傜己鐐逛竴锛氳祴鍊煎拰鏌ユ壘閮芥槸O(n)鐨勫鏉傚害缂虹偣浜岋細浣跨敤Map瀹规槗鍑虹幇鍐呭瓨娉勬紡锛屽洜涓烘暟缁勬€绘槸寮曠敤姣忎竴涓猭ey鍜寁alue锛屽鑷存甯窯C澶辫触銆俉eakMap瀵筴ey鍋氬急寮曠敤锛屼笉褰卞搷姝e父鐨凣Ckey锛岃GC鍚庡け鏁堛€傚鏋滄兂缁欏璞℃坊鍔犳暟鎹紝鍙堜笉鎯冲共鎵板瀮鍦惧洖鏀舵満鍒讹紝鍙互浣跨敤WeakMap銆傚鏋滈渶瑕侀亶鍘?杩唬锛岄渶瑕佷娇鐢∕ap搴旂敤鍦烘櫙淇濆瓨DOM鑺傜偣鏁版嵁璁剧疆锛坉om锛宎nyDomData锛夛紱console.log锛坉omData.get锛坉om锛夛級锛沝om.parentNode.removeChild(dom);dom=绌猴紱缂撳瓨鐩稿叧鏁版嵁letcache=newWeakMap();绫籋andleCache{get(key){if(cache.has(key)){returncache.get(key);}else{杩斿洖鏈畾涔夛紱}}set(key,value){cache.set(key,value)}delete(key){cache.delete(key)}}灏佽绉佹湁灞炴€etprivateData=newWeakMap();classPerson{constructor(name,age){privateData.set(this,{name,age});}getData(){杩斿洖privateData.get(this);}}WeakSet鍓嶇疆鐭ヨ瘑銆愮畝鍗曟潵璇淬€慗avaScriptGC鍨冨溇鍥炴敹鏈哄埗浠€涔堟槸WeakSetWeakSet瀵硅薄鏄竴涓璞″€肩殑闆嗗悎锛屾瘡涓璞″湪WeakSet闆嗗悎涓彧鑳藉嚭鐜颁竴娆°€傚畠鏄敮涓€鐨勬柟娉昦dd(value)鍚慦eakSet瀵硅薄娣诲姞鏂板厓绱爒aluedelete(value)鍦╓eakSet瀵硅薄涓垹闄alue鍏冪礌鍚庯紝has鏂规硶灏嗚繑鍥瀎alse銆俬as(value)杩斿洖涓€涓竷灏斿€硷紝琛ㄧず缁欏畾鐨勫€兼槸鍚﹀瓨鍦ㄤ簬杩欎釜WeakSet涓€傚拰Set鏈変粈涔堝尯鍒紵Set鐨勫€煎彲浠ユ槸浠绘剰鍊硷紝WeakSet鐨勫€煎彧鑳芥槸瀵硅薄銆俢onstname="鍕掑竷鏈?;21;constperson={name:"LeBron",age:21,};constws=newWeakSet();constset=newSet();set.add(name);set.add(age);set.娣诲姞锛堜汉锛夛紱ws.add(浜?;ws.add(鍚嶅瓧);//TypeError:weaksetws.add(age)涓娇鐢ㄧ殑鍊兼棤鏁堬紱//TypeError:InvalidvalueusedinweaksetSetistraversable,WeakSetcannotbetraverse.Set鏈変竴涓暟缁勫瓨鏀惧師濮嬪璞$殑鍊硷紝鎵€浠ュ彲浠ラ亶鍘嗐€俉eakSet娌℃湁瀛樺偍杩欐牱鐨勬暟缁勶紝鎵€浠ユ棤娉曢亶鍘嗐€俢onstname="鍕掑竷鏈?;甯搁噺骞撮緞=21锛沜onstperson={name:"LeBron",age:21,};constws=newWeakSet();constset=newSet();set.add(name);set.add(age);set.add(person);console.log(set.values());//{'LeBron',21,{name:'LeBron',age:21}}ws.add(person);ws.add(name);ws.add(骞撮緞);console.log(set.values());//TypeError:ws.valuesisnotafunctionSet褰卞搷GC锛學eakSet涓嶅奖鍝嶄互涓嬮渶瑕佹墜鍔℅C鍚姩鏂规硶鐨勭▼搴忥細node--expose-gcxxxSet瀛樺湪values鏁扮粍锛屽師鍊兼寚鍚戝悗null锛寁alues鏁扮粍浠嶇劧瀵箆alue鐨勫€兼湁寮哄紩鐢紝褰卞搷姝e父鐨凣C鍑芥暟memorySizeLogger(){global.gc();constused=process.memoryUsage().heapUsed;console.log((used/1024/1024).toFixed(2)+"M");}memmorySizeLogger();//1.79Mletperson={name:"LeBron",age:21,tmp:newArray(5*1024*1024),};memmorySizeLogger();//41.96Mconstset=newSet();set.add(person);memmorySizeLogger();//41.96Mperson=null;memmorySizeLogger();//41.96MWeakSet涓病鏈夎繖涓暟缁勶紝鎵€浠ヤ笉褰卞搷姝e父鐨凣C鍑芥暟memorySizeLogger(){global.gc();浣跨敤鐨勫父閲?process.memoryUsage()銆傚爢鐢ㄨ繃锛沜onsole.log((used/1024/1024).toFixed(2)+"M");}memmorySizeLogger();//1.79Mletperson={name:"LeBron",age:21,tmp:newArray(5*1024*1024),};memmorySizeLogger();//41.96Mconstws=newWeakSet();ws.add(person);memmorySizeLogger();//41.96Mperson=null;memmorySizeLogger();//1.96M搴旂敤鍦烘櫙妫€娴嬪惊鐜紩鐢ㄩ€掑綊璋冪敤鑷韩鐨勫嚱鏁伴渶瑕佷竴绉嶆柟娉曟潵澶勭悊寰幆鏁版嵁缁撴瀯锛岄€氳繃璺熻釜鍝簺瀵硅薄琚鐞嗚繃//瀵逛紶鍏ョ殑涓讳綋瀵硅薄鍑芥暟鐨勬墍鏈夊唴閮ㄥ瓨鍌ㄦ墽琛屽洖璋僥xecRecursively(fn,subject,_refs=null){濡傛灉(!_refs)_refs=鏂板急闆嗭紙锛夛紱//閬垮厤鏃犻檺閫掑綊if(_refs.has(subject))return;fn(涓婚);if("object"===typeofsubject){_refs.add(subject);for(letkeyinsubject)execRecursively(fn,subject[key],_refs);}}constfoo={foo:"Foo",bar:{bar:"Bar"}};foo.bar.baz=foo;//寰幆寮曠敤!execRecursively(obj=>console.log(obj),foo);ReflectReflect缈昏瘧杩囨潵灏辨槸鍙嶅皠锛屽畠鏄竴涓唴缃殑鏂扮殑鍏ㄥ眬瀵硅薄锛屽畠鎻愪緵浜嗘嫤鎴狫avaScript鎿嶄綔鐨勬柟娉曘€傝繖浜涙柟娉曚笌浠g悊澶勭悊绋嬪簭鐨勬柟娉曠浉鍚屻€俁eflect涓嶆槸涓€涓嚱鏁板璞★紝鑰屾槸涓€涓被浼糓ath鐨勯潤鎬佸伐鍏峰嚱鏁帮紝鎵€浠ユ槸Reflect鐨勪竴涓笉鍙瀯閫犵殑闈欐€佹柟娉曪紝鍏蜂綋浣跨敤鍙傝€冿細ReflectMDN鏂囨。Reflect.apply()Reflect.construct()Reflect.defineProperty()鍙嶆槧銆俤eleteProperty()Reflect.get()Reflect.getOwnPropertyDescriptor()Reflect.getPrototypeOf()Reflect.has()Reflect.isExtensible()Reflect.ownKeys()Reflect.preventExtensions()Reflect.set()Reflect.setPrototypeOf()杩欎簺鏂规硶鏂规硶鐨勫悕绉颁笌Proxyhandler鐨勫悕绉扮浉鍚岋紝鍏朵腑涓€浜涙柟娉曚笌Object鐨勬柟娉曠浉鍚岋紝灏界涓よ€呬箣闂村瓨鍦ㄤ竴浜涚粏寰樊鍒€傛湁浠€涔堜笉鍚岋紵Reflect鐨勯潤鎬佹柟娉曚細涓虹浉搴旂殑鎿嶄綔杩斿洖涓€涓竷灏斿€笺€傚鏋滄搷浣滄垚鍔燂紝鍒欒繑鍥瀟rue銆傚鏋滄搷浣滃け璐ワ紝鍒欒繑鍥瀎alse銆傚皢甯歌鐨勫懡浠ゅ紡鎿嶄綔杞崲涓哄嚱鏁板紡鎿嶄綔锛岀紪绋嬫柟寮忓姞鍏ュ厓缂栫▼銆傛瘮濡傚垹闄ゃ€佽祴鍊笺€佸垽鏂瓑鍛戒护寮忔搷浣滃け璐ヤ竴鑸兘浼氭姤閿欙紝鑰孯eflect涓嶄細锛岃繑鍥炰竴涓竷灏斿€煎垽鏂槸鍚︽垚鍔熴€傚唴缃璞′腑宸茬粡鏈変竴浜涘弽灏凙PI锛孯eflect瀵瑰畠浠繘琛岃仛鍚堝拰浼樺寲銆備粈涔堟槸鍏冪紪绋嬶紵鍏冪紪绋嬫槸瀵圭紪绋嬭瑷€杩涜缂栫▼銆傛瘮濡侾roxy瀵硅薄鍙互浣滀负浠g悊锛屾嫤鎴猤et鍜宻et鎿嶄綔锛屼綘鍦ㄧ▼搴忎腑鎷垮埌鐨勫氨鏄綘缂栫▼鍚庣殑鍊笺€俁eflect鏄竴绉嶅弽灏勩€傚畠鍦ㄥ鐞嗗悗璋冪敤姣忎釜鍐呯疆瀵硅薄鐨勬柟娉曘€傛墍浠ユ瘡涓唴缃璞$殑鏂规硶鏀瑰彉鍚庯紝Reflect璋冪敤鐨勬柟娉曚篃闅忎箣鏀瑰彉銆傜被浼间簬灏佽涓€灞俁eflect鏉ヤ紭鍖栧懡鍚嶇┖闂寸殑浼樼偣銆備綘浼氬彂鐜癑S鍐呯疆鐨勫弽灏勬柟娉曟暎钀戒竴鍦帮紝Reflect灏嗗畠浠粍缁囧緱寰堝ソ銆傚寮轰唬鐮佺殑鍋ュ.鎬т娇鐢≧eflect杩涜鎿嶄綔涓嶅鏄撴姏鍑哄紓甯革紝绾跨▼闃诲锛岃浠g爜杩愯璧锋潵鏇村姞鍋ュ.銆備负浠€涔堜笉鐩存帴鎸傚湪Object涓婂憿锛熷弽灏勫璞′笉浠呬粎閽堝Object锛岃繕閽堝apply绛夊姛鑳姐€傝皟鐢∣bject.apply(myFunc)寰堝鎬€備娇鐢ㄥ崟涓璞′繚瀛樺唴缃柟娉曞彲浠ヤ繚璇丣avaScript浠g爜涓叾浠栧璞$殑绾噣鎬э紝姣旂洿鎺ュ弽灏勬寕杞藉埌鏋勯€犲嚱鏁版垨鍘熷瀷瑕佸ソ浜庣洿鎺ヤ娇鐢ㄥ叏灞€鍙橀噺锛屾墍浠S浼氳秺鏉ヨ秺澶氬叧閿瓧銆傛帢閲戝師鏂囨帢閲戯細鍓嶇鍕掑竷鏈楃煡涔庯細鍓嶇鍕掑竷鏈楁妧鏈崥鏂囨寔缁垎浜紝鍏虫敞寰俊鍏紬鍙佛煈夝煆诲墠绔嫆甯冩湕
