当前位置: 首页 > Web前端 > HTML

【JavaScript周报#523】NullVSUndefined

时间:2023-03-27 22:52:03 HTML

馃コ娆㈣繋鏈夊叴瓒g殑鏈嬪弸锛屼竴璧锋潵鍋氱偣鏈夋剰涔夌殑浜嬪惂锛佹湰鏂囪瘧鑰咃細chressYu鎴戞帹鍑轰簡涓€涓瘡鍛ㄧ炕璇戦」鐩紝浠撳簱鍦板潃锛岃闂湴鍧€杩樻槸寰堢己蹇楀悓閬撳悎鐨勬湅鍙嬶紝绾睘涓汉鍏磋叮锛屽綋鐒朵篃鏈夊姪浜庢彁楂樿嫳璇拰鍓嶇鎶€鑳斤紝瑕佹眰锛氳嫳璇笉宸璋憋紝鐔熺粌浣跨敤github锛屾墽鐫€锛岃唉閫婏紝瀵硅嚜宸辨墍鍋氱殑浜嬭礋璐c€傛兂鍙備笌鐨勬湅鍙嬪彲浠ョ淇x鎴栬€呯粰浠撳簱鍙慽ssue娑堟伅銆傛垜鐨勫崥瀹篃鏈夊叿浣撶殑涓汉鑱旂郴鏂瑰紡锛歞aodaolee.cn澶у鏁扮紪绋嬭瑷€閮芥湁鈥滅┖鍊尖€濈殑瀹氫箟锛屼篃灏辨槸null銆傚畠琛ㄧず璇ュ彉閲忓綋鍓嶆湭鎸囧悜瀵硅薄鈥斺€斾緥濡傦紝褰撳畠灏氭湭鍒濆鍖栨椂銆備笌鍏朵粬璇█鐩告瘮锛孞avaScript鍖呭惈涓や釜杩欐牱鐨勭┖鍊硷細undefined鍜宯ull銆傚湪鏈枃涓紝鎴戜滑灏嗘帰璁ㄥ畠浠箣闂寸殑宸紓锛屼互鍙婂浣曟渶濂藉湴浣跨敤鎴栭伩鍏嶅畠浠€倁ndefined鍜宯ull杩欎袱涓€奸潪甯哥浉浼硷紝鍙互浜掓崲浣跨敤銆傛墍浠ヤ粬浠殑鍖哄埆闈炲父寰銆侲CMAScript涓璾ndefined鍜宯ull鐨勫畾涔夛細ECMAScript涓璾ndefined鍜宯ull鐨勫畾涔夊涓嬶細undefined锛氬綋涓€涓彉閲忔病鏈夎璧嬪€兼椂銆俷ull锛氫笉浠h〃浠讳綍瀵硅薄锛涚◢鍚庢垜浠皢鐪嬪埌浣滀负绋嬪簭鍛樺浣曟渶濂藉湴澶勭悊杩欎袱涓€笺€備袱涓┖鍊?涓€涓笉鍙垹闄ょ殑閿欒鍏锋湁涓や釜绌哄€肩殑Javascript鐩村埌鐜板湪閮借璁や负鏄竴涓碂绯曠殑璁捐锛堝嵆浣挎槸JavaScript鐨勫垱寤鸿€匓rendanEich锛夈€傞偅涔堜负浠€涔堜笉浠庝腑鍒犻櫎涓€涓憿锛烰avaScript鐨勬牳蹇冨師鍒欐槸姘镐笉鐮村潖鍚戝悗鍏煎鎬с€傝繖涓師鍒欐湁寰堝濂藉銆備絾瀹冩渶澶х殑缂虹偣鏄笉鑳藉幓闄ら敊璇殑璁捐銆倁ndefined鍜宯ull鐨勫巻鍙插湪Java涓紙瀵笿avaScript鏈夊緢澶氬惎鍙戯級锛屽垵濮嬪寲鍊煎彇鍐充簬鍙橀噺鐨勯潤鎬佺被鍨嬶細鍒濆鍖栨椂鍖呭惈null瀵硅薄銆備换浣曞熀纭€绫诲瀷閮藉寘鍚畠鍒濆鍖栫殑鍊笺€備緥濡傦細int绫诲瀷琚垵濮嬪寲涓?銆傚湪JavaScript涓紝姣忎釜鍙橀噺閮藉彲浠ュ寘鍚璞″€煎拰榛樿鍊笺€傚洜姝わ紝濡傛灉null琛ㄧず鈥滀笉鏄璞♀€濓紝鍒橨avaScript闇€瑕佷竴涓〃绀衡€滄棦涓嶆槸瀵硅薄涔熶笉鏄垵濮嬪寲鍊尖€濈殑鍒濆鍊笺€傝鍩哄€兼湭瀹氫箟銆倁ndefined鏄浣曚骇鐢熺殑濡傛灉涓€涓彉閲弇yVar娌℃湁鍒濆鍖栦竴涓€硷紝閭d箞瀹冪殑鍊煎氨鏄痷ndefined锛歭etmyVar;assert.equal(myVar,undefined);濡傛灉瀵硅薄涓病鏈塽nknownProp灞炴€э紝璁块棶璇ュ睘鎬ф椂浼氫骇鐢焨ndefined:constobj={};assert.equal(obj.unknownProp,undefined);濡傛灉涓€涓嚱鏁版病鏈夋槑纭殑杩斿洖鍊硷紝閭d箞杩欎釜鍑芥暟灏变細杩斿洖undefined锛歠unctionmyFunc(){}assert.equal(myFunc(),undefined);濡傛灉涓€涓嚱鏁扮殑杩斿洖娌℃湁杩斿洖浠讳綍鍊硷紝閭d箞浠栧氨浼氳繑鍥炴湭瀹氫箟锛氬嚱鏁癿yFunc(){return;}assert.equal(myFunc(),undefined);濡傛灉鍑芥暟鐨勫舰鍙倄鍦ㄨ皟鐢ㄦ椂琚渷鐣ワ紝閭d箞瀹冨氨鏄湭瀹氫箟鐨勶細functionmyFunc(x){assert.equal(x,undefined);}myFunc();濡傛灉涓€涓彉閲忔槸undefined鎴杗ull锛屽綋鐢╟hain:undefined?璋冪敤ojb?someProp鏃跺畠浼氳繑鍥瀠ndefined锛?someProp//undefinednull?.someProp//undefinednull鏄浣曚骇鐢熺殑瀵硅薄鐨勫師鍨嬭涔堟槸瀵硅薄锛岃涔堟槸鍘熷瀷閾炬湯灏剧殑null銆侾rototype娌℃湁鍘熷瀷锛歄bject.getPrototypeOf(Object.prototype)//null濡傛灉鎴戜滑浼犻€掍竴涓鍒欒〃杈惧紡/a/锛屼娇鐢ㄨ繖涓鍒欒〃杈惧紡鏉ュ尮閰嶅瓧绗︿覆'x'锛屽鏋滃尮閰嶅け璐ワ紝瀹冧細杩斿洖涓€涓猲ull锛?a/.exec('x')//null璋冪敤JSON.stringify鏃讹紝JSON鍙敮鎸乶ull锛屼笉鏀寔undefinedJSON.stringify({a:undefined,b:null})//'{"b":null}'undefined鍜宯ullundefined浠ュ強鍙傛暟榛樿鍊煎浣曞鐞嗗弬鏁伴粯璁ゅ€肩敤浜庯細鍙傛暟缂哄け鏃讹紝鍏ュ弬鏈畾涔変緥濡傦細functionmyFunc(arg='abc'){returnarg;}assert.equal(myFunc('hello'),'hello');assert.equal(myFunc(),'abc');assert.equal(myFunc(undefined),'abc');undefined涔熷彲浠ヨЕ鍙戝舰寮忓弬鏁颁娇鐢ㄩ粯璁ゅ€笺€備互涓嬬ず渚嬫樉绀轰簡瀹冪殑鐢ㄥ锛歠unctionconcat(str1='',str2=''){returnstr1+str2;}functiontwice(str){//(A)returnconcat(str,str);}鍦ˋ琛屼腑锛屾垜浠病鏈変负str鎸囧畾鍙傛暟榛樿鍊笺€傚綋缂哄皯姝ゅ弬鏁版椂锛宼wice鍑芥暟灏嗕娇鐢ㄩ粯璁ゅ€笺€倁ndefined鍜宒estructuringdefaultvalues鍦ㄨВ鏋勬椂琚祴浜堢被浼间簬鍑芥暟榛樿鍊肩殑榛樿鍊笺€傚鏋滃彉閲忓湪瑙f瀯杩囩▼涓病鏈夊尮閰嶅埌鎴栬€呭尮閰嶅埌undefined锛岄偅涔堝畠浼氶噰鐢ㄩ粯璁ゅ€硷細const[a='a']=[];assert.equal(a,'a');const[b='b']=[undefined];assert.equal(b,'b');const{prop:c='c'}={};assert.equal(c,'c');const{prop:d='d'}={prop:undefined};assert.equal(d,'d');undefined,null鍜宱ptionalchaining褰撲娇鐢∣ptional閾炬帴value?.prop鏃讹細濡傛灉value鏄痷ndefined鎴杗ull锛屽垯杩斿洖undefined锛岃繖鏄痸alue.prop鎶涘嚭寮傚父鏃跺彂鐢熺殑鎯呭喌銆傚惁鍒欙紝杩斿洖value.prop銆俧unctiongetProp(value){//鍙€夌殑闈欐€佸睘鎬ц闂繑鍥炲€?.prop;}assert.equal(getProp({prop:123}),123);assert.equal(getProp(undefined),undefined);assert.equal锛坓etProp锛堢┖锛夛紝鏈畾涔夛級锛涗互涓嬫搷浣滅被浼硷細obj?.[芦expr禄]//鍙€夊姩鎬佸睘鎬ccessfunc?.(芦arg0禄,芦arg1禄)//鍙€夊嚱鏁版垨鏂规硶璋冪敤undefined,null鍜岀┖鍚堝苟杩愮畻绗henullmergeroperator锛燂紵灏辨槸璁╂垜浠湪閬囧埌undefined鍜宯ull鐨勬椂鍊欎娇鐢ㄩ粯璁ゅ€硷細undefined??'榛樿鍊?//'榛樿鍊?null??'榛樿鍊?//'榛樿鍊?0??'榛樿鍊?//0123??'榛樿鍊?//123''??'榛樿鍊?//'''abc'??'defaultvalue'//'abc'logicalemptyAssignment??=灏唍ullconsolidator鍜宎ssignment缁勫悎鍦ㄤ竴璧凤細functionsetName(obj){obj.name??='(Unnamed)';returnobj;}assert.deepEqual(setName({}),{name:'(Unnamed)'});assert.deepEqual(setName({name:undefined}),{name:'(Unnamed)'});assert.deepEqual(setName({name:null}),{name:'(Unnamed)'});assert.deepEqual(setName({name:'Jane'}),{name:'Jane'});濡備綍澶勭悊null鍜寀ndefined涓嬮潰鍑犺妭璁茶В濡備綍鍦ㄦ垜浠嚜宸辩殑浠g爜涓鐞唘ndefined鍜寀ndefinednull鏈€甯哥敤鐨勬柟娉曟棦涓嶆槸鏈畾涔夌殑锛屼篃涓嶆槸浣滀负瀹為檯鍊肩殑null銆備緥濡傦紝鎴戜滑鍙兘甯屾湜灞炴€ile.title濮嬬粓瀛樺湪骞朵笖濮嬬粓鏄竴涓瓧绗︿覆銆傛湁涓ょ甯歌鐨勬柟娉曞彲浠ュ疄鐜拌繖涓€鐐广€傝娉ㄦ剰锛屽湪杩欑瘒鍗氭枃涓紝鎴戜滑鍙€冭檻undefined鍜宯ull锛岃€屼笉鑰冭檻鍊兼槸鍚︿负瀛楃涓层€傛偍蹇呴』鑷鍐冲畾鏄惁灏嗘浣滀负闄勫姞瀹夊叏鎺柦瀹炴柦銆倁ndefined鍜宯ull閮借绂佹銆備緥濡傦細functioncreateFile(title){if(title===undefined||title===null){thrownewError('`title`涓嶈兘涓虹┖');}//路路路}涓轰粈涔堥€夋嫨杩欑鏂瑰紡锛熸垜浠笇鏈涘悓浜嬪鐞唘ndefined鍜宯ull锛屾墍浠ユ垜浠粡甯歌繖鏍峰啓锛屼緥濡傦細//Detectingifapropertyexistsif(!obj.requiredProp){obj.requiredProp=123;}//DefaultvaluesvianullishcoalescingoperatorconstmyValue=myParameter?锛?涓€浜涢粯璁?;濡傛灉鎴戜滑鐨勪唬鐮佸洜涓簎ndefined鍜宯ull瀵艰嚧浜嗕竴浜涢棶棰橈紝鎴戜滑甯屾湜浠栧敖蹇姏鍑恒€傚綋閬囧埌undefined鍜宯ull鏃讹紝瑙﹀彂榛樿鍊笺€備緥濡傦細functioncreateFile(title){title??='(Untitled)';//路路路}鎴戜滑杩欓噷涓嶈兘浣跨敤鍑芥暟鐨勯粯璁ゅ€硷紝鍥犱负瀹冨彧鑳界敱undefined瑙﹀彂锛屾墍浠ユ垜浠繖閲屼娇鐢ㄧ┖鍊糓ergeoperator??=涓轰粈涔堣閫夋嫨杩欑鏂瑰紡鍛紵鎴戜滑甯屾湜瀵箄ndefined鍜宯ull鐨勫鐞嗕繚鎸佷竴鑷淬€傛垜浠笇鏈涙垜浠殑浠g爜鑳藉鍑嗙‘鍦板鐞唘ndefined鍜宯ull銆傛湭瀹氫箟鎴杗ull琛ㄧず绌哄€笺€備緥濡傦紝鎴戜滑鍙兘甯屾湜灞炴€ile.title鏄竴涓瓧绗︿覆鎴栦竴涓┖鍊硷紙鏂囦欢娌℃湁title灞炴€э級銆傛湁鍑犵鏂规硶鍙互瀹炵幇杩欎竴鐐广€傝繖閲宯ull鐢ㄤ簬琛ㄧず绌哄€笺€備緥濡傦細functioncreateFile(title){if(title===undefined){thrownewError(''title'mustnotbeundefined');}return{title};}鎴杣ndefined瑙﹀彂榛樿鍊硷細functioncreateFile(title='(Untitled)'){return{title};}涓轰粈涔堥€夋嫨杩欑鏂瑰紡锛氭垜浠渶瑕佷竴涓┖鍊兼潵琛ㄧず娌℃湁鎴戜滑涓嶆兂瑕乶ull瑙﹀彂鍙傛暟榛樿鍊煎拰瑙f瀯榛樿鍊笺€傛垜浠笇鏈涘皢绌哄€煎瓧绗︿覆鍖栦负JSON锛堝洜姝や笉鑳戒娇鐢╱ndefined锛夈€倁ndefined琛ㄧず涓€涓┖鍊间緥濡傦細functioncreateFile(title){if(title===null){thrownewError('`title`mustnotbenull');}return{title};}涓轰粈涔堥€夋嫨杩欑鏂瑰紡锛氭垜浠渶瑕佷竴涓┖鍊兼潵琛ㄧず鍚︼紝鎴戜滑纭疄甯屾湜绌哄€艰Е鍙戝弬鏁伴粯璁ゅ€煎拰瑙f瀯榛樿鍊笺€倁ndefined鐨勪竴涓己鐐规槸瀹冮€氬父鏄敱JavaScript鏃犳剰鍒涘缓鐨勶細鐢辨湭鍒濆鍖栫殑鍙橀噺銆佸睘鎬у悕绉颁腑鐨勬嫾鍐欓敊璇€佸繕璁颁粠鍑芥暟杩斿洖鏌愪簺鍐呭绛夈€備负浠€涔堜笉鑳藉悓鏃朵娇鐢╱ndefined鍜宯ull锛熷綋鏀跺埌涓€涓€兼椂锛屽皢undefined鍜宯ull閮借涓衡€滅┖鍊尖€濇槸鏈夋剰涔夌殑銆傚洜涓猴紝褰撴垜浠垱寤轰竴涓€肩殑鏃跺€欙紝鎴戜滑甯屾湜鏄樉寮忕殑锛岃繖鏍锋垜浠彲浠ユ柟渚垮湴澶勭悊杩欎釜鍊笺€傚綋鎴戜滑涓嶆兂浣跨敤undefined鎴杗ull鏉ヨ〃绀虹┖鍊兼椂锛屾垜浠簲璇ユ€庝箞鍋氬憿锛熻寰€涓嬬湅锛佽〃绀虹┖鍊肩殑鍏朵粬鏂瑰紡鐗瑰埆鏄竴涓€兼垜浠彲浠ュ垱寤轰竴涓壒娈婄殑鍊兼潵琛ㄧず.title涓虹┖锛歝onstUNTITLED=Symbol('UNTITLED');const鏂囦欢={鏍囬锛氭棤鏍囬锛寎锛沞mptyobjectpatternempty瀵硅薄妯″紡鏉ヨ嚜闈㈠悜瀵硅薄缂栫▼锛氬叕鍏辩被閮界户鎵跨浉鍚岀殑鎺ュ彛銆傛瘡涓瓙绫诲疄鐜板疄渚嬭繍琛岀殑涓嶅悓妯″紡銆傚叾涓竴绉嶆ā寮忔槸鈥滅┖鈥濄€傚湪涓嬮潰鐨勭ず渚嬩腑锛孶ntitledFile瀹炵幇浜嗏€渘ull鈥濇ā寮忋€?/鎶借薄瓒呯被File{constructor(content){if(new.target===File){thrownewError('涓嶈兘瀹炰緥鍖栬繖涓被');}this.content=鍐呭锛泒}classTitledFileextendsFile{constructor(content,title){super(content);this.title=鏍囬锛泒getTitle(){杩斿洖杩欎釜鏍囬锛泒}classUntitledFileextendsFile{constructor(content){super(content);}getTitle(){return'(Untitled)';}}constfiles=[newTitledFile('浜茬埍鐨勬棩璁帮紒','鎴戠殑鏃ヨ'),newUntitledFile('鎻愰啋锛氶€夋嫨涓€涓爣棰橈紒'),];assert.deepEqual(files.map(f=>f.getTitle()),['鎴戠殑鏃ヨ','(鏃犻)',]);鎴戜滑涔熷彲浠ュ彧浣跨敤绌哄璞℃ā寮廎ile鏉ュ鐞唗itle灞炴€э紙鑰屼笉鏄鐞嗘暣涓枃浠跺璞★級銆傚彲鑳界殑绫诲瀷鍐欏嚭鎵€鏈夊彲鑳界殑绫诲瀷鏉ュ鐞嗛棶棰橈細functiongetTitle(file){switch(file.title.kind){case'just':returnfile.title.value;case'nothing':return'(Untitled)';榛樿鍊硷細鎶涘嚭鏂扮殑閿欒锛堬級锛泒}constfiles=[{title:{kind:'just',value:'MyDiary'},content:'浜茬埍鐨勬棩璁帮紒',},{title:{kind:'nothing'},content:'鎻愰啋锛氶€夋嫨涓€涓爣棰橈紒',},];assert.deepEqual(files.map(f=>getTitle(f)),['MyDiary','(Untitled)',]);鎴戜滑鍙互閫氳繃涓€涓暟缁勬潵缂栫爜鈥渏ust鈥濆拰鈥渘othing鈥濄€傛垜浠殑鏂规硶鐨勫ソ澶勫湪浜庡畠寰楀埌浜員ypeScript鐨勮壇濂芥敮鎸併€傜浉鍏抽摼鎺ュ師鏂囧湴鍧€锛歶ndefinedvs.null閲嶈鍘熺炕璇戣鍒?/p>