cainiaoblog 23.2.348 → 23.2.349
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/{app/manual.html → manual.html} +1 -1
- package/package.json +1 -1
- package/CNAME +0 -1
- package/MP_verify_o6dHCK5mIkxNpzvZ.txt +0 -1
- package/README.md +0 -8
- package/about/index.html +0 -55
- package/ads.txt +0 -1
- package/archives/2018/index.html +0 -48
- package/archives/2019/index.html +0 -48
- package/archives/2019/page/2/index.html +0 -48
- package/archives/2020/index.html +0 -48
- package/archives/2021/index.html +0 -48
- package/archives/2022/index.html +0 -48
- package/archives/2023/index.html +0 -48
- package/archives/index.html +0 -48
- package/archives/page/2/index.html +0 -48
- package/archives/page/3/index.html +0 -48
- package/article/10047.html +0 -148
- package/article/10164.html +0 -65
- package/article/10624.html +0 -436
- package/article/10745.html +0 -586
- package/article/11674.html +0 -71
- package/article/11939.html +0 -72
- package/article/12238.html +0 -86
- package/article/1230.html +0 -533
- package/article/13265.html +0 -69
- package/article/13823.html +0 -78
- package/article/14125.html +0 -72
- package/article/14192.html +0 -561
- package/article/14375.html +0 -85
- package/article/14744.html +0 -83
- package/article/14936.html +0 -451
- package/article/1518.html +0 -250
- package/article/15428.html +0 -71
- package/article/15518.html +0 -288
- package/article/15569.html +0 -418
- package/article/1566.html +0 -122
- package/article/16017.html +0 -156
- package/article/16947.html +0 -440
- package/article/17096.html +0 -82
- package/article/17246.html +0 -89
- package/article/17575.html +0 -350
- package/article/179.html +0 -757
- package/article/18039.html +0 -233
- package/article/18071.html +0 -375
- package/article/18142.html +0 -71
- package/article/19909.html +0 -160
- package/article/20014.html +0 -89
- package/article/20021.html +0 -389
- package/article/20037.html +0 -280
- package/article/20056.html +0 -95
- package/article/20093.html +0 -404
- package/article/2021.html +0 -607
- package/article/20459.html +0 -115
- package/article/20613.html +0 -263
- package/article/20635.html +0 -71
- package/article/21317.html +0 -71
- package/article/21320.html +0 -90
- package/article/21782.html +0 -548
- package/article/22230.html +0 -435
- package/article/22237.html +0 -347
- package/article/22398.html +0 -109
- package/article/22422.html +0 -270
- package/article/22565.html +0 -300
- package/article/23046.html +0 -250
- package/article/23083.html +0 -215
- package/article/23195.html +0 -297
- package/article/23301.html +0 -835
- package/article/23589.html +0 -285
- package/article/23655.html +0 -338
- package/article/23864.html +0 -76
- package/article/23914.html +0 -96
- package/article/24169.html +0 -135
- package/article/24581.html +0 -349
- package/article/2475.html +0 -500
- package/article/24826.html +0 -77
- package/article/24924.html +0 -247
- package/article/25164.html +0 -1495
- package/article/25318.html +0 -394
- package/article/25710.html +0 -1129
- package/article/25734.html +0 -83
- package/article/26083.html +0 -174
- package/article/26147.html +0 -283
- package/article/26291.html +0 -110
- package/article/26354.html +0 -71
- package/article/26624.html +0 -145
- package/article/26639.html +0 -298
- package/article/26850.html +0 -138
- package/article/26940.html +0 -258
- package/article/27796.html +0 -190
- package/article/27800.html +0 -161
- package/article/28963.html +0 -159
- package/article/28976.html +0 -247
- package/article/29042.html +0 -72
- package/article/29596.html +0 -81
- package/article/29619.html +0 -183
- package/article/29623.html +0 -329
- package/article/29829.html +0 -205
- package/article/29abbd1c.html +0 -112
- package/article/30215.html +0 -178
- package/article/30552.html +0 -78
- package/article/30818.html +0 -201
- package/article/31330.html +0 -364
- package/article/3154.html +0 -577
- package/article/31695.html +0 -348
- package/article/31826.html +0 -71
- package/article/31843.html +0 -132
- package/article/32280.html +0 -212
- package/article/32431.html +0 -74
- package/article/32443.html +0 -72
- package/article/32732.html +0 -122
- package/article/3286.html +0 -251
- package/article/32960.html +0 -198
- package/article/33713.html +0 -72
- package/article/33899.html +0 -615
- package/article/34351.html +0 -74
- package/article/34372.html +0 -89
- package/article/34410.html +0 -74
- package/article/34431.html +0 -118
- package/article/3447.html +0 -75
- package/article/34474.html +0 -142
- package/article/34871.html +0 -147
- package/article/35397.html +0 -175
- package/article/3544.html +0 -199
- package/article/35503.html +0 -115
- package/article/35624.html +0 -84
- package/article/35697.html +0 -384
- package/article/35863.html +0 -73
- package/article/36037.html +0 -253
- package/article/36118.html +0 -71
- package/article/3621.html +0 -119
- package/article/36251.html +0 -296
- package/article/36642.html +0 -352
- package/article/37102.html +0 -763
- package/article/37336.html +0 -351
- package/article/37351.html +0 -89
- package/article/3760.html +0 -294
- package/article/37749.html +0 -75
- package/article/37789.html +0 -83
- package/article/38005.html +0 -765
- package/article/38009.html +0 -284
- package/article/38269.html +0 -194
- package/article/38344.html +0 -88
- package/article/38359.html +0 -334
- package/article/38423.html +0 -379
- package/article/38530.html +0 -213
- package/article/38743.html +0 -268
- package/article/38753.html +0 -204
- package/article/38881.html +0 -71
- package/article/39087.html +0 -414
- package/article/39309.html +0 -84
- package/article/39486.html +0 -73
- package/article/39637.html +0 -306
- package/article/39839.html +0 -72
- package/article/39937.html +0 -152
- package/article/39970.html +0 -71
- package/article/402.html +0 -559
- package/article/40698.html +0 -71
- package/article/40811.html +0 -71
- package/article/40964.html +0 -462
- package/article/41011.html +0 -322
- package/article/41152.html +0 -78
- package/article/41696.html +0 -71
- package/article/41717.html +0 -281
- package/article/41777.html +0 -149
- package/article/419.html +0 -985
- package/article/4233.html +0 -136
- package/article/4292.html +0 -86
- package/article/43302.html +0 -96
- package/article/43397.html +0 -106
- package/article/43724.html +0 -281
- package/article/43999.html +0 -224
- package/article/44426.html +0 -77
- package/article/44964.html +0 -137
- package/article/45004.html +0 -123
- package/article/4510.html +0 -83
- package/article/45156.html +0 -320
- package/article/45157.html +0 -52
- package/article/45267.html +0 -87
- package/article/45641.html +0 -207
- package/article/45960.html +0 -75
- package/article/46100.html +0 -1262
- package/article/46366.html +0 -74
- package/article/46771.html +0 -96
- package/article/46911.html +0 -517
- package/article/46948.html +0 -137
- package/article/46ee4850.html +0 -349
- package/article/47019.html +0 -84
- package/article/47532.html +0 -94
- package/article/4783.html +0 -429
- package/article/47972.html +0 -72
- package/article/48216.html +0 -127
- package/article/48252.html +0 -185
- package/article/48520.html +0 -74
- package/article/48722.html +0 -75
- package/article/48807.html +0 -99
- package/article/49126.html +0 -323
- package/article/50001.html +0 -88
- package/article/50058.html +0 -151
- package/article/50343.html +0 -410
- package/article/50510.html +0 -82
- package/article/51082.html +0 -98
- package/article/51677.html +0 -111
- package/article/5204.html +0 -1085
- package/article/52500.html +0 -538
- package/article/52689.html +0 -259
- package/article/52877.html +0 -569
- package/article/53125.html +0 -191
- package/article/53428.html +0 -251
- package/article/53524.html +0 -74
- package/article/53698.html +0 -322
- package/article/53803e6.html +0 -93
- package/article/53924.html +0 -291
- package/article/53962.html +0 -253
- package/article/54006.html +0 -71
- package/article/54018.html +0 -88
- package/article/54161.html +0 -83
- package/article/54178.html +0 -69
- package/article/54258.html +0 -327
- package/article/54295.html +0 -214
- package/article/54313.html +0 -1976
- package/article/54351.html +0 -90
- package/article/54604.html +0 -80
- package/article/54632.html +0 -71
- package/article/54912.html +0 -756
- package/article/54918.html +0 -136
- package/article/55119.html +0 -136
- package/article/55756.html +0 -118
- package/article/55769.html +0 -136
- package/article/55870.html +0 -161
- package/article/56139.html +0 -92
- package/article/56557.html +0 -69
- package/article/56604.html +0 -69
- package/article/56816.html +0 -266
- package/article/56926.html +0 -153
- package/article/57747.html +0 -409
- package/article/57965.html +0 -475
- package/article/58816.html +0 -78
- package/article/59059.html +0 -435
- package/article/59095.html +0 -350
- package/article/59349.html +0 -244
- package/article/59402.html +0 -216
- package/article/59448.html +0 -55
- package/article/59870.html +0 -94
- package/article/59877.html +0 -208
- package/article/5dbb6f41.html +0 -86
- package/article/6008.html +0 -75
- package/article/60327.html +0 -126
- package/article/6035.html +0 -76
- package/article/60428.html +0 -71
- package/article/60544.html +0 -128
- package/article/61319.html +0 -95
- package/article/61367.html +0 -93
- package/article/624d1918.html +0 -292
- package/article/62543.html +0 -71
- package/article/62887.html +0 -169
- package/article/63074.html +0 -120
- package/article/63266.html +0 -311
- package/article/63351.html +0 -74
- package/article/63542.html +0 -104
- package/article/63824.html +0 -275
- package/article/64051.html +0 -653
- package/article/64189b69.html +0 -72
- package/article/64354.html +0 -75
- package/article/64869.html +0 -79
- package/article/64923.html +0 -596
- package/article/65128.html +0 -95
- package/article/65295.html +0 -79
- package/article/6888.html +0 -75
- package/article/7065.html +0 -84
- package/article/7455.html +0 -85
- package/article/7a3ef8f.html +0 -315
- package/article/8140.html +0 -188
- package/article/8190.html +0 -85
- package/article/8225.html +0 -78
- package/article/84c9ccd6.html +0 -159
- package/article/8f9a9ae3.html +0 -82
- package/article/9174.html +0 -73
- package/article/9738.html +0 -294
- package/article/9c3c56c.html +0 -682
- package/article/a4145266.html +0 -71
- package/article/bedea419.html +0 -72
- package/article/bf7e7421.html +0 -78
- package/article/c1867fbf.html +0 -103
- package/article/dcb0db28.html +0 -76
- package/article/fc3b727a.html +0 -79
- package/atom.xml +0 -441
- package/baidusitemap.xml +0 -1079
- package/blocks/dns.txt +0 -291
- package/blocks/filter.txt +0 -1068
- package/blocks/script.js +0 -42
- package/categories/CDN/index.html +0 -48
- package/categories/IDE/index.html +0 -48
- package/categories/git/index.html +0 -48
- package/categories/hexo/index.html +0 -48
- package/categories//345/205/254/345/205/261/350/212/202/346/227/245/index.html +0 -48
- package/categories//345/210/206/344/272/253/index.html +0 -48
- package/categories//345/211/215/347/253/257/index.html +0 -48
- package/categories//345/211/215/347/253/257/page/2/index.html +0 -48
- package/categories//345/211/215/347/253/257//346/265/217/350/247/210/345/231/250/index.html +0 -48
- package/categories//345/211/215/347/253/257//346/265/217/350/247/210/345/231/250//347/275/221/347/273/234/345/215/217/350/256/256/index.html +0 -48
- package/categories//345/215/232/345/256/242/index.html +0 -48
- package/categories//345/267/245/345/205/267/index.html +0 -48
- package/categories//345/271/277/345/221/212/350/277/207/346/273/244/index.html +0 -48
- package/categories//345/271/277/345/221/212/350/277/207/346/273/244//345/275/261/350/247/206/347/224/265/350/247/206/345/260/217/350/257/264/346/274/253/347/224/273/350/265/204/350/256/257/351/237/263/344/271/220/index.html +0 -48
- package/categories//345/271/277/345/221/212/350/277/207/346/273/244//350/247/206/351/242/221/347/224/265/350/247/206/345/260/217/350/257/264/346/274/253/347/224/273/350/265/204/350/256/257/351/237/263/344/271/220/index.html +0 -48
- package/categories//346/255/243/345/210/231/index.html +0 -48
- package/categories//346/265/217/350/247/210/345/231/250/index.html +0 -48
- package/categories//347/256/227/346/263/225/index.html +0 -48
- package/categories//350/265/204/350/256/257/index.html +0 -48
- package/categories//350/275/273/346/235/276/344/270/200/345/210/273/index.html +0 -48
- package/cdn/css/font-awesome.min.css +0 -4
- package/cdn/css/grids-responsive-min.css +0 -7
- package/cdn/css/normalize.css +0 -349
- package/cdn/css/pure-min.css +0 -11
- package/cdn/fonts/fontawesome-webfont.eot +0 -0
- package/cdn/fonts/fontawesome-webfont.svg +0 -2671
- package/cdn/fonts/fontawesome-webfont.ttf +0 -0
- package/cdn/fonts/fontawesome-webfont.woff +0 -0
- package/cdn/fonts/fontawesome-webfont.woff2 +0 -0
- package/cdn/js/Valine.min.js +0 -17
- package/cdn/js/canvas-nest.js +0 -1
- package/cdn/js/clipboard.min.js +0 -7
- package/cdn/js/crypto-js.js +0 -25
- package/cdn/js/jquery.min.js +0 -2
- package/css/default.css +0 -1144
- package/css/donate.css +0 -338
- package/css/hbe.style.css +0 -749
- package/css/style.css +0 -2095
- package/donate/index.html +0 -40
- package/google917dcf72f6e5c7f5.html +0 -1
- package/guestbook/index.html +0 -68
- package/hosts/ads.txt +0 -149
- package/hosts/flash.txt +0 -9
- package/hosts/github.txt +0 -15
- package/hosts/google.txt +0 -16936
- package/hosts/winrar.txt +0 -2
- package/img/alipay.svg +0 -46
- package/img/bitcoin.svg +0 -135
- package/img/blog.ico +0 -0
- package/img/blog.png +0 -0
- package/img/gaba.png +0 -0
- package/img/github.svg +0 -1
- package/img/like.svg +0 -1
- package/img/mp-mini.jpg +0 -0
- package/img/mp.png +0 -0
- package/img/paypal.svg +0 -63
- package/img/upy_logo.svg +0 -59
- package/img/wechat.svg +0 -49
- package/index.html +0 -48
- package/jd_root.txt +0 -1
- package/js/codeblock-resizer.js +0 -51
- package/js/dark.js +0 -12
- package/js/donate.js +0 -87
- package/js/fixedPage.js +0 -110
- package/js/gitment.browser.js +0 -3751
- package/js/search.js +0 -86
- package/js/share.js +0 -60
- package/js/smartresize.js +0 -32
- package/js/totop.js +0 -12
- package/kankan/index.html +0 -1323
- package/lib/hbe.js +0 -297
- package/page/10/index.html +0 -49
- package/page/11/index.html +0 -59
- package/page/12/index.html +0 -67
- package/page/13/index.html +0 -63
- package/page/14/index.html +0 -66
- package/page/15/index.html +0 -60
- package/page/16/index.html +0 -60
- package/page/17/index.html +0 -62
- package/page/18/index.html +0 -61
- package/page/19/index.html +0 -58
- package/page/2/index.html +0 -48
- package/page/20/index.html +0 -57
- package/page/21/index.html +0 -61
- package/page/22/index.html +0 -55
- package/page/23/index.html +0 -64
- package/page/24/index.html +0 -60
- package/page/25/index.html +0 -58
- package/page/26/index.html +0 -48
- package/page/27/index.html +0 -58
- package/page/3/index.html +0 -48
- package/page/4/index.html +0 -48
- package/page/5/index.html +0 -51
- package/page/6/index.html +0 -51
- package/page/7/index.html +0 -51
- package/page/8/index.html +0 -53
- package/page/9/index.html +0 -48
- package/randomcall/README.html +0 -1
- package/randomcall/lucker.html +0 -290
- package/randomcall/lucky.png +0 -0
- package/robots.txt +0 -22
- package/search.xml +0 -6728
- package/sitemap.xml +0 -2694
- package/tags//345/216/237/345/210/233/index.html +0 -48
- package/tags//345/250/261/344/271/220/index.html +0 -48
- package/tags//346/211/213/345/206/231/index.html +0 -48
- package/tags//347/226/253/346/203/205/index.html +0 -48
- package/tags//350/275/254/350/275/275/index.html +0 -48
- package/tags//350/275/254/350/275/275/page/2/index.html +0 -48
- package/v.html +0 -22
- /package/{appConfigs/config → config} +0 -0
- /package/{extConfigs/extension.json → extension.json} +0 -0
package/article/22230.html
DELETED
|
@@ -1,435 +0,0 @@
|
|
|
1
|
-
<!DOCTYPE html><html lang="zh-CN" data-dark><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" name="viewport"><meta content="yes" name="apple-mobile-web-app-capable"><meta content="black-translucent" name="apple-mobile-web-app-status-bar-style"><meta content="telephone=no" name="format-detection"><meta name="description" content="前端壹菜鸟,记录工作难题,关注前端知识,收集精彩博文,做技术的搬运工"><meta name="msvalidate.01" content="0FE4D8B3381D3D87088996B886E1E2BD"><title>高频面试题深入解析/ 周刊 07 | 前端壹菜鸟</title><link rel="stylesheet" type="text/css" href="//unpkg.com/cainiaoblog@latest/css/style.css"><link rel="stylesheet" type="text/css" href="//cdn.staticaly.com/gh/npljy/npljy.github.io/main/css/style.min.css"><link rel="stylesheet" type="text/css" href="//cdn.jsdelivr.net/npm/cainiaoblog@latest/css/style.min.css"><link rel="stylesheet" type="text/css" href="//cdn.jsdelivr.net/npm/normalize.css@latest/normalize.min.css"><link rel="stylesheet" type="text/css" href="//cdn.jsdelivr.net/npm/purecss@latest/build/pure-min.min.css"><link rel="stylesheet" type="text/css" href="//cdn.jsdelivr.net/npm/purecss@latest/build/grids-responsive-min.css"><link rel="stylesheet" type="text/css" href="//cdn.jsdelivr.net/npm/font-awesome@4.7.0/css/font-awesome.min.css"><link rel="icon" mask="" sizes="any" href="//cdn.staticaly.com/gh/npljy/npljy.github.io/main/img/blog.ico"><link rel="Shortcut Icon" type="image/x-icon" href="//cdn.staticaly.com/gh/npljy/npljy.github.io/main/img/blog.ico"><link rel="apple-touch-icon" href="//cdn.staticaly.com/gh/npljy/npljy.github.io/main/img/blog.png"><link rel="apple-touch-icon-precomposed" href="//cdn.staticaly.com/gh/npljy/npljy.github.io/main/img/blog.png"><link rel="alternate" type="application/atom+xml" href="/atom.xml"><script type="text/javascript" src="//cdn.jsdelivr.net/npm/jquery@latest/dist/jquery.min.js"></script><script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8385136408348258"></script><script src="https://busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js" async></script><script>(function(){
|
|
2
|
-
var bp = document.createElement('script');
|
|
3
|
-
var curProtocol = window.location.protocol.split(':')[0];
|
|
4
|
-
if (curProtocol === 'https'){
|
|
5
|
-
bp.src = 'https://zz.bdstatic.com/linksubmit/push.js';
|
|
6
|
-
}
|
|
7
|
-
else{
|
|
8
|
-
bp.src = 'http://push.zhanzhang.baidu.com/push.js';
|
|
9
|
-
}
|
|
10
|
-
var s = document.getElementsByTagName("script")[0];
|
|
11
|
-
s.parentNode.insertBefore(bp, s);
|
|
12
|
-
})();
|
|
13
|
-
</script><script>(function(){
|
|
14
|
-
var src = 'https://jspassport.ssl.qhimg.com/11.0.1.js?d182b3f28525f2db83acfaaf6e696dba';
|
|
15
|
-
document.write('<script src="' + src + '" id="sozz"><\/script>');
|
|
16
|
-
})();
|
|
17
|
-
</script><script>var _hmt=_hmt||[];(function(){var hm=document.createElement("script");hm.src='https://hm.baidu.com/hm.js?011f0b44e8452bfa57fbfa23c5fe7683';var s=document.getElementsByTagName("script")[0];s.parentNode.insertBefore(hm, s);})();
|
|
18
|
-
</script><script async src="https://www.googletagmanager.com/gtag/js?id=UA-150860401-1"></script><script>window.dataLayer=window.dataLayer||[];function gtag(){dataLayer.push(arguments);};gtag('js',new Date());gtag('config','UA-150860401-1');
|
|
19
|
-
</script><script type="text/javascript" src="//cdn.jsdelivr.net/npm/cainiaoblog@latest/js/fixedPage.min.js"></script><meta name="generator" content="Hexo 6.3.0"></head><body><div class="body_container"><div id="header"><div class="site-name"><a id="logo" href="/.">前端壹菜鸟</a><p class="description">关注前端知识,收集精彩博文,做技术的搬运工</p></div><div id="nav-menu"><a class="current" href="/." target="_self"><i class="fa fa-home"> 首页</i></a><a href="/archives/" target="_self"><i class="fa fa-archive"> 归档</i></a><a href="/guestbook/" target="_self"><i class="fa fa-comments"> 留言</i></a><a href="/about/" target="_self"><i class="fa fa-user"> 关于</i></a><a href="https://laonongmin.online/" target="_target"><i class="fa fa-group"> 看看</i></a><a href="https://love.xuehuayu.cn/" target="_target"><i class="fa fa-heart"> LOVE</i></a></div></div><div class="pure-g" id="layout"><div class="pure-u-1 pure-u-md-3-4"><div class="content_container"><div class="post"><h1 class="post-title c-post">高频面试题深入解析/ 周刊 07</h1><div class="post-meta"><span class="date">2019-10-03</span><span> | </span><span class="tag"><a href="/tags/%E8%BD%AC%E8%BD%BD/">转载 </a></span><span> | </span><span class="category"><a href="/categories/%E5%88%86%E4%BA%AB/">分享 </a></span><span id="busuanzi_container_page_pv"> | <span id="busuanzi_value_page_pv"><i class="fa fa-spinner"></i></span><span> 阅读</span></span><span class="post-time"><span class="post-meta-item-text"> | </span><span class="post-meta-item-icon"><i class="fa fa-keyboard-o"></i><span class="post-count"> 3.5k</span><span class="post-meta-item-text"> 字</span></span></span><span class="post-time"> | <span class="post-meta-item-icon"><i class="fa fa-hourglass-half"></i><span class="post-count"> 15</span><span class="post-meta-item-text"> 分钟</span></span></span></div><a class="disqus-comment-count" href="/article/22230.html#vcomment"><span class="waline-comment-count" data-path="/article/22230.html"></span><span> 条评论</span></a><div class="post-content"><p><code>原文地址:https://github.com/YvetteLau/Blog/issues/38</code></p>
|
|
20
|
-
<span id="more"></span>
|
|
21
|
-
|
|
22
|
-
<h3 id="关于【Step-By-Step】"><a href="#关于【Step-By-Step】" class="headerlink" title="关于【Step-By-Step】"></a>关于【Step-By-Step】</h3><blockquote>
|
|
23
|
-
<p><a target="_blank" rel="noopener" href="https://github.com/YvetteLau/Step-By-Step">Step-By-Step</a> (点击进入项目) 是我于 <code>2019-05-20</code> 开始的一个项目,每个工作日发布一道面试题。<br>每个周末我会仔细阅读大家的答案,整理最一份较优答案出来,因本人水平有限,有误的地方,大家及时指正。</p>
|
|
24
|
-
</blockquote>
|
|
25
|
-
<hr>
|
|
26
|
-
<blockquote>
|
|
27
|
-
<p>本周面试题一览:</p>
|
|
28
|
-
</blockquote>
|
|
29
|
-
<ul>
|
|
30
|
-
<li><a target="_blank" rel="noopener" href="https://github.com/YvetteLau/Step-By-Step/issues/39">实现一个 JSON.stringify</a></li>
|
|
31
|
-
<li><a target="_blank" rel="noopener" href="https://github.com/YvetteLau/Step-By-Step/issues/40">实现一个 JSON.parse</a></li>
|
|
32
|
-
<li><a target="_blank" rel="noopener" href="https://github.com/YvetteLau/Step-By-Step/issues/41">实现一个观察者模式</a></li>
|
|
33
|
-
<li><a target="_blank" rel="noopener" href="https://github.com/YvetteLau/Step-By-Step/issues/42">使用CSS让一个元素水平垂直居中有哪些方式</a></li>
|
|
34
|
-
<li><a target="_blank" rel="noopener" href="https://github.com/YvetteLau/Step-By-Step/issues/43">ES6模块和CommonJS模块有哪些差异?</a></li>
|
|
35
|
-
</ul>
|
|
36
|
-
<h3 id="1-实现一个-JSON-stringify"><a href="#1-实现一个-JSON-stringify" class="headerlink" title="1. 实现一个 JSON.stringify"></a>1. 实现一个 <code>JSON.stringify</code></h3><p><code>JSON.stringify([, replacer [, space])</code> 方法是将一个JavaScript值(对象或者数组)转换为一个 JSON字符串。此处模拟实现,不考虑可选的第二个参数 <code>replacer</code> 和第三个参数 <code>space</code>,如果对这两个参数的作用还不了解,建议阅读 <a target="_blank" rel="noopener" href="https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify">MDN</a> 文档。</p>
|
|
37
|
-
<blockquote>
|
|
38
|
-
<p><code>JSON.stringify()</code> 将值转换成对应的 <code>JSON</code> 格式:</p>
|
|
39
|
-
</blockquote>
|
|
40
|
-
<ol>
|
|
41
|
-
<li>基本数据类型:</li>
|
|
42
|
-
</ol>
|
|
43
|
-
<ul>
|
|
44
|
-
<li>undefined 转换之后仍是 undefined(类型也是 <code>undefined</code>)</li>
|
|
45
|
-
<li>boolean 值转换之后是字符串 <code>"false"/"true"</code></li>
|
|
46
|
-
<li>number 类型(除了 <code>NaN</code> 和 <code>Infinity</code>)转换之后是字符串类型的数值</li>
|
|
47
|
-
<li>symbol 转换之后是 <code>undefined</code></li>
|
|
48
|
-
<li>null 转换之后是字符串 <code>"null"</code></li>
|
|
49
|
-
<li>string 转换之后仍是string</li>
|
|
50
|
-
<li><code>NaN</code> 和 <code>Infinity</code> 转换之后是字符串 <code>"null"</code></li>
|
|
51
|
-
</ul>
|
|
52
|
-
<ol start="2">
|
|
53
|
-
<li>如果是函数类型</li>
|
|
54
|
-
</ol>
|
|
55
|
-
<ul>
|
|
56
|
-
<li>转换之后是 <code>undefined</code></li>
|
|
57
|
-
</ul>
|
|
58
|
-
<ol start="3">
|
|
59
|
-
<li>如果是对象类型(非函数)</li>
|
|
60
|
-
</ol>
|
|
61
|
-
<ul>
|
|
62
|
-
<li><p>如果有 <code>toJSON()</code> 方法,那么序列化 <code>toJSON()</code> 的返回值。</p>
|
|
63
|
-
</li>
|
|
64
|
-
<li><p>如果是一个数组</p>
|
|
65
|
-
</li>
|
|
66
|
-
<li><p>如果属性值中出现了 <code>undefined</code>、任意的函数以及 <code>symbol</code>,转换成字符串 <code>"null"</code></p>
|
|
67
|
-
</li>
|
|
68
|
-
<li><p>如果是 <code>RegExp</code> 对象。</p>
|
|
69
|
-
</li>
|
|
70
|
-
</ul>
|
|
71
|
-
<p>返回 <code>{}</code> (类型是 string)</p>
|
|
72
|
-
<ul>
|
|
73
|
-
<li><p>如果是 <code>Date</code> 对象,返回 <code>Date</code> 的 <code>toJSON</code> 字符串值</p>
|
|
74
|
-
</li>
|
|
75
|
-
<li><p>如果是普通对象;</p>
|
|
76
|
-
</li>
|
|
77
|
-
<li><p>如果属性值中出现了 <code>undefined</code>、任意的函数以及 symbol 值,忽略。</p>
|
|
78
|
-
</li>
|
|
79
|
-
<li><p>所有以 <code>symbol</code> 为属性键的属性都会被完全忽略掉。</p>
|
|
80
|
-
</li>
|
|
81
|
-
</ul>
|
|
82
|
-
<ol start="4">
|
|
83
|
-
<li>对包含循环引用的对象(对象之间相互引用,形成无限循环)执行此方法,会抛出错误。</li>
|
|
84
|
-
</ol>
|
|
85
|
-
<blockquote>
|
|
86
|
-
<p>模拟实现</p>
|
|
87
|
-
</blockquote>
|
|
88
|
-
<pre><code>functionjsonStringify(data) {
|
|
89
|
-
let dataType =typeof data;
|
|
90
|
-
if (dataType !=='object') {
|
|
91
|
-
let result = data;
|
|
92
|
-
//data 可能是 string/number/null/undefined/booleanif (Number.isNaN(data) || data ===Infinity) {
|
|
93
|
-
//NaN 和 Infinity 序列化返回 "null"
|
|
94
|
-
result ="null";
|
|
95
|
-
} elseif (dataType ==='function'|| dataType ==='undefined'|| dataType ==='symbol') {
|
|
96
|
-
//function 、undefined 、symbol 序列化返回 undefinedreturnundefined;
|
|
97
|
-
} elseif (dataType ==='string') {
|
|
98
|
-
result ='"'+ data +'"';
|
|
99
|
-
}
|
|
100
|
-
//boolean 返回 String()returnString(result);
|
|
101
|
-
} elseif (dataType ==='object') {
|
|
102
|
-
if (data ===null) {
|
|
103
|
-
return"null";
|
|
104
|
-
} elseif (data.toJSON&&typeofdata.toJSON==='function') {
|
|
105
|
-
returnjsonStringify(data.toJSON());
|
|
106
|
-
} elseif (data instanceofArray) {
|
|
107
|
-
let result = [];
|
|
108
|
-
//如果是数组//toJSON 方法可以存在于原型链中data.forEach((item, index) => {
|
|
109
|
-
if (typeof item ==='undefined'||typeof item ==='function'||typeof item ==='symbol') {
|
|
110
|
-
result[index] ="null";
|
|
111
|
-
} else {
|
|
112
|
-
result[index] =jsonStringify(item);
|
|
113
|
-
}
|
|
114
|
-
});
|
|
115
|
-
result ="["+ result +"]";
|
|
116
|
-
returnresult.replace(/'/g, '"');
|
|
117
|
-
|
|
118
|
-
} else {
|
|
119
|
-
//普通对象/** * 循环引用抛错(暂未检测,循环引用时,堆栈溢出) * symbol key 忽略 * undefined、函数、symbol 为属性值,被忽略*/let result = [];
|
|
120
|
-
Object.keys(data).forEach((item, index) => {
|
|
121
|
-
if (typeof item !=='symbol') {
|
|
122
|
-
//key 如果是symbol对象,忽略if (data[item] !==undefined&&typeof data[item] !=='function'&&typeof data[item] !=='symbol') {
|
|
123
|
-
//键值如果是 undefined、函数、symbol 为属性值,忽略result.push('"'+ item +'"'+":"+jsonStringify(data[item]));
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
});
|
|
127
|
-
return ("{"+ result +"}").replace(/'/g, '"');
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
</code></pre>
|
|
132
|
-
<p>测试代码:</p>
|
|
133
|
-
<pre><code>let sym =Symbol(10);
|
|
134
|
-
console.log(jsonStringify(sym) ===JSON.stringify(sym));
|
|
135
|
-
let nul =null;
|
|
136
|
-
console.log(jsonStringify(nul) ===JSON.stringify(nul));
|
|
137
|
-
let und =undefined;
|
|
138
|
-
console.log(jsonStringify(undefined) ===JSON.stringify(undefined));
|
|
139
|
-
let boo =false;
|
|
140
|
-
console.log(jsonStringify(boo) ===JSON.stringify(boo));
|
|
141
|
-
let nan =NaN;
|
|
142
|
-
console.log(jsonStringify(nan) ===JSON.stringify(nan));
|
|
143
|
-
let inf =Infinity;
|
|
144
|
-
console.log(jsonStringify(Infinity) ===JSON.stringify(Infinity));
|
|
145
|
-
let str ="hello";
|
|
146
|
-
console.log(jsonStringify(str) ===JSON.stringify(str));
|
|
147
|
-
let reg =newRegExp("\w");
|
|
148
|
-
console.log(jsonStringify(reg) ===JSON.stringify(reg));
|
|
149
|
-
let date =newDate();
|
|
150
|
-
console.log(jsonStringify(date) ===JSON.stringify(date));
|
|
151
|
-
let obj = {
|
|
152
|
-
name:'刘小夕',
|
|
153
|
-
age:22,
|
|
154
|
-
hobbie: ['coding', 'writing'],
|
|
155
|
-
date:newDate(),
|
|
156
|
-
unq:Symbol(10),
|
|
157
|
-
sayHello:function () {
|
|
158
|
-
console.log("hello")
|
|
159
|
-
},
|
|
160
|
-
more: {
|
|
161
|
-
brother:'Star',
|
|
162
|
-
age:20,
|
|
163
|
-
hobbie: [null],
|
|
164
|
-
info: {
|
|
165
|
-
money:undefined,
|
|
166
|
-
job:null,
|
|
167
|
-
others: []
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
console.log(jsonStringify(obj) ===JSON.stringify(obj));
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
functionSuperType(name, age) {
|
|
175
|
-
this.name= name;
|
|
176
|
-
this.age= age;
|
|
177
|
-
}
|
|
178
|
-
let per =newSuperType('小姐姐', 20);
|
|
179
|
-
console.log(jsonStringify(per) ===JSON.stringify(per));
|
|
180
|
-
|
|
181
|
-
functionSubType(info) {
|
|
182
|
-
this.info= info;
|
|
183
|
-
}
|
|
184
|
-
SubType.prototype.toJSON=function () {
|
|
185
|
-
return {
|
|
186
|
-
name:'钱钱钱',
|
|
187
|
-
mount:'many',
|
|
188
|
-
say:function () {
|
|
189
|
-
console.log('我偏不说!');
|
|
190
|
-
},
|
|
191
|
-
more:null,
|
|
192
|
-
reg:newRegExp("\w")
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
let sub =newSubType('hi');
|
|
196
|
-
console.log(jsonStringify(sub) ===JSON.stringify(sub));
|
|
197
|
-
let map =newMap();
|
|
198
|
-
map.set('name', '小姐姐');
|
|
199
|
-
console.log(jsonStringify(map) ===JSON.stringify(map));
|
|
200
|
-
let set =newSet([1, 2, 3, 4, 5, 1, 2, 3]);
|
|
201
|
-
console.log(jsonStringify(set) ===JSON.stringify(set));
|
|
202
|
-
</code></pre>
|
|
203
|
-
<h3 id="2-实现一个-JSON-parse"><a href="#2-实现一个-JSON-parse" class="headerlink" title="2. 实现一个 JSON.parse"></a>2. 实现一个 <code>JSON.parse</code></h3><p><code>JSON.parse(JSON.parse(text[, reviver])</code> 方法用来解析JSON字符串,构造由字符串描述的JavaScript值或对象。提供可选的reviver函数用以在返回之前对所得到的对象执行变换。此处模拟实现,不考虑可选的第二个参数 <code>reviver</code> ,如果对这个参数的作用还不了解,建议阅读 <a target="_blank" rel="noopener" href="https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse">MDN</a> 文档。</p>
|
|
204
|
-
<h4 id="第一种方式-eval"><a href="#第一种方式-eval" class="headerlink" title="第一种方式 eval"></a>第一种方式 eval</h4><p>最简单,最直观的方式就是调用 <code>eval</code></p>
|
|
205
|
-
<pre><code>var json ='{"name":"小姐姐", "age":20}';
|
|
206
|
-
var obj =eval("("+ json +")"); // obj 就是 json 反序列化之后得到的对象
|
|
207
|
-
</code></pre>
|
|
208
|
-
<p>直接调用 <code>eval</code> 存在 <code>XSS</code> 漏洞,数据中可能不是 <code>json</code> 数据,而是可执行的 <code>JavaScript</code> 代码。因此,在调用 <code>eval</code> 之前,需要对数据进行校验。</p>
|
|
209
|
-
<pre><code>var rx_one =/^[\],:{}\s]*$/;
|
|
210
|
-
var rx_two =/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g;
|
|
211
|
-
var rx_three =/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g;
|
|
212
|
-
var rx_four =/(?:^|:|,)(?:\s*\[)+/g;
|
|
213
|
-
|
|
214
|
-
if (
|
|
215
|
-
rx_one.test(
|
|
216
|
-
json
|
|
217
|
-
.replace(rx_two, "@")
|
|
218
|
-
.replace(rx_three, "]")
|
|
219
|
-
.replace(rx_four, "")
|
|
220
|
-
)
|
|
221
|
-
) {
|
|
222
|
-
var obj =eval("("+json +")");
|
|
223
|
-
}
|
|
224
|
-
</code></pre>
|
|
225
|
-
<p><code>JSON</code> 是 JS 的子集,可以直接交给 <code>eval</code> 运行。</p>
|
|
226
|
-
<h4 id="第二种方式-new-Function"><a href="#第二种方式-new-Function" class="headerlink" title="第二种方式 new Function"></a>第二种方式 <code>new Function</code></h4><p><code>Function</code> 与 <code>eval</code> 有相同的字符串参数特性。</p>
|
|
227
|
-
<pre><code>var json ='{"name":"小姐姐", "age":20}';
|
|
228
|
-
var obj = (newFunction('return '+ json))();
|
|
229
|
-
</code></pre>
|
|
230
|
-
<h3 id="3-实现一个观察者模式"><a href="#3-实现一个观察者模式" class="headerlink" title="3. 实现一个观察者模式"></a>3. 实现一个观察者模式</h3><p>观察者模式定义了对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知,并自动更新。观察者模式属于行为型模式,行为型模式关注的是对象之间的通讯,观察者模式就是观察者和被观察者之间的通讯。</p>
|
|
231
|
-
<p>观察者(Observer)直接订阅(Subscribe)主题(Subject),而当主题被激活的时候,会触发(Fire Event)观察者里的事件。</p>
|
|
232
|
-
<pre><code>//有一家猎人工会,其中每个猎人都具有发布任务(publish),订阅任务(subscribe)的功能//他们都有一个订阅列表来记录谁订阅了自己//定义一个猎人类//包括姓名,级别,订阅列表functionHunter(name, level){
|
|
233
|
-
this.name= name
|
|
234
|
-
this.level= level
|
|
235
|
-
this.list= []
|
|
236
|
-
}
|
|
237
|
-
Hunter.prototype.publish=function (money){
|
|
238
|
-
console.log(this.level+'猎人'+this.name+'寻求帮助')
|
|
239
|
-
this.list.forEach(function(item, index){
|
|
240
|
-
item(money)
|
|
241
|
-
})
|
|
242
|
-
}
|
|
243
|
-
Hunter.prototype.subscribe=function (targrt, fn){
|
|
244
|
-
console.log(this.level+'猎人'+this.name+'订阅了'+targrt.name)
|
|
245
|
-
targrt.list.push(fn)
|
|
246
|
-
}
|
|
247
|
-
|
|
248
|
-
//猎人工会走来了几个猎人let hunterMing =newHunter('小明', '黄金')
|
|
249
|
-
let hunterJin =newHunter('小金', '白银')
|
|
250
|
-
let hunterZhang =newHunter('小张', '黄金')
|
|
251
|
-
let hunterPeter =newHunter('Peter', '青铜')
|
|
252
|
-
|
|
253
|
-
//Peter等级较低,可能需要帮助,所以小明,小金,小张都订阅了PeterhunterMing.subscribe(hunterPeter, function(money){
|
|
254
|
-
console.log('小明表示:'+ (money >200?'':'暂时很忙,不能') +'给予帮助')
|
|
255
|
-
});
|
|
256
|
-
hunterJin.subscribe(hunterPeter, function(){
|
|
257
|
-
console.log('小金表示:给予帮助')
|
|
258
|
-
});
|
|
259
|
-
hunterZhang.subscribe(hunterPeter, function(){
|
|
260
|
-
console.log('小张表示:给予帮助')
|
|
261
|
-
});
|
|
262
|
-
|
|
263
|
-
//Peter遇到困难,赏金198寻求帮助hunterPeter.publish(198);
|
|
264
|
-
|
|
265
|
-
//猎人们(观察者)关联他们感兴趣的猎人(目标对象),如Peter,当Peter有困难时,会自动通知给他们(观察者)
|
|
266
|
-
</code></pre>
|
|
267
|
-
<h3 id="4-使用-CSS-让一个元素水平垂直居中"><a href="#4-使用-CSS-让一个元素水平垂直居中" class="headerlink" title="4. 使用 CSS 让一个元素水平垂直居中"></a>4. 使用 CSS 让一个元素水平垂直居中</h3><p>父元素 <code>.container</code></p>
|
|
268
|
-
<p>子元素 <code>.box</code></p>
|
|
269
|
-
<h4 id="利用-flex-布局"><a href="#利用-flex-布局" class="headerlink" title="利用 flex 布局"></a>利用 <code>flex</code> 布局</h4><pre><code>/* 无需知道被居中元素的宽高 */.container {
|
|
270
|
-
display: flex;
|
|
271
|
-
align-items: center;
|
|
272
|
-
justify-content: center;
|
|
273
|
-
}
|
|
274
|
-
</code></pre>
|
|
275
|
-
<h4 id="子元素是单行文本"><a href="#子元素是单行文本" class="headerlink" title="子元素是单行文本"></a>子元素是单行文本</h4><p>设置父元素的 <code>text-align</code> 和 <code>line-height = height</code></p>
|
|
276
|
-
<pre><code>.container {
|
|
277
|
-
height: 100px;
|
|
278
|
-
line-height: 100px;
|
|
279
|
-
text-align: center;
|
|
280
|
-
}
|
|
281
|
-
</code></pre>
|
|
282
|
-
<h4 id="利用-absolute-transform"><a href="#利用-absolute-transform" class="headerlink" title="利用 absolute + transform"></a>利用 <code>absolute</code> + <code>transform</code></h4><pre><code>/* 无需知道被居中元素的宽高 *//* 设置父元素非 `static` 定位 */.container {
|
|
283
|
-
position: relative;
|
|
284
|
-
}
|
|
285
|
-
/* 子元素绝对定位,使用 translate的好处是无需知道子元素的宽高 *//* 如果知道宽高,也可以使用 margin 设置 */.box {
|
|
286
|
-
position: absolute;
|
|
287
|
-
left: -50%;
|
|
288
|
-
top: -50%;
|
|
289
|
-
transform: translate(-50%, -50%);
|
|
290
|
-
}
|
|
291
|
-
</code></pre>
|
|
292
|
-
<h4 id="利用-grid-布局"><a href="#利用-grid-布局" class="headerlink" title="利用 grid 布局"></a>利用 <code>grid</code> 布局</h4><pre><code>/* 无需知道被居中元素的宽高 */.container {
|
|
293
|
-
display: grid;
|
|
294
|
-
}
|
|
295
|
-
.box {
|
|
296
|
-
justify-self: center;
|
|
297
|
-
align-self: center;
|
|
298
|
-
}
|
|
299
|
-
</code></pre>
|
|
300
|
-
<h4 id="利用绝对定位和-margin-auto"><a href="#利用绝对定位和-margin-auto" class="headerlink" title="利用绝对定位和 margin:auto"></a>利用绝对定位和 <code>margin:auto</code></h4><pre><code>/* 无需知道被居中元素的宽高 */.box {
|
|
301
|
-
position: absolute;
|
|
302
|
-
left: 0;
|
|
303
|
-
top: 0;
|
|
304
|
-
right: 0;
|
|
305
|
-
bottom: 0;
|
|
306
|
-
margin: auto;
|
|
307
|
-
}
|
|
308
|
-
.container {
|
|
309
|
-
position: relative;
|
|
310
|
-
}
|
|
311
|
-
</code></pre>
|
|
312
|
-
<h3 id="5-ES6模块和-CommonJS-模块有哪些差异?"><a href="#5-ES6模块和-CommonJS-模块有哪些差异?" class="headerlink" title="5. ES6模块和 CommonJS 模块有哪些差异?"></a>5. ES6模块和 <code>CommonJS</code> 模块有哪些差异?</h3><h4 id="1-CommonJS-模块是运行时加载,ES6模块是编译时输出接口。"><a href="#1-CommonJS-模块是运行时加载,ES6模块是编译时输出接口。" class="headerlink" title="1. CommonJS 模块是运行时加载,ES6模块是编译时输出接口。"></a>1. <code>CommonJS</code> 模块是运行时加载,ES6模块是编译时输出接口。</h4><ul>
|
|
313
|
-
<li>ES6模块在编译时,就能确定模块的依赖关系,以及输入和输出的变量。ES6 模块不是对象,它的对外接口只是一种静态定义,在代码静态解析阶段就会生成。</li>
|
|
314
|
-
<li><code>CommonJS</code> 加载的是一个对象,该对象只有在脚本运行完才会生成。</li>
|
|
315
|
-
</ul>
|
|
316
|
-
<h4 id="2-CommonJS-模块输出的是一个值的拷贝,ES6模块输出的是值的引用。"><a href="#2-CommonJS-模块输出的是一个值的拷贝,ES6模块输出的是值的引用。" class="headerlink" title="2. CommonJS 模块输出的是一个值的拷贝,ES6模块输出的是值的引用。"></a>2. <code>CommonJS</code> 模块输出的是一个值的拷贝,ES6模块输出的是值的引用。</h4><pre><code>- `CommonJS` 输出的是一个值的拷贝(注意基本数据类型/复杂数据类型)
|
|
317
|
-
|
|
318
|
-
- ES6 模块是动态引用,并且不会缓存值,模块里面的变量绑定其所在的模块。
|
|
319
|
-
</code></pre>
|
|
320
|
-
<p>CommonJS 模块输出的是值的拷贝。</p>
|
|
321
|
-
<blockquote>
|
|
322
|
-
<p>模块输出的值是基本数据类型,模块内部的变化就影响不到这个值。</p>
|
|
323
|
-
</blockquote>
|
|
324
|
-
<pre><code>//name.jslet name ='William';
|
|
325
|
-
setTimeout(() => { name ='Yvette'; }, 300);
|
|
326
|
-
module.exports= name;
|
|
327
|
-
|
|
328
|
-
//index.jsconstname=require('./name');
|
|
329
|
-
console.log(name); //William//name.js 模块加载后,它的内部变化就影响不到 name//name 是一个基本数据类型。将其复制出一份之后,二者之间互不影响。setTimeout(() =>console.log(name), 500); //William
|
|
330
|
-
</code></pre>
|
|
331
|
-
<blockquote>
|
|
332
|
-
<p>模块输出的值是复杂数据类型</p>
|
|
333
|
-
</blockquote>
|
|
334
|
-
<ol>
|
|
335
|
-
<li><p>模块输出的是对象,属性值是简单数据类型时:</p>
|
|
336
|
-
<p> //name.jslet name =’William’;<br> setTimeout(() => { name =’Yvette’; }, 300);<br> module.exports= { name };</p>
|
|
337
|
-
<p> //index.jsconst { name } =require(‘./name’);<br> console.log(name); //William//name 是一个原始类型的值,会被缓存。setTimeout(() =>console.log(name), 500); //William</p>
|
|
338
|
-
</li>
|
|
339
|
-
</ol>
|
|
340
|
-
<blockquote>
|
|
341
|
-
<p>模块输出的是对象:</p>
|
|
342
|
-
</blockquote>
|
|
343
|
-
<pre><code>//name.jslet name ='William';
|
|
344
|
-
let hobbies = ['coding'];
|
|
345
|
-
setTimeout(() => {
|
|
346
|
-
name ='Yvette';
|
|
347
|
-
hobbies.push('reading');
|
|
348
|
-
}, 300);
|
|
349
|
-
module.exports= { name, hobbies };
|
|
350
|
-
|
|
351
|
-
//index.jsconst { name, hobbies } =require('./name');
|
|
352
|
-
console.log(name); //Williamconsole.log(hobbies); //['coding']/* * name 的值没有受到影响,因为 {name: name} 属性值 name 存的是个字符串 * 300ms后 name 变量重新赋值,但是不会影响 {name: name} * * hobbies 的值会被影响,因为 {hobbies: hobbies} 属性值 hobbies 中存的是 * 数组的堆内存地址,因此当 hobbies 对象的值被改变时,存在栈内存中的地址并 没有发生变化,因此 hoobies 对象值的改变会影响 {hobbies: hobbies} * xx = { name, hobbies } 也因此改变 (复杂数据类型,拷贝的栈内存中存的地址) */setTimeout(() => {
|
|
353
|
-
console.log(name);//Williamconsole.log(hobbies);//['coding', 'reading']
|
|
354
|
-
}, 500);
|
|
355
|
-
</code></pre>
|
|
356
|
-
<p>ES6 模块的运行机制与 <code>CommonJS</code> 不一样。JS 引擎对脚本静态分析的时候,遇到模块加载命令 <code>import</code> ,就会生成一个只读引用。等到脚本真正执行时,再根据这个只读引用,到被加载的那个模块里面去取值。</p>
|
|
357
|
-
<pre><code>//name.jslet name ='William';
|
|
358
|
-
setTimeout(() => { name ='Yvette'; hobbies.push('writing'); }, 300);
|
|
359
|
-
export { name };
|
|
360
|
-
exportvar hobbies = ['coding'];
|
|
361
|
-
|
|
362
|
-
//index.jsimport { name, hobbies } from'./name';
|
|
363
|
-
console.log(name, hobbies); //William ["coding"]//name 和 hobbie 都会被模块内部的变化所影响setTimeout(() => {
|
|
364
|
-
console.log(name, hobbies); //Yvette ["coding", "writing"]
|
|
365
|
-
}, 500); //Yvette
|
|
366
|
-
</code></pre>
|
|
367
|
-
<p>ES6 模块是动态引用,并且不会缓存值,模块里面的变量绑定其所在的模块。因此上面的例子也很容易理解。</p>
|
|
368
|
-
<p>那么 <code>export default</code> 导出是什么情况呢?</p>
|
|
369
|
-
<pre><code>//name.jslet name ='William';
|
|
370
|
-
let hobbies = ['coding']
|
|
371
|
-
setTimeout(() => { name ='Yvette'; hobbies.push('writing'); }, 300);
|
|
372
|
-
exportdefault { name, hobbies };
|
|
373
|
-
|
|
374
|
-
//index.jsimportinfofrom'./name';
|
|
375
|
-
console.log(info.name, info.hobbies); //William ["coding"]//name 不会被模块内部的变化所影响//hobbie 会被模块内部的变化所影响setTimeout(() => {
|
|
376
|
-
console.log(info.name, info.hobbies); //William ["coding", "writing"]
|
|
377
|
-
}, 500); //Yvette
|
|
378
|
-
</code></pre>
|
|
379
|
-
<p>一起看一下为什么。</p>
|
|
380
|
-
<p><code>export default</code> 可以理解为将变量赋值给 <code>default</code>,最后导出 <code>default</code> (仅是方便理解,不代表最终的实现,如果对这块感兴趣,可以阅读 webpack 编译出来的代码)。</p>
|
|
381
|
-
<p>基础类型变量 <code>name</code>, 赋值给 <code>default</code> 之后,只读引用与 <code>default</code> 关联,此时原变量 <code>name</code> 的任何修改都与 <code>default</code> 无关。</p>
|
|
382
|
-
<p>复杂数据类型变量 <code>hobbies</code>,赋值给 <code>default</code>之后,只读引用与 <code>default</code> 关联,<code>default</code> 和 <code>hobbies</code> 中存储的是同一个对象的堆内存地址,当这个对象的值发生改变时,此时 <code>default</code> 的值也会发生变化。</p>
|
|
383
|
-
<h4 id="3-ES6-模块自动采用严格模式,无论模块头部是否写了-use-strict"><a href="#3-ES6-模块自动采用严格模式,无论模块头部是否写了-use-strict" class="headerlink" title="3. ES6 模块自动采用严格模式,无论模块头部是否写了 "use strict";"></a>3. ES6 模块自动采用严格模式,无论模块头部是否写了 <code>"use strict";</code></h4><h4 id="4-require-可以做动态加载,import-语句做不到,import-语句必须位于顶层作用域中。"><a href="#4-require-可以做动态加载,import-语句做不到,import-语句必须位于顶层作用域中。" class="headerlink" title="4. require 可以做动态加载,import 语句做不到,import 语句必须位于顶层作用域中。"></a>4. require 可以做动态加载,<code>import</code> 语句做不到,<code>import</code> 语句必须位于顶层作用域中。</h4><h4 id="5-ES6-模块的输入变量是只读的,不能对其进行重新赋值"><a href="#5-ES6-模块的输入变量是只读的,不能对其进行重新赋值" class="headerlink" title="5. ES6 模块的输入变量是只读的,不能对其进行重新赋值"></a>5. ES6 模块的输入变量是只读的,不能对其进行重新赋值</h4><pre><code>importnamefrom'./name';
|
|
384
|
-
name ='Star'; //抛错
|
|
385
|
-
</code></pre>
|
|
386
|
-
<h4 id="6-当使用require命令加载某个模块时,就会运行整个模块的代码。"><a href="#6-当使用require命令加载某个模块时,就会运行整个模块的代码。" class="headerlink" title="6. 当使用require命令加载某个模块时,就会运行整个模块的代码。"></a>6. 当使用require命令加载某个模块时,就会运行整个模块的代码。</h4><h4 id="7-当使用require命令加载同一个模块时,不会再执行该模块,而是取到缓存之中的值。也就是说,CommonJS模块无论加载多少次,都只会在第一次加载时运行一次,以后再加载,就返回第一次运行的结果,除非手动清除系统缓存。"><a href="#7-当使用require命令加载同一个模块时,不会再执行该模块,而是取到缓存之中的值。也就是说,CommonJS模块无论加载多少次,都只会在第一次加载时运行一次,以后再加载,就返回第一次运行的结果,除非手动清除系统缓存。" class="headerlink" title="7. 当使用require命令加载同一个模块时,不会再执行该模块,而是取到缓存之中的值。也就是说,CommonJS模块无论加载多少次,都只会在第一次加载时运行一次,以后再加载,就返回第一次运行的结果,除非手动清除系统缓存。"></a>7. 当使用require命令加载同一个模块时,不会再执行该模块,而是取到缓存之中的值。也就是说,CommonJS模块无论加载多少次,都只会在第一次加载时运行一次,以后再加载,就返回第一次运行的结果,除非手动清除系统缓存。</h4></div><div><ul class="post-copyright"><li class="post-copyright-author"><strong>本文作者:</strong>雪花雨</li><li class="post-copyright-link"><strong>本文链接:</strong><a href="/article/22230.html">https://xuehuayu.cn/article/22230.html</a></li><li class="post-copyright-license"><strong>版权声明:</strong>① 标为原创的文章为博主原创,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接。② 转载文章来自网络,已标明出处,<a href="mailto:cainiaoblog@126.com">侵删</a>。</li></ul></div><br><div class="tags"><a href="/tags/%E8%BD%AC%E8%BD%BD/">转载</a></div><div class="post-nav"><a class="pre" href="/article/38005.html">寒冬求职季之你必须要懂的原生JS(上)</a><a class="next" href="/article/38423.html">高频面试题深入解析/ 周刊 06</a></div><div id="vcomment"></div><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@waline/client@v2/dist/waline.min.css"><script src="//cdn.jsdelivr.net/npm/@waline/client@v2/dist/waline.js"></script><script>const origin = window.location.origin
|
|
387
|
-
const serverURL = origin.includes('cainiaoblog') ? 'https://cmts.cainiaoblog.cn' : 'https://cmts.xuehuayu.cn'
|
|
388
|
-
const locale = {
|
|
389
|
-
placeholder: '请正确填写昵称和邮箱,方便接收回复通知~',
|
|
390
|
-
sofa: '沙发空缺中,还不快抢~',
|
|
391
|
-
};
|
|
392
|
-
Waline.init({
|
|
393
|
-
el: '#vcomment',
|
|
394
|
-
serverURL: serverURL,
|
|
395
|
-
pageSize: '20',
|
|
396
|
-
visitor: true, // 阅读量统计
|
|
397
|
-
requiredMeta: ['nick', 'mail'],
|
|
398
|
-
emoji: [
|
|
399
|
-
'https://cdn.jsdelivr.net/gh/walinejs/emojis@1.0.0/weibo',
|
|
400
|
-
'https://cdn.jsdelivr.net/gh/walinejs/emojis@1.0.0/qq',
|
|
401
|
-
'https://cdn.jsdelivr.net/gh/walinejs/emojis@1.0.0/tw-emoji',
|
|
402
|
-
],
|
|
403
|
-
locale,
|
|
404
|
-
pageview: true
|
|
405
|
-
})
|
|
406
|
-
</script></div></div></div><div class="pure-u-1 pure-u-md-1-4 fixed-search hidden_mid_and_down"><div id="sidebar"><script type="text/javascript" src="//cdn.jsdelivr.net/npm/cainiaoblog@latest/js/search.min.js"></script><div class="widget"><div class="widget-search"><input class="search" type="radio" name="search" value="baidu" id="baidu" checked="checked"/><label class="label" for="baidu" title="百度全站搜索">百度</label><input class="search" type="radio" name="search" value="google" id="google"/><label class="label" for="google" title="谷歌全站搜索">谷歌</label><input class="search" type="radio" name="search" value="self" id="self"/><label class="label" for="self" title="使用站内搜索">站内</label></div><div class="widget" id="search"><form class="search-form" action="//www.baidu.com/baidu" method="get" accept-charset="utf-8" target="_blank"><input type="search" name="word" maxlength="30" placeholder="百度全站搜索"/><input type="hidden" name="si" value="xuehuayu.cn"/><input type="hidden" name="cl" value="3"/><input type="hidden" name="ct" value="2097152"/><input type="hidden" name="s" value="on"/><input class="search-submit" type="submit" value=""/></form></div></div><script>$('input[type=radio][name=search]').change(function() {
|
|
407
|
-
var val = $(this).val()
|
|
408
|
-
var self = '<div class="search-form"><input id="local-search-input" placeholder="站内搜索,首次慢" type="search" name="q" results="0"><input class="search-submit" type="submit" value=""/><div id="local-search-result"></div></div>'
|
|
409
|
-
var google = '<form class="search-form" action="//www.google.com/search" method="get" accept-charset="utf-8" target="_blank"><input type="search" name="q" maxlength="30" placeholder="谷歌全站搜索"><input type="hidden" name="sitesearch" value="xuehuayu.cn"><input class="search-submit" type="submit" value=""/></form>'
|
|
410
|
-
var baidu = '<form class="search-form" action="//www.baidu.com/baidu" method="get" accept-charset="utf-8" target="_blank"><input type="search" name="word" maxlength="30" placeholder="百度全站搜索"><input type="hidden" name="si" value="xuehuayu.cn"><input type="hidden" name="cl" value="3"><input type="hidden" name="ct" value="2097152"><input type="hidden" name="s" value="on"><input class="search-submit" type="submit" value=""/></form>'
|
|
411
|
-
|
|
412
|
-
if (val === 'self') {
|
|
413
|
-
$('#search').html(self)
|
|
414
|
-
var search_path = 'search.xml';
|
|
415
|
-
if (search_path.length == 0) {
|
|
416
|
-
search_path = 'search.xml';
|
|
417
|
-
}
|
|
418
|
-
var path = 'https://cdn.staticaly.com/gh/npljy/npljy.github.io/main/' + search_path;
|
|
419
|
-
searchFunc(path, 'local-search-input', 'local-search-result');
|
|
420
|
-
} else if (val === 'baidu') {
|
|
421
|
-
$('#search').html(baidu)
|
|
422
|
-
} else if (val === 'google') {
|
|
423
|
-
$('#search').html(google)
|
|
424
|
-
}
|
|
425
|
-
})</script><div class="widget widget-wxmp"><img alt="微信公众号" width="100%" src="//cdn.staticaly.com/gh/npljy/npljy.github.io/main/img/mp-mini.jpg"/></div><div class="widget widget-categories"><div class="widget-title"><i class="fa fa-folder-o"> 分类</i></div><ul class="category-list"><li class="category-list-item"><a class="category-list-link" href="/categories/CDN/">CDN</a><span class="category-list-count">2</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/IDE/">IDE</a><span class="category-list-count">1</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/git/">git</a><span class="category-list-count">2</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/hexo/">hexo</a><span class="category-list-count">1</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/%E5%85%AC%E5%85%B1%E8%8A%82%E6%97%A5/">公共节日</a><span class="category-list-count">1</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/%E5%88%86%E4%BA%AB/">分享</a><span class="category-list-count">29</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/%E5%89%8D%E7%AB%AF/">前端</a><span class="category-list-count">190</span><ul class="category-list-child"><li class="category-list-item"><a class="category-list-link" href="/categories/%E5%89%8D%E7%AB%AF/%E6%B5%8F%E8%A7%88%E5%99%A8/">浏览器</a><span class="category-list-count">1</span><ul class="category-list-child"><li class="category-list-item"><a class="category-list-link" href="/categories/%E5%89%8D%E7%AB%AF/%E6%B5%8F%E8%A7%88%E5%99%A8/%E7%BD%91%E7%BB%9C%E5%8D%8F%E8%AE%AE/">网络协议</a><span class="category-list-count">1</span></li></ul></li></ul></li><li class="category-list-item"><a class="category-list-link" href="/categories/%E5%8D%9A%E5%AE%A2/">博客</a><span class="category-list-count">3</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/%E5%B7%A5%E5%85%B7/">工具</a><span class="category-list-count">2</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/%E5%B9%BF%E5%91%8A%E8%BF%87%E6%BB%A4/">广告过滤</a><span class="category-list-count">8</span><ul class="category-list-child"><li class="category-list-item"><a class="category-list-link" href="/categories/%E5%B9%BF%E5%91%8A%E8%BF%87%E6%BB%A4/%E5%BD%B1%E8%A7%86%E7%94%B5%E8%A7%86%E5%B0%8F%E8%AF%B4%E6%BC%AB%E7%94%BB%E8%B5%84%E8%AE%AF%E9%9F%B3%E4%B9%90/">影视电视小说漫画资讯音乐</a><span class="category-list-count">1</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/%E5%B9%BF%E5%91%8A%E8%BF%87%E6%BB%A4/%E8%A7%86%E9%A2%91%E7%94%B5%E8%A7%86%E5%B0%8F%E8%AF%B4%E6%BC%AB%E7%94%BB%E8%B5%84%E8%AE%AF%E9%9F%B3%E4%B9%90/">视频电视小说漫画资讯音乐</a><span class="category-list-count">1</span></li></ul></li><li class="category-list-item"><a class="category-list-link" href="/categories/%E6%AD%A3%E5%88%99/">正则</a><span class="category-list-count">5</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/%E6%B5%8F%E8%A7%88%E5%99%A8/">浏览器</a><span class="category-list-count">5</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/%E7%AE%97%E6%B3%95/">算法</a><span class="category-list-count">2</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/%E8%B5%84%E8%AE%AF/">资讯</a><span class="category-list-count">16</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/%E8%BD%BB%E6%9D%BE%E4%B8%80%E5%88%BB/">轻松一刻</a><span class="category-list-count">1</span></li></ul></div><div class="widget widget-tags"><div class="widget-title"><i class="fa fa-star-o"> 标签</i></div><div class="tagcloud"><a href="/tags/%E5%8E%9F%E5%88%9B/" style="font-size: 15px;">原创</a> <a href="/tags/%E8%BD%AC%E8%BD%BD/" style="font-size: 15px;">转载</a> <a href="/tags/%E6%89%8B%E5%86%99/" style="font-size: 15px;">手写</a> <a href="/tags/%E7%96%AB%E6%83%85/" style="font-size: 15px;">疫情</a> <a href="/tags/%E5%A8%B1%E4%B9%90/" style="font-size: 15px;">娱乐</a></div></div><div class="widget widget-recent-posts"><div class="widget-title"><i class="fa fa-file-o"> 最近文章</i></div><ul class="post-list"><li class="post-list-item"><a class="post-list-link" href="/article/9c3c56c.html">vue、react、webpack、babel</a></li><li class="post-list-item"><a class="post-list-link" href="/article/84c9ccd6.html">精读《SolidJS》</a></li><li class="post-list-item"><a class="post-list-link" href="/article/53803e6.html">git提交注释规范</a></li><li class="post-list-item"><a class="post-list-link" href="/article/a4145266.html">前端数组拍平flat一行代码</a></li><li class="post-list-item"><a class="post-list-link" href="/article/bedea419.html">一道前端this面试题</a></li><li class="post-list-item"><a class="post-list-link" href="/article/bf7e7421.html">git多账号配置</a></li></ul></div><div class="widget widget-links"><div class="widget-title"><i class="fa fa-external-link"> 友情链接</i></div><ul></ul><a href="https://github.com/npljy?utm_source=xuehuayu.cn" title="GitHub" target="_blank">GitHub</a><ul></ul><a href="https://laonongmin.online?utm_source=xuehuayu.cn" title="看看" target="_blank">看看</a><ul></ul><a href="https://cainiaoblog.cn?utm_source=xuehuayu.cn" title="菜鸟博客" target="_blank">菜鸟博客</a><ul></ul><a href="mailto:cainiaoblog@126.com" title="友链联系" target="_blank">友链联系</a></div></div></div><div class="pure-u-1 pure-u-md-3-4"><div id="footer"><div class="flex-block justify-center align-center flex-wrap"><a class="gxba-link" id="gxba" rel="nofollow" target="_blank" href="http://beian.miit.gov.cn/">京ICP备20007647号-2</a><a class="gaba-link" id="gaba-link" rel="nofollow" target="_blank" href="http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=11010802031264"><img class="nofancybox" src="//cdn.staticaly.com/gh/npljy/npljy.github.io/main/img/gaba.png" alt=""/><span id="gaba">京公网安备 11010802031264号</span><span style="padding-right: 10px;"></span></a><span>Copyright © 2023 </span><a href="/." rel="nofollow">前端壹菜鸟. </a><script>(function(){
|
|
426
|
-
var cnb =window.location.origin.indexOf('cainiaoblog') !==-1
|
|
427
|
-
if (cnb) {
|
|
428
|
-
var gxba =document.getElementById('gxba')
|
|
429
|
-
var gaba =document.getElementById('gaba')
|
|
430
|
-
var gabaLink =document.getElementById('gaba-link')
|
|
431
|
-
gxba.innerText ='京ICP备20007647号-1'
|
|
432
|
-
gaba.innerText ='京公网安备 11010802031254号'
|
|
433
|
-
gabaLink.setAttribute('href','http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=11010802031254')
|
|
434
|
-
}
|
|
435
|
-
})()</script></div><div class="flex-block justify-center align-center flex-wrap"><a rel="nofollow" target="_blank" href="https://v6.51.la/s/Guz3lwHCsVme9Cu"><div class="busuanzi_container" id="busuanzi_container"><span class="busuanzi_container_site_pv" id="busuanzi_container_site_pv">访问量:<span id="busuanzi_value_site_pv"><i class="fa fa-spinner"></i></span></span><span class="busuanzi_container_site_uv" id="busuanzi_container_site_uv">访客数:<span id="busuanzi_value_site_uv"><i class="fa fa-spinner"></i></span></span><span style="padding-right: 10px;"></span></div></a><a rel="nofollow" target="_blank" href="https://www.upyun.com/?utm_source=lianmeng&utm_medium=referral"><span style="font-weight:bold;letter-spacing: 1px;">本网站由 </span><img class="nofancybox" height="32" style="vertical-align: middle" src="//cdn.staticaly.com/gh/npljy/npljy.github.io/main/img/upy_logo.min.svg" alt=""/><span style="font-weight:bold;letter-spacing: 1px;">提供CDN加速/云存储服务</span></a><span style="padding-right: 10px;"></span><a rel="nofollow" style="font-size:18px;font-weight:bold;vertical-align: middle" target="_blank" title="注册就送代金券可直接使用" href="https://console.upyun.com/register/?invite=HyDsjZHIL">注册</a></div></div></div></div><a class="show" id="rocket" href="#top"></a><div class="darkmode-toggle">🌓</div><script type="text/javascript" src="//cdn.jsdelivr.net/npm/cainiaoblog@latest/js/totop.min.js" async></script><script type="text/javascript" src="//cdn.jsdelivr.net/npm/cainiaoblog@latest/js/dark.min.js" async></script><script type="text/javascript" src="//cdn.jsdelivr.net/npm/cainiaoblog@latest/js/codeblock-resizer.min.js"></script><script type="text/javascript" src="//cdn.jsdelivr.net/npm/cainiaoblog@latest/js/smartresize.min.js"></script></div></body></html>
|