cainiaoblog 23.2.171
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/CNAME +1 -0
- package/MP_verify_o6dHCK5mIkxNpzvZ.txt +1 -0
- package/README.md +8 -0
- package/about/index.html +54 -0
- package/ads.txt +1 -0
- package/app/manual.html +104 -0
- package/appConfigs/config +1 -0
- package/archives/2018/index.html +48 -0
- package/archives/2019/index.html +48 -0
- package/archives/2019/page/2/index.html +48 -0
- package/archives/2020/index.html +48 -0
- package/archives/2021/index.html +48 -0
- package/archives/2022/index.html +48 -0
- package/archives/2023/index.html +48 -0
- package/archives/index.html +48 -0
- package/archives/page/2/index.html +48 -0
- package/archives/page/3/index.html +48 -0
- package/article/10047.html +148 -0
- package/article/10164.html +64 -0
- package/article/10624.html +436 -0
- package/article/10745.html +586 -0
- package/article/11674.html +71 -0
- package/article/11939.html +72 -0
- package/article/12238.html +86 -0
- package/article/1230.html +533 -0
- package/article/13265.html +69 -0
- package/article/13823.html +78 -0
- package/article/14125.html +72 -0
- package/article/14192.html +561 -0
- package/article/14375.html +85 -0
- package/article/14744.html +83 -0
- package/article/14936.html +451 -0
- package/article/1518.html +250 -0
- package/article/15428.html +71 -0
- package/article/15518.html +288 -0
- package/article/15569.html +418 -0
- package/article/1566.html +122 -0
- package/article/16017.html +156 -0
- package/article/16947.html +440 -0
- package/article/17096.html +82 -0
- package/article/17246.html +89 -0
- package/article/17575.html +350 -0
- package/article/179.html +757 -0
- package/article/18039.html +233 -0
- package/article/18071.html +375 -0
- package/article/18142.html +71 -0
- package/article/19909.html +160 -0
- package/article/20014.html +89 -0
- package/article/20021.html +389 -0
- package/article/20037.html +280 -0
- package/article/20056.html +95 -0
- package/article/20093.html +404 -0
- package/article/2021.html +607 -0
- package/article/20459.html +115 -0
- package/article/20613.html +263 -0
- package/article/20635.html +71 -0
- package/article/21317.html +71 -0
- package/article/21320.html +90 -0
- package/article/21782.html +548 -0
- package/article/22230.html +435 -0
- package/article/22237.html +347 -0
- package/article/22398.html +109 -0
- package/article/22422.html +270 -0
- package/article/22565.html +300 -0
- package/article/23046.html +250 -0
- package/article/23083.html +215 -0
- package/article/23195.html +297 -0
- package/article/23301.html +835 -0
- package/article/23589.html +285 -0
- package/article/23655.html +338 -0
- package/article/23864.html +76 -0
- package/article/23914.html +96 -0
- package/article/24169.html +135 -0
- package/article/24581.html +349 -0
- package/article/2475.html +500 -0
- package/article/24826.html +77 -0
- package/article/24924.html +247 -0
- package/article/25164.html +1495 -0
- package/article/25318.html +394 -0
- package/article/25710.html +1129 -0
- package/article/25734.html +83 -0
- package/article/26083.html +174 -0
- package/article/26147.html +283 -0
- package/article/26291.html +110 -0
- package/article/26354.html +71 -0
- package/article/26624.html +145 -0
- package/article/26639.html +298 -0
- package/article/26850.html +138 -0
- package/article/26940.html +258 -0
- package/article/27796.html +190 -0
- package/article/27800.html +161 -0
- package/article/28963.html +159 -0
- package/article/28976.html +247 -0
- package/article/29042.html +72 -0
- package/article/29596.html +81 -0
- package/article/29619.html +183 -0
- package/article/29623.html +329 -0
- package/article/29829.html +205 -0
- package/article/29abbd1c.html +112 -0
- package/article/30215.html +178 -0
- package/article/30552.html +78 -0
- package/article/30818.html +201 -0
- package/article/31330.html +364 -0
- package/article/3154.html +577 -0
- package/article/31695.html +348 -0
- package/article/31826.html +71 -0
- package/article/31843.html +132 -0
- package/article/32280.html +212 -0
- package/article/32431.html +74 -0
- package/article/32443.html +72 -0
- package/article/32732.html +122 -0
- package/article/3286.html +251 -0
- package/article/32960.html +198 -0
- package/article/33713.html +72 -0
- package/article/33899.html +615 -0
- package/article/34351.html +74 -0
- package/article/34372.html +89 -0
- package/article/34410.html +74 -0
- package/article/34431.html +118 -0
- package/article/3447.html +75 -0
- package/article/34474.html +142 -0
- package/article/34871.html +147 -0
- package/article/35397.html +175 -0
- package/article/3544.html +199 -0
- package/article/35503.html +115 -0
- package/article/35624.html +84 -0
- package/article/35697.html +384 -0
- package/article/35863.html +73 -0
- package/article/36037.html +253 -0
- package/article/36118.html +71 -0
- package/article/3621.html +119 -0
- package/article/36251.html +296 -0
- package/article/36642.html +352 -0
- package/article/37102.html +763 -0
- package/article/37336.html +351 -0
- package/article/37351.html +89 -0
- package/article/3760.html +294 -0
- package/article/37749.html +75 -0
- package/article/37789.html +83 -0
- package/article/38005.html +765 -0
- package/article/38009.html +284 -0
- package/article/38269.html +194 -0
- package/article/38344.html +88 -0
- package/article/38359.html +334 -0
- package/article/38423.html +379 -0
- package/article/38530.html +213 -0
- package/article/38743.html +268 -0
- package/article/38753.html +204 -0
- package/article/38881.html +71 -0
- package/article/39087.html +414 -0
- package/article/39309.html +84 -0
- package/article/39486.html +74 -0
- package/article/39637.html +306 -0
- package/article/39839.html +72 -0
- package/article/39937.html +152 -0
- package/article/39970.html +71 -0
- package/article/402.html +559 -0
- package/article/40698.html +71 -0
- package/article/40811.html +71 -0
- package/article/40964.html +462 -0
- package/article/41011.html +322 -0
- package/article/41152.html +78 -0
- package/article/41696.html +71 -0
- package/article/41717.html +281 -0
- package/article/41777.html +149 -0
- package/article/419.html +985 -0
- package/article/4233.html +136 -0
- package/article/4292.html +86 -0
- package/article/43302.html +96 -0
- package/article/43397.html +106 -0
- package/article/43724.html +281 -0
- package/article/43999.html +224 -0
- package/article/44426.html +77 -0
- package/article/44964.html +137 -0
- package/article/45004.html +123 -0
- package/article/4510.html +83 -0
- package/article/45156.html +320 -0
- package/article/45157.html +52 -0
- package/article/45267.html +87 -0
- package/article/45641.html +207 -0
- package/article/45960.html +75 -0
- package/article/46100.html +1262 -0
- package/article/46366.html +74 -0
- package/article/46771.html +96 -0
- package/article/46911.html +517 -0
- package/article/46948.html +137 -0
- package/article/46ee4850.html +349 -0
- package/article/47019.html +84 -0
- package/article/47532.html +94 -0
- package/article/4783.html +429 -0
- package/article/47972.html +72 -0
- package/article/48216.html +127 -0
- package/article/48252.html +185 -0
- package/article/48520.html +74 -0
- package/article/48722.html +75 -0
- package/article/48807.html +99 -0
- package/article/49126.html +323 -0
- package/article/50001.html +88 -0
- package/article/50058.html +151 -0
- package/article/50343.html +410 -0
- package/article/50510.html +82 -0
- package/article/51082.html +98 -0
- package/article/51677.html +111 -0
- package/article/5204.html +1085 -0
- package/article/52500.html +538 -0
- package/article/52689.html +259 -0
- package/article/52877.html +569 -0
- package/article/53125.html +191 -0
- package/article/53428.html +251 -0
- package/article/53524.html +74 -0
- package/article/53698.html +322 -0
- package/article/53803e6.html +93 -0
- package/article/53924.html +291 -0
- package/article/53962.html +253 -0
- package/article/54006.html +71 -0
- package/article/54018.html +88 -0
- package/article/54161.html +83 -0
- package/article/54178.html +69 -0
- package/article/54258.html +327 -0
- package/article/54295.html +214 -0
- package/article/54313.html +1976 -0
- package/article/54351.html +90 -0
- package/article/54604.html +80 -0
- package/article/54632.html +71 -0
- package/article/54912.html +756 -0
- package/article/54918.html +129 -0
- package/article/55119.html +136 -0
- package/article/55756.html +118 -0
- package/article/55769.html +136 -0
- package/article/55870.html +161 -0
- package/article/56139.html +92 -0
- package/article/56557.html +69 -0
- package/article/56604.html +69 -0
- package/article/56816.html +266 -0
- package/article/56926.html +153 -0
- package/article/57747.html +409 -0
- package/article/57965.html +475 -0
- package/article/58816.html +78 -0
- package/article/59059.html +435 -0
- package/article/59095.html +350 -0
- package/article/59349.html +244 -0
- package/article/59402.html +216 -0
- package/article/59448.html +55 -0
- package/article/59870.html +94 -0
- package/article/59877.html +208 -0
- package/article/5dbb6f41.html +86 -0
- package/article/6008.html +75 -0
- package/article/60327.html +126 -0
- package/article/6035.html +76 -0
- package/article/60428.html +71 -0
- package/article/60544.html +128 -0
- package/article/61319.html +95 -0
- package/article/61367.html +93 -0
- package/article/624d1918.html +292 -0
- package/article/62543.html +71 -0
- package/article/62887.html +169 -0
- package/article/63074.html +120 -0
- package/article/63266.html +311 -0
- package/article/63351.html +74 -0
- package/article/63542.html +104 -0
- package/article/63824.html +275 -0
- package/article/64051.html +653 -0
- package/article/64189b69.html +72 -0
- package/article/64354.html +75 -0
- package/article/64869.html +79 -0
- package/article/64923.html +596 -0
- package/article/65128.html +95 -0
- package/article/65295.html +79 -0
- package/article/6888.html +75 -0
- package/article/7065.html +84 -0
- package/article/7455.html +85 -0
- package/article/7a3ef8f.html +315 -0
- package/article/8140.html +188 -0
- package/article/8190.html +85 -0
- package/article/8225.html +78 -0
- package/article/84c9ccd6.html +159 -0
- package/article/8f9a9ae3.html +82 -0
- package/article/9174.html +73 -0
- package/article/9738.html +294 -0
- package/article/a4145266.html +71 -0
- package/article/bedea419.html +72 -0
- package/article/bf7e7421.html +78 -0
- package/article/c1867fbf.html +103 -0
- package/article/c5576490.html +70 -0
- package/article/dcb0db28.html +76 -0
- package/article/fc3b727a.html +79 -0
- package/atom.xml +445 -0
- package/baidusitemap.xml +1079 -0
- package/blocks/dns.txt +264 -0
- package/blocks/filter.txt +1070 -0
- package/blocks/script.js +42 -0
- package/categories/CDN/index.html +48 -0
- package/categories/IDE/index.html +48 -0
- package/categories/git/index.html +48 -0
- package/categories/hexo/index.html +48 -0
- package/categories//345/205/254/345/205/261/350/212/202/346/227/245/index.html +48 -0
- package/categories//345/210/206/344/272/253/index.html +48 -0
- package/categories//345/211/215/347/253/257/index.html +48 -0
- package/categories//345/211/215/347/253/257/page/2/index.html +48 -0
- package/categories//345/211/215/347/253/257//346/265/217/350/247/210/345/231/250/index.html +48 -0
- 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 +48 -0
- package/categories//345/215/232/345/256/242/index.html +48 -0
- package/categories//345/267/245/345/205/267/index.html +48 -0
- package/categories//345/271/277/345/221/212/350/277/207/346/273/244/index.html +48 -0
- 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 +48 -0
- package/categories//346/255/243/345/210/231/index.html +48 -0
- package/categories//346/265/217/350/247/210/345/231/250/index.html +48 -0
- package/categories//347/256/227/346/263/225/index.html +48 -0
- package/categories//350/265/204/350/256/257/index.html +48 -0
- package/categories//350/275/273/346/235/276/344/270/200/345/210/273/index.html +48 -0
- package/cdn/css/font-awesome.min.css +4 -0
- package/cdn/css/grids-responsive-min.css +7 -0
- package/cdn/css/normalize.css +349 -0
- package/cdn/css/pure-min.css +11 -0
- package/cdn/fonts/fontawesome-webfont.eot +0 -0
- package/cdn/fonts/fontawesome-webfont.svg +2671 -0
- 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 +17 -0
- package/cdn/js/canvas-nest.js +1 -0
- package/cdn/js/clipboard.min.js +7 -0
- package/cdn/js/crypto-js.js +25 -0
- package/cdn/js/jquery.min.js +2 -0
- package/css/default.css +1144 -0
- package/css/donate.css +338 -0
- package/css/hbe.style.css +749 -0
- package/css/style.css +2095 -0
- package/donate/index.html +39 -0
- package/google917dcf72f6e5c7f5.html +1 -0
- package/guestbook/index.html +68 -0
- package/hosts/ads.txt +149 -0
- package/hosts/flash.txt +9 -0
- package/hosts/github.txt +6 -0
- package/hosts/google.txt +16936 -0
- package/hosts/winrar.txt +2 -0
- package/img/alipay.svg +46 -0
- package/img/bitcoin.svg +135 -0
- package/img/blog.ico +0 -0
- package/img/blog.png +0 -0
- package/img/gaba.png +0 -0
- package/img/github.svg +1 -0
- package/img/like.svg +1 -0
- package/img/mp-mini.jpg +0 -0
- package/img/mp.png +0 -0
- package/img/paypal.svg +63 -0
- package/img/upy_logo.svg +59 -0
- package/img/wechat.svg +49 -0
- package/index.html +48 -0
- package/jd_root.txt +1 -0
- package/js/codeblock-resizer.js +51 -0
- package/js/dark.js +12 -0
- package/js/donate.js +87 -0
- package/js/fixedPage.js +106 -0
- package/js/gitment.browser.js +3751 -0
- package/js/search.js +86 -0
- package/js/share.js +60 -0
- package/js/smartresize.js +32 -0
- package/js/totop.js +12 -0
- package/kankan/index.html +77 -0
- package/lib/hbe.js +293 -0
- package/package.json +25 -0
- package/page/10/index.html +49 -0
- package/page/11/index.html +59 -0
- package/page/12/index.html +67 -0
- package/page/13/index.html +63 -0
- package/page/14/index.html +66 -0
- package/page/15/index.html +60 -0
- package/page/16/index.html +60 -0
- package/page/17/index.html +62 -0
- package/page/18/index.html +61 -0
- package/page/19/index.html +58 -0
- package/page/2/index.html +48 -0
- package/page/20/index.html +57 -0
- package/page/21/index.html +61 -0
- package/page/22/index.html +55 -0
- package/page/23/index.html +64 -0
- package/page/24/index.html +60 -0
- package/page/25/index.html +58 -0
- package/page/26/index.html +48 -0
- package/page/27/index.html +58 -0
- package/page/3/index.html +48 -0
- package/page/4/index.html +48 -0
- package/page/5/index.html +51 -0
- package/page/6/index.html +51 -0
- package/page/7/index.html +51 -0
- package/page/8/index.html +53 -0
- package/page/9/index.html +48 -0
- package/randomcall/README.html +1 -0
- package/randomcall/lucker.html +290 -0
- package/randomcall/lucky.png +0 -0
- package/robots.txt +22 -0
- package/search.xml +6740 -0
- package/sitemap.xml +2669 -0
- package/tags//345/216/237/345/210/233/index.html +48 -0
- package/tags//345/250/261/344/271/220/index.html +48 -0
- package/tags//346/211/213/345/206/231/index.html +48 -0
- package/tags//347/226/253/346/203/205/index.html +48 -0
- package/tags//350/275/254/350/275/275/index.html +48 -0
- package/tags//350/275/254/350/275/275/page/2/index.html +48 -0
- package/v.html +90 -0
|
@@ -0,0 +1,548 @@
|
|
|
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>高频面试题深入解析/ 周刊 02 | 前端壹菜鸟</title><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/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.staticaly.com/gh/npljy/npljy.github.io/main/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">高频面试题深入解析/ 周刊 02</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"> 4.8k</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"> 20</span><span class="post-meta-item-text"> 分钟</span></span></span></div><a class="disqus-comment-count" href="/article/21782.html#vcomment"><span class="waline-comment-count" data-path="/article/21782.html"></span><span> 条评论</span></a><div class="post-content"><p><code>原文地址:https://github.com/YvetteLau/Blog/issues/32</code></p>
|
|
20
|
+
<span id="more"></span>
|
|
21
|
+
<h3 id="关于【Step-By-Step】"><a href="#关于【Step-By-Step】" class="headerlink" title="关于【Step-By-Step】"></a>关于【Step-By-Step】</h3><blockquote>
|
|
22
|
+
<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>
|
|
23
|
+
</blockquote>
|
|
24
|
+
<hr>
|
|
25
|
+
<blockquote>
|
|
26
|
+
<p>本周面试题一览:</p>
|
|
27
|
+
</blockquote>
|
|
28
|
+
<ul>
|
|
29
|
+
<li>节流(throttle)函数的作用是什么?有哪些应用场景,请实现一个节流函数</li>
|
|
30
|
+
<li>说一说你对JS执行上下文栈和作用域链的理解?</li>
|
|
31
|
+
<li>什么是BFC?BFC的布局规则是什么?如何创建BFC?</li>
|
|
32
|
+
<li>let、const、var 的区别有哪些?</li>
|
|
33
|
+
<li>深拷贝和浅拷贝的区别是什么?如何实现一个深拷贝?</li>
|
|
34
|
+
</ul>
|
|
35
|
+
<h3 id="6-节流-throttle-函数的作用是什么?有哪些应用场景,请实现一个节流函数。-2019-05-27"><a href="#6-节流-throttle-函数的作用是什么?有哪些应用场景,请实现一个节流函数。-2019-05-27" class="headerlink" title="6. 节流(throttle)函数的作用是什么?有哪些应用场景,请实现一个节流函数。(2019-05-27)"></a>6. 节流(throttle)函数的作用是什么?有哪些应用场景,请实现一个节流函数。(2019-05-27)</h3><h4 id="节流函数的作用"><a href="#节流函数的作用" class="headerlink" title="节流函数的作用"></a>节流函数的作用</h4><p>节流函数的作用是规定一个单位时间,在这个单位时间内最多只能触发一次函数执行,如果这个单位时间内多次触发函数,只能有一次生效。</p>
|
|
36
|
+
<p>举例说明:小明的妈妈和小明约定好,如果小明在周考中取得满分,那么当月可以带他去游乐场玩,但是一个月最多只能去一次。</p>
|
|
37
|
+
<p>这其实就是一个节流的例子,在一个月的时间内,去游乐场最多只能触发一次。即使这个时间周期内,小明取得多次满分。</p>
|
|
38
|
+
<h4 id="节流应用场景"><a href="#节流应用场景" class="headerlink" title="节流应用场景"></a>节流应用场景</h4><p>1.按钮点击事件</p>
|
|
39
|
+
<p>2.拖拽事件</p>
|
|
40
|
+
<p>3.onScoll</p>
|
|
41
|
+
<p>4.计算鼠标移动的距离(mousemove)</p>
|
|
42
|
+
<h4 id="节流函数实现"><a href="#节流函数实现" class="headerlink" title="节流函数实现"></a>节流函数实现</h4><blockquote>
|
|
43
|
+
<p>利用时间戳实现</p>
|
|
44
|
+
</blockquote>
|
|
45
|
+
<pre><code>functionthrottle (func, delay) {
|
|
46
|
+
var lastTime =0;
|
|
47
|
+
functionthrottled() {
|
|
48
|
+
var context =this;
|
|
49
|
+
var args =arguments;
|
|
50
|
+
var nowTime =Date.now();
|
|
51
|
+
if(nowTime > lastTime + delay) {
|
|
52
|
+
func.apply(context, args);
|
|
53
|
+
lastTime = nowTime;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
//防抖函数最终返回的是一个函数return throttled;
|
|
57
|
+
}
|
|
58
|
+
</code></pre>
|
|
59
|
+
<blockquote>
|
|
60
|
+
<p>利用定时器实现</p>
|
|
61
|
+
</blockquote>
|
|
62
|
+
<pre><code>functionthrottle(func, delay) {
|
|
63
|
+
var timeout =null;
|
|
64
|
+
functionthrottled() {
|
|
65
|
+
var context =this;
|
|
66
|
+
var args =arguments;
|
|
67
|
+
if(!timeout) {
|
|
68
|
+
timeout =setTimeout(()=>{
|
|
69
|
+
func.apply(context, args);
|
|
70
|
+
clearTimeout(timeout);
|
|
71
|
+
timeout=null
|
|
72
|
+
}, delay);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return throttled;
|
|
76
|
+
}
|
|
77
|
+
</code></pre>
|
|
78
|
+
<p>时间戳和定时器的方式都没有考虑最后一次执行的问题,比如有个按钮点击事件,设置的间隔时间是1S,在第0.5S,1.8S,2.2S点击,那么只有0.5S和1.8S的两次点击能够触发函数执行,而最后一次的2.2S会被忽略。</p>
|
|
79
|
+
<blockquote>
|
|
80
|
+
<p>组合实现,允许设置第一次或者最后一次是否触发函数执行</p>
|
|
81
|
+
</blockquote>
|
|
82
|
+
<pre><code>functionthrottle (func, wait, options) {
|
|
83
|
+
var timeout, context, args, result;
|
|
84
|
+
var previous =0;
|
|
85
|
+
if (!options) options = {};
|
|
86
|
+
|
|
87
|
+
varlater=function () {
|
|
88
|
+
previous =options.leading===false?0:Date.now() ||newDate().getTime();
|
|
89
|
+
timeout =null;
|
|
90
|
+
result =func.apply(context, args);
|
|
91
|
+
if (!timeout) context = args =null;
|
|
92
|
+
};
|
|
93
|
+
|
|
94
|
+
varthrottled=function () {
|
|
95
|
+
var now =Date.now() ||newDate().getTime();
|
|
96
|
+
if (!previous &&options.leading===false) previous = now;
|
|
97
|
+
var remaining = wait - (now - previous);
|
|
98
|
+
context =this;
|
|
99
|
+
args =arguments;
|
|
100
|
+
if (remaining <=0|| remaining > wait) {
|
|
101
|
+
if (timeout) {
|
|
102
|
+
clearTimeout(timeout);
|
|
103
|
+
timeout =null;
|
|
104
|
+
}
|
|
105
|
+
previous = now;
|
|
106
|
+
result =func.apply(context, args);
|
|
107
|
+
if (!timeout) context = args =null;
|
|
108
|
+
} elseif (!timeout &&options.trailing!==false) {
|
|
109
|
+
// 判断是否设置了定时器和 trailing
|
|
110
|
+
timeout =setTimeout(later, remaining);
|
|
111
|
+
}
|
|
112
|
+
return result;
|
|
113
|
+
};
|
|
114
|
+
|
|
115
|
+
throttled.cancel=function () {
|
|
116
|
+
clearTimeout(timeout);
|
|
117
|
+
previous =0;
|
|
118
|
+
timeout = context = args =null;
|
|
119
|
+
};
|
|
120
|
+
|
|
121
|
+
return throttled;
|
|
122
|
+
}
|
|
123
|
+
</code></pre>
|
|
124
|
+
<p>使用很简单:</p>
|
|
125
|
+
<pre><code>btn.onclick=throttle(handle, 1000, {leading:true, trailing:true});
|
|
126
|
+
</code></pre>
|
|
127
|
+
<blockquote>
|
|
128
|
+
<p><a target="_blank" rel="noopener" href="https://github.com/YvetteLau/Step-By-Step/issues/12">点击查看更多</a></p>
|
|
129
|
+
</blockquote>
|
|
130
|
+
<h3 id="7-说一说你对JS执行上下文栈和作用域链的理解?-2019-05-28"><a href="#7-说一说你对JS执行上下文栈和作用域链的理解?-2019-05-28" class="headerlink" title="7. 说一说你对JS执行上下文栈和作用域链的理解?(2019-05-28)"></a>7. 说一说你对JS执行上下文栈和作用域链的理解?(2019-05-28)</h3><p>在开始说明JS上下文栈和作用域之前,我们先说明下JS上下文以及作用域的概念。</p>
|
|
131
|
+
<h4 id="JS执行上下文"><a href="#JS执行上下文" class="headerlink" title="JS执行上下文"></a><a target="_blank" rel="noopener" href="https://tc39.github.io/ecma262/?nsukey=rQHqMrFpKq6JJN//OeubPCslaSTSRyuc/XCznnIDze1SGzwva5SZtzixJ13p2gAlxua95Xa7fraZXwj5tyLRDK33+pNhyfKR/xyzhWNyB/qaIlsDGyQBckNoHQGPveOB24M+cK/gF8Tg1ehUGLWiCvumxdgcQwZOWj2BGfD3n/Y=#sec-execution-contexts">JS执行上下文</a></h4><p>执行上下文就是当前 JavaScript 代码被解析和执行时所在环境的抽象概念, JavaScript 中运行任何的代码都是在执行上下文中运行。</p>
|
|
132
|
+
<blockquote>
|
|
133
|
+
<p>执行上下文类型分为:</p>
|
|
134
|
+
</blockquote>
|
|
135
|
+
<ul>
|
|
136
|
+
<li>全局执行上下文</li>
|
|
137
|
+
<li>函数执行上下文</li>
|
|
138
|
+
<li>eval函数执行上下文(不被推荐)</li>
|
|
139
|
+
</ul>
|
|
140
|
+
<p>执行上下文创建过程中,需要做以下几件事:</p>
|
|
141
|
+
<ol>
|
|
142
|
+
<li>创建变量对象:首先初始化函数的参数arguments,提升函数声明和变量声明。</li>
|
|
143
|
+
<li>创建作用域链(Scope Chain):在执行期上下文的创建阶段,作用域链是在变量对象之后创建的。</li>
|
|
144
|
+
<li>确定this的值,即 ResolveThisBinding</li>
|
|
145
|
+
</ol>
|
|
146
|
+
<h4 id="作用域"><a href="#作用域" class="headerlink" title="作用域"></a>作用域</h4><p><strong>作用域</strong>负责收集和维护由所有声明的标识符(变量)组成的一系列查询,并实施一套非常严格的规则,确定当前执行的代码对这些标识符的访问权限。—— 摘录自《你不知道的JavaScript》(上卷)</p>
|
|
147
|
+
<p>作用域有两种工作模型:词法作用域和动态作用域,JS采用的是<strong>词法作用域</strong>工作模型,词法作用域意味着作用域是由书写代码时变量和函数声明的位置决定的。(<code>with</code> 和 <code>eval</code> 能够修改词法作用域,但是不推荐使用,对此不做特别说明)</p>
|
|
148
|
+
<blockquote>
|
|
149
|
+
<p>作用域分为:</p>
|
|
150
|
+
</blockquote>
|
|
151
|
+
<ul>
|
|
152
|
+
<li>全局作用域</li>
|
|
153
|
+
<li>函数作用域</li>
|
|
154
|
+
<li>块级作用域</li>
|
|
155
|
+
</ul>
|
|
156
|
+
<h4 id="JS执行上下文栈-后面简称执行栈"><a href="#JS执行上下文栈-后面简称执行栈" class="headerlink" title="JS执行上下文栈(后面简称执行栈)"></a>JS执行上下文栈(后面简称执行栈)</h4><p>执行栈,也叫做调用栈,具有 <strong>LIFO</strong> (后进先出) 结构,用于存储在代码执行期间创建的所有执行上下文。</p>
|
|
157
|
+
<blockquote>
|
|
158
|
+
<p>规则如下:</p>
|
|
159
|
+
</blockquote>
|
|
160
|
+
<ul>
|
|
161
|
+
<li>首次运行JavaScript代码的时候,会创建一个全局执行的上下文并Push到当前的执行栈中,每当发生函数调用,引擎都会为该函数创建一个新的函数执行上下文并Push当前执行栈的栈顶。</li>
|
|
162
|
+
<li>当栈顶的函数运行完成后,其对应的函数执行上下文将会从执行栈中Pop出,上下文的控制权将移动到当前执行栈的下一个执行上下文。</li>
|
|
163
|
+
</ul>
|
|
164
|
+
<p>以一段代码具体说明:</p>
|
|
165
|
+
<pre><code>functionfun3() {
|
|
166
|
+
console.log('fun3')
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
functionfun2() {
|
|
170
|
+
fun3();
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
functionfun1() {
|
|
174
|
+
fun2();
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
fun1();
|
|
178
|
+
</code></pre>
|
|
179
|
+
<p><code>Global Execution Context</code> (即全局执行上下文)首先入栈,过程如下:</p>
|
|
180
|
+
<p><a target="_blank" rel="noopener" href="https://camo.githubusercontent.com/91e9dd3b5bb10580e674c7a6dc6a0e23bd6a4412/68747470733a2f2f6e6f74652e796f7564616f2e636f6d2f7977732f7075626c69632f7265736f757263652f66343537303163633431303530346537316462626362643838363165386430632f786d6c6e6f74652f5745425245534f5552434536396264626461313461663038663333363831666563613032313665336239622f3239343435"><img src="https://camo.githubusercontent.com/91e9dd3b5bb10580e674c7a6dc6a0e23bd6a4412/68747470733a2f2f6e6f74652e796f7564616f2e636f6d2f7977732f7075626c69632f7265736f757263652f66343537303163633431303530346537316462626362643838363165386430632f786d6c6e6f74652f5745425245534f5552434536396264626461313461663038663333363831666563613032313665336239622f3239343435" alt="xuehuayu.cn"></a></p>
|
|
181
|
+
<p>伪代码:</p>
|
|
182
|
+
<pre><code>//全局执行上下文首先入栈ECStack.push(globalContext);
|
|
183
|
+
|
|
184
|
+
//执行fun1();ECStack.push(<fun1> functionContext);
|
|
185
|
+
|
|
186
|
+
//fun1中又调用了fun2;ECStack.push(<fun2> functionContext);
|
|
187
|
+
|
|
188
|
+
//fun2中又调用了fun3;ECStack.push(<fun3> functionContext);
|
|
189
|
+
|
|
190
|
+
//fun3执行完毕ECStack.pop();
|
|
191
|
+
|
|
192
|
+
//fun2执行完毕ECStack.pop();
|
|
193
|
+
|
|
194
|
+
//fun1执行完毕ECStack.pop();
|
|
195
|
+
|
|
196
|
+
//javascript继续顺序执行下面的代码,但ECStack底部始终有一个 全局上下文(globalContext);
|
|
197
|
+
</code></pre>
|
|
198
|
+
<h4 id="作用域链"><a href="#作用域链" class="headerlink" title="作用域链"></a>作用域链</h4><p>作用域链就是从当前作用域开始一层一层向上寻找某个变量,直到找到全局作用域还是没找到,就宣布放弃。这种一层一层的关系,就是作用域链。</p>
|
|
199
|
+
<p>如:</p>
|
|
200
|
+
<pre><code>var a =10;
|
|
201
|
+
functionfn1() {
|
|
202
|
+
var b =20;
|
|
203
|
+
console.log(fn2)
|
|
204
|
+
functionfn2() {
|
|
205
|
+
a =20
|
|
206
|
+
}
|
|
207
|
+
return fn2;
|
|
208
|
+
}
|
|
209
|
+
fn1()();
|
|
210
|
+
</code></pre>
|
|
211
|
+
<p>fn2作用域链 = [fn2作用域, fn1作用域,全局作用域]</p>
|
|
212
|
+
<p><a target="_blank" rel="noopener" href="https://camo.githubusercontent.com/67d8d95ca5726d90408b24ed9cf01ccbef32e769/68747470733a2f2f6e6f74652e796f7564616f2e636f6d2f7977732f7075626c69632f7265736f757263652f66343537303163633431303530346537316462626362643838363165386430632f786d6c6e6f74652f5745425245534f5552434531363630373963303963636534376633636164363632386539326137373434362f3239343339"><img src="https://camo.githubusercontent.com/67d8d95ca5726d90408b24ed9cf01ccbef32e769/68747470733a2f2f6e6f74652e796f7564616f2e636f6d2f7977732f7075626c69632f7265736f757263652f66343537303163633431303530346537316462626362643838363165386430632f786d6c6e6f74652f5745425245534f5552434531363630373963303963636534376633636164363632386539326137373434362f3239343339" alt="xuehuayu.cn"></a></p>
|
|
213
|
+
<h3 id="8-什么是BFC?BFC的布局规则是什么?如何创建BFC?-2019-05-29"><a href="#8-什么是BFC?BFC的布局规则是什么?如何创建BFC?-2019-05-29" class="headerlink" title="8. 什么是BFC?BFC的布局规则是什么?如何创建BFC?(2019-05-29)"></a>8. 什么是BFC?BFC的布局规则是什么?如何创建BFC?(2019-05-29)</h3><h4 id="什么是BFC"><a href="#什么是BFC" class="headerlink" title="什么是BFC"></a>什么是BFC</h4><p>BFC 是 Block Formatting Context 的缩写,即块格式化上下文。我们来看一下CSS2.1规范中对 BFC 的说明。</p>
|
|
214
|
+
<blockquote>
|
|
215
|
+
<p>Floats, absolutely positioned elements, block containers (such as inline-blocks, table-cells, and table-captions) that are not block boxes, and block boxes with ‘overflow’ other than ‘visible’ (except when that value has been propagated to the viewport) establish new block formatting contexts for their contents.<br>浮动、绝对定位的元素、非块级盒子的块容器(如inline-blocks、table-cells 和 table-captions),以及<code>overflow</code>的值不为<code>visible</code>(该值已传播到视区时除外)为其内容建立新的块格式上下文。</p>
|
|
216
|
+
</blockquote>
|
|
217
|
+
<p>因此,如果想要深入的理解BFC,我们需要了解以下两个概念:</p>
|
|
218
|
+
<blockquote>
|
|
219
|
+
<p>1.Box</p>
|
|
220
|
+
</blockquote>
|
|
221
|
+
<blockquote>
|
|
222
|
+
<p>2.Formatting Context</p>
|
|
223
|
+
</blockquote>
|
|
224
|
+
<h4 id="Box"><a href="#Box" class="headerlink" title="Box"></a>Box</h4><p>Box 是 CSS 布局的对象和基本单位,页面是由若干个Box组成的。</p>
|
|
225
|
+
<p>元素的类型 和 <code>display</code> 属性,决定了这个 Box 的类型。不同类型的 Box 会参与不同的 Formatting Context。</p>
|
|
226
|
+
<h4 id="Formatting-Context"><a href="#Formatting-Context" class="headerlink" title="Formatting Context"></a>Formatting Context</h4><p>Formatting Context 是页面的一块渲染区域,并且有一套渲染规则,决定了其子元素将如何定位,以及和其它元素的关系和相互作用。</p>
|
|
227
|
+
<p>Formatting Context 有 BFC (Block formatting context),IFC (Inline formatting context),FFC (Flex formatting context) 和 GFC (Grid formatting context)。FFC 和 GFC 为 CC3 中新增。</p>
|
|
228
|
+
<h4 id="BFC布局规则"><a href="#BFC布局规则" class="headerlink" title="BFC布局规则"></a><a target="_blank" rel="noopener" href="https://www.w3.org/TR/2011/REC-CSS2-20110607/visuren.html#block-formatting">BFC布局规则</a></h4><ul>
|
|
229
|
+
<li>BFC内,盒子依次垂直排列。</li>
|
|
230
|
+
<li>BFC内,两个盒子的垂直距离由 <code>margin</code> 属性决定。属于同一个BFC的两个相邻Box的margin会发生重叠【符合合并原则的margin合并后是使用大的margin】</li>
|
|
231
|
+
<li>BFC内,每个盒子的左外边缘接触内部盒子的左边缘(对于从右到左的格式,右边缘接触)。即使在存在浮动的情况下也是如此。除非创建新的BFC。</li>
|
|
232
|
+
<li>BFC的区域不会与float box重叠。</li>
|
|
233
|
+
<li>BFC就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素。反之也如此。</li>
|
|
234
|
+
<li>计算BFC的高度时,浮动元素也参与计算。</li>
|
|
235
|
+
</ul>
|
|
236
|
+
<h4 id="如何创建BFC"><a href="#如何创建BFC" class="headerlink" title="如何创建BFC"></a>如何创建BFC</h4><ul>
|
|
237
|
+
<li>根元素</li>
|
|
238
|
+
<li>浮动元素(float 属性不为 none)</li>
|
|
239
|
+
<li>position 为 absolute 或 relative</li>
|
|
240
|
+
<li>overflow 不为 visible 的块元素</li>
|
|
241
|
+
<li>display 为 inline-block, table-cell, table-caption</li>
|
|
242
|
+
</ul>
|
|
243
|
+
<h4 id="BFC的应用"><a href="#BFC的应用" class="headerlink" title="BFC的应用"></a>BFC的应用</h4><p>1.防止 margin 重叠</p>
|
|
244
|
+
<pre><code><style>.a{height: 100px;width: 100px;margin: 50px;background: pink; }</style>
|
|
245
|
+
<body>
|
|
246
|
+
<divclass="a"></div>
|
|
247
|
+
<divclass="a"></div>
|
|
248
|
+
</body>
|
|
249
|
+
</code></pre>
|
|
250
|
+
<p>两个div直接的 <code>margin</code> 是50px,发生了 <code>margin</code> 的重叠。</p>
|
|
251
|
+
<p><a target="_blank" rel="noopener" href="https://camo.githubusercontent.com/f7c8440c52f9b81cc651960ec4a4879cf896231f/68747470733a2f2f6e6f74652e796f7564616f2e636f6d2f7977732f7075626c69632f7265736f757263652f66343537303163633431303530346537316462626362643838363165386430632f786d6c6e6f74652f5745425245534f5552434539376131336132386564656662326662623032373435333964303231643035642f3239343539"><img src="https://camo.githubusercontent.com/f7c8440c52f9b81cc651960ec4a4879cf896231f/68747470733a2f2f6e6f74652e796f7564616f2e636f6d2f7977732f7075626c69632f7265736f757263652f66343537303163633431303530346537316462626362643838363165386430632f786d6c6e6f74652f5745425245534f5552434539376131336132386564656662326662623032373435333964303231643035642f3239343539" alt="xuehuayu.cn"></a></p>
|
|
252
|
+
<blockquote>
|
|
253
|
+
<p>根据BFC规则,同一个BFC内的两个两个相邻Box的 <code>margin</code> 会发生重叠,因此我们可以在div外面再嵌套一层容器,并且触发该容器生成一个 BFC,这样 <code><div class="a"></div></code> 就会属于两个 BFC,自然也就不会再发生 <code>margin</code> 重叠</p>
|
|
254
|
+
</blockquote>
|
|
255
|
+
<pre><code><style>.a{height: 100px;width: 100px;margin: 50px;background: pink; }.container{overflow: auto; /*触发生成BFC*/ }</style>
|
|
256
|
+
<body>
|
|
257
|
+
<divclass="container">
|
|
258
|
+
<divclass="a"></div>
|
|
259
|
+
</div>
|
|
260
|
+
<divclass="a"></div>
|
|
261
|
+
</body>
|
|
262
|
+
</code></pre>
|
|
263
|
+
<p><a target="_blank" rel="noopener" href="https://camo.githubusercontent.com/222948a37af1b842631d513d69793f0de10f1c62/68747470733a2f2f6e6f74652e796f7564616f2e636f6d2f7977732f7075626c69632f7265736f757263652f66343537303163633431303530346537316462626362643838363165386430632f786d6c6e6f74652f5745425245534f5552434562323562356537376662316631313361323466383539663063396230383638662f3239343537"><img src="https://camo.githubusercontent.com/222948a37af1b842631d513d69793f0de10f1c62/68747470733a2f2f6e6f74652e796f7564616f2e636f6d2f7977732f7075626c69632f7265736f757263652f66343537303163633431303530346537316462626362643838363165386430632f786d6c6e6f74652f5745425245534f5552434562323562356537376662316631313361323466383539663063396230383638662f3239343537" alt="xuehuayu.cn"></a></p>
|
|
264
|
+
<p>2.清除内部浮动</p>
|
|
265
|
+
<pre><code><style>.a{height: 100px;width: 100px;margin: 10px;background: pink;float: left; }.container{width: 120px;border: 2pxsolidblack; }</style>
|
|
266
|
+
<body>
|
|
267
|
+
<divclass="container">
|
|
268
|
+
<divclass="a"></div>
|
|
269
|
+
</div>
|
|
270
|
+
</body>
|
|
271
|
+
</code></pre>
|
|
272
|
+
<p><a target="_blank" rel="noopener" href="https://camo.githubusercontent.com/22a6e0d15e914da2533ef651e396be8a34e84509/68747470733a2f2f6e6f74652e796f7564616f2e636f6d2f7977732f7075626c69632f7265736f757263652f66343537303163633431303530346537316462626362643838363165386430632f786d6c6e6f74652f5745425245534f5552434534626537326662343265623865626132386337343930613130363062643039352f3239343634"><img src="https://camo.githubusercontent.com/22a6e0d15e914da2533ef651e396be8a34e84509/68747470733a2f2f6e6f74652e796f7564616f2e636f6d2f7977732f7075626c69632f7265736f757263652f66343537303163633431303530346537316462626362643838363165386430632f786d6c6e6f74652f5745425245534f5552434534626537326662343265623865626132386337343930613130363062643039352f3239343634" alt="xuehuayu.cn"></a></p>
|
|
273
|
+
<blockquote>
|
|
274
|
+
<p>container 的高度没有被撑开,如果我们希望 container 的高度能够包含浮动元素,那么可以创建一个新的 BFC,因为根据 BFC 的规则,计算 BFC 的高度时,浮动元素也参与计算。</p>
|
|
275
|
+
</blockquote>
|
|
276
|
+
<pre><code><style>.a{height: 100px;width: 100px;margin: 10px;background: pink;float: left; }.container{width: 120px;display: inline-block;/*触发生成BFC*/border: 2pxsolidblack; }</style>
|
|
277
|
+
</code></pre>
|
|
278
|
+
<p><a target="_blank" rel="noopener" href="https://camo.githubusercontent.com/066f7101f9b7661c62d0b2337cd9be5b4589c6aa/68747470733a2f2f6e6f74652e796f7564616f2e636f6d2f7977732f7075626c69632f7265736f757263652f66343537303163633431303530346537316462626362643838363165386430632f786d6c6e6f74652f5745425245534f5552434538333836303135393137333537343364343964386637666436383663613331362f3239343635"><img src="https://camo.githubusercontent.com/066f7101f9b7661c62d0b2337cd9be5b4589c6aa/68747470733a2f2f6e6f74652e796f7564616f2e636f6d2f7977732f7075626c69632f7265736f757263652f66343537303163633431303530346537316462626362643838363165386430632f786d6c6e6f74652f5745425245534f5552434538333836303135393137333537343364343964386637666436383663613331362f3239343635" alt="xuehuayu.cn"></a></p>
|
|
279
|
+
<p>3.自适应多栏布局</p>
|
|
280
|
+
<pre><code><style>body{width: 500px; }.a{height: 150px;width: 100px;background: pink;float: left; }.b{height: 200px;background: blue; }</style>
|
|
281
|
+
<body>
|
|
282
|
+
<divclass="a"></div>
|
|
283
|
+
<divclass="b"></div>
|
|
284
|
+
</body>
|
|
285
|
+
</code></pre>
|
|
286
|
+
<p><a target="_blank" rel="noopener" href="https://camo.githubusercontent.com/695942e3b6432886f4de1861de4de224b7e203ba/68747470733a2f2f6e6f74652e796f7564616f2e636f6d2f7977732f7075626c69632f7265736f757263652f66343537303163633431303530346537316462626362643838363165386430632f786d6c6e6f74652f5745425245534f5552434536663265383231653237353236376230316433653161616130616130613562642f3239343638"><img src="https://camo.githubusercontent.com/695942e3b6432886f4de1861de4de224b7e203ba/68747470733a2f2f6e6f74652e796f7564616f2e636f6d2f7977732f7075626c69632f7265736f757263652f66343537303163633431303530346537316462626362643838363165386430632f786d6c6e6f74652f5745425245534f5552434536663265383231653237353236376230316433653161616130616130613562642f3239343638" alt="xuehuayu.cn"></a></p>
|
|
287
|
+
<blockquote>
|
|
288
|
+
<p>根据规则,BFC的区域不会与float box重叠。因此,可以触发生成一个新的BFC,如下:</p>
|
|
289
|
+
</blockquote>
|
|
290
|
+
<pre><code><style>.b{height: 200px;overflow: hidden; /*触发生成BFC*/background: blue;}</style>
|
|
291
|
+
</code></pre>
|
|
292
|
+
<p><a target="_blank" rel="noopener" href="https://camo.githubusercontent.com/1a93f5f9cb3ae405c61952c3ad86653ea211197c/68747470733a2f2f6e6f74652e796f7564616f2e636f6d2f7977732f7075626c69632f7265736f757263652f66343537303163633431303530346537316462626362643838363165386430632f786d6c6e6f74652f5745425245534f5552434530333837653239316662643830333334336163356137376138383738343164392f3239343639"><img src="https://camo.githubusercontent.com/1a93f5f9cb3ae405c61952c3ad86653ea211197c/68747470733a2f2f6e6f74652e796f7564616f2e636f6d2f7977732f7075626c69632f7265736f757263652f66343537303163633431303530346537316462626362643838363165386430632f786d6c6e6f74652f5745425245534f5552434530333837653239316662643830333334336163356137376138383738343164392f3239343639" alt="xuehuayu.cn"></a></p>
|
|
293
|
+
<h3 id="9-let、const、var-的区别有哪些?-2019-05-30"><a href="#9-let、const、var-的区别有哪些?-2019-05-30" class="headerlink" title="9. let、const、var 的区别有哪些?(2019-05-30)"></a>9. let、const、var 的区别有哪些?(2019-05-30)</h3><p>声明方式变量提升暂时性死区重复声明块作用域有效初始值重新赋值var会不存在允许不是非必须允许let不会存在不允许是非必须允许const不会存在不允许是必须不允许</p>
|
|
294
|
+
<h4 id="1-let-x2F-const-定义的变量不会出现变量提升,而-var-定义的变量会提升。"><a href="#1-let-x2F-const-定义的变量不会出现变量提升,而-var-定义的变量会提升。" class="headerlink" title="1.let/const 定义的变量不会出现变量提升,而 var 定义的变量会提升。"></a>1.let/const 定义的变量不会出现变量提升,而 var 定义的变量会提升。</h4><pre><code>a =10;
|
|
295
|
+
var a; //正常
|
|
296
|
+
|
|
297
|
+
a =10;
|
|
298
|
+
let a; //ReferenceError
|
|
299
|
+
</code></pre>
|
|
300
|
+
<h4 id="2-相同作用域中,let-和-const-不允许重复声明,var-允许重复声明。"><a href="#2-相同作用域中,let-和-const-不允许重复声明,var-允许重复声明。" class="headerlink" title="2.相同作用域中,let 和 const 不允许重复声明,var 允许重复声明。"></a>2.相同作用域中,let 和 const 不允许重复声明,var 允许重复声明。</h4><pre><code>let a =10;
|
|
301
|
+
var a =20;
|
|
302
|
+
//抛出异常:SyntaxError: Identifier 'a' has already been declared
|
|
303
|
+
</code></pre>
|
|
304
|
+
<h4 id="3-cosnt-声明变量时必须设置初始值"><a href="#3-cosnt-声明变量时必须设置初始值" class="headerlink" title="3.cosnt 声明变量时必须设置初始值"></a>3.cosnt 声明变量时必须设置初始值</h4><pre><code>consta;//SyntaxError: Missing initializer in const declaration
|
|
305
|
+
</code></pre>
|
|
306
|
+
<h4 id="4-const-声明一个只读的常量,这个常量不可改变。"><a href="#4-const-声明一个只读的常量,这个常量不可改变。" class="headerlink" title="4.const 声明一个只读的常量,这个常量不可改变。"></a>4.const 声明一个只读的常量,这个常量不可改变。</h4><p>这里有一个非常重要的点即是:复杂数据类型,存储在栈中的是堆内存的地址,存在栈中的这个地址是不变的,但是存在堆中的值是可以变得。有没有相当常量指针/指针常量~</p>
|
|
307
|
+
<pre><code>consta=20;
|
|
308
|
+
constb= {
|
|
309
|
+
age:18,
|
|
310
|
+
star:500
|
|
311
|
+
}
|
|
312
|
+
</code></pre>
|
|
313
|
+
<p>一图胜万言,如下图所示,不变的是栈内存中 a 存储的 20,和 b 中存储的 0x0012ff21(瞎编的一个数字)。而 {age: 18, star: 200} 是可变的。思考下如果想希望一个对象是不可变的,应该用什么方法?</p>
|
|
314
|
+
<p><a target="_blank" rel="noopener" href="https://camo.githubusercontent.com/ed02c1af72d4c8780f57b43c364caedfadba0516/68747470733a2f2f6e6f74652e796f7564616f2e636f6d2f7977732f7075626c69632f7265736f757263652f66343537303163633431303530346537316462626362643838363165386430632f786d6c6e6f74652f5745425245534f5552434530383735656138663831633231306165393363653631396335663964386232642f3239343733"><img src="https://camo.githubusercontent.com/ed02c1af72d4c8780f57b43c364caedfadba0516/68747470733a2f2f6e6f74652e796f7564616f2e636f6d2f7977732f7075626c69632f7265736f757263652f66343537303163633431303530346537316462626362643838363165386430632f786d6c6e6f74652f5745425245534f5552434530383735656138663831633231306165393363653631396335663964386232642f3239343733" alt="xuehuayu.cn"></a></p>
|
|
315
|
+
<h4 id="5-let-x2F-const-声明的变量仅在块级作用域中有效。而-var-声明的变量在块级作用域外仍能访问到。"><a href="#5-let-x2F-const-声明的变量仅在块级作用域中有效。而-var-声明的变量在块级作用域外仍能访问到。" class="headerlink" title="5.let/const 声明的变量仅在块级作用域中有效。而 var 声明的变量在块级作用域外仍能访问到。"></a>5.let/const 声明的变量仅在块级作用域中有效。而 var 声明的变量在块级作用域外仍能访问到。</h4><pre><code>{
|
|
316
|
+
let a =10;
|
|
317
|
+
constb=20;
|
|
318
|
+
var c =30;
|
|
319
|
+
}
|
|
320
|
+
console.log(a); //ReferenceErrorconsole.log(b); //ReferenceErrorconsole.log(c); //30
|
|
321
|
+
</code></pre>
|
|
322
|
+
<p>在 let/const 之前,最早学习JS的时候,也曾被下面这个问题困扰:</p>
|
|
323
|
+
<p>期望: <code>a[0]() 输出 0 , a[1]() 输出 1 , a[2]() 输出 2 , ... </code></p>
|
|
324
|
+
<pre><code>var a = [];
|
|
325
|
+
for (var i =0; i <10; i++) {
|
|
326
|
+
a[i] =function () {
|
|
327
|
+
console.log(i);
|
|
328
|
+
};
|
|
329
|
+
}
|
|
330
|
+
a[6](); // 10
|
|
331
|
+
</code></pre>
|
|
332
|
+
<p><a target="_blank" rel="noopener" href="https://camo.githubusercontent.com/81e73ac06639b2ee4e2b1b62d5721e00973d765b/68747470733a2f2f6e6f74652e796f7564616f2e636f6d2f7977732f7075626c69632f7265736f757263652f66343537303163633431303530346537316462626362643838363165386430632f786d6c6e6f74652f5745425245534f5552434536363865313739303339343630643539663437666561303932383661303939652f3239343735"><img src="https://camo.githubusercontent.com/81e73ac06639b2ee4e2b1b62d5721e00973d765b/68747470733a2f2f6e6f74652e796f7564616f2e636f6d2f7977732f7075626c69632f7265736f757263652f66343537303163633431303530346537316462626362643838363165386430632f786d6c6e6f74652f5745425245534f5552434536363865313739303339343630643539663437666561303932383661303939652f3239343735" alt="xuehuayu.cn"></a></p>
|
|
333
|
+
<p>虽然后来知道了为什么,但是想要得到自己需要的结果,还得整个闭包,我…我做错了什么,要这么对我…</p>
|
|
334
|
+
<pre><code>var a = [];
|
|
335
|
+
for (var i =0; i <10; i++) {
|
|
336
|
+
a[i] = (function(j){
|
|
337
|
+
returnfunction () {
|
|
338
|
+
console.log(j);
|
|
339
|
+
}
|
|
340
|
+
})(i)
|
|
341
|
+
}
|
|
342
|
+
a[6](); // 6
|
|
343
|
+
</code></pre>
|
|
344
|
+
<p>有了 let 之后,终于不要这么麻烦了。</p>
|
|
345
|
+
<pre><code>var a = [];
|
|
346
|
+
for (let i =0; i <10; i++) {
|
|
347
|
+
a[i] =function () {
|
|
348
|
+
console.log(i);
|
|
349
|
+
};
|
|
350
|
+
}
|
|
351
|
+
a[6](); // 6
|
|
352
|
+
</code></pre>
|
|
353
|
+
<p>美滋滋,有没有~</p>
|
|
354
|
+
<p>美是美了,但是总得问自己为什么吧~</p>
|
|
355
|
+
<p><code>var i</code> 为什么输出的是 10,这是因为 i 在全局范围内都是有效的,相当于只有一个变量 i,等执行到 <code>a[6]()</code> 的时候,这个 i 的值是什么?请大声说出来。</p>
|
|
356
|
+
<p>再看 let , 我们说 let 声明的变量仅在块级作用域内有效,变量i是let声明的,当前的 i 只在本轮循环有效,所以每一次循环的 i 其实都是一个新的变量。有兴趣的小伙伴可以查看 babel 编译后的代码。</p>
|
|
357
|
+
<h4 id="6-顶层作用域中-var-声明的变量挂在window上-浏览器环境"><a href="#6-顶层作用域中-var-声明的变量挂在window上-浏览器环境" class="headerlink" title="6.顶层作用域中 var 声明的变量挂在window上(浏览器环境)"></a>6.顶层作用域中 var 声明的变量挂在window上(浏览器环境)</h4><pre><code>var a =10;
|
|
358
|
+
console.log(window.a);//10
|
|
359
|
+
</code></pre>
|
|
360
|
+
<h4 id="7-let-x2F-const有暂时性死区的问题,即let-x2F-const-声明的变量,在定义之前都是不可用的。如果使用会抛出错误。"><a href="#7-let-x2F-const有暂时性死区的问题,即let-x2F-const-声明的变量,在定义之前都是不可用的。如果使用会抛出错误。" class="headerlink" title="7.let/const有暂时性死区的问题,即let/const 声明的变量,在定义之前都是不可用的。如果使用会抛出错误。"></a>7.let/const有暂时性死区的问题,即let/const 声明的变量,在定义之前都是不可用的。如果使用会抛出错误。</h4><p>只要块级作用域内存在let命令,它所声明的变量就“绑定”(binding)这个区域,不再受外部的影响。</p>
|
|
361
|
+
<pre><code>var a =10;
|
|
362
|
+
if (true) {
|
|
363
|
+
a =20; // ReferenceErrorlet a;
|
|
364
|
+
}
|
|
365
|
+
</code></pre>
|
|
366
|
+
<p>在代码块内,使用 let/const 命令声明变量之前,该变量都是不可用的,也就意味着 typeof 不再是一个百分百安全的操作。</p>
|
|
367
|
+
<pre><code>console.log(typeof b);//undefinedconsole.log(a); //ReferenceErrorlet a =10;
|
|
368
|
+
</code></pre>
|
|
369
|
+
<h3 id="10-深拷贝和浅拷贝的区别是什么?如何实现一个深拷贝?-2019-05-31"><a href="#10-深拷贝和浅拷贝的区别是什么?如何实现一个深拷贝?-2019-05-31" class="headerlink" title="10. 深拷贝和浅拷贝的区别是什么?如何实现一个深拷贝?(2019-05-31)"></a>10. 深拷贝和浅拷贝的区别是什么?如何实现一个深拷贝?(2019-05-31)</h3><p>深拷贝和浅拷贝是针对复杂数据类型来说的。</p>
|
|
370
|
+
<h4 id="深拷贝"><a href="#深拷贝" class="headerlink" title="深拷贝"></a>深拷贝</h4><blockquote>
|
|
371
|
+
<p>深拷贝复制变量值,对于非基本类型的变量,则递归至基本类型变量后,再复制。 深拷贝后的对象与原来的对象是完全隔离的,互不影响,对一个对象的修改并不会影响另一个对象。</p>
|
|
372
|
+
</blockquote>
|
|
373
|
+
<h4 id="浅拷贝"><a href="#浅拷贝" class="headerlink" title="浅拷贝"></a>浅拷贝</h4><blockquote>
|
|
374
|
+
<p>浅拷贝是会将对象的每个属性进行依次复制,但是当对象的属性值是引用类型时,实质复制的是其引用,当引用指向的值改变时也会跟着变化。</p>
|
|
375
|
+
</blockquote>
|
|
376
|
+
<p>可以使用 <code>for in</code>、 <code>Object.assign</code>、 扩展运算符 <code>...</code> 、<code>Array.prototype.slice()</code>、<code>Array.prototype.concat()</code> 等,例如:</p>
|
|
377
|
+
<pre><code>let obj = {
|
|
378
|
+
name:'Yvette',
|
|
379
|
+
age:18,
|
|
380
|
+
hobbies: ['reading', 'photography']
|
|
381
|
+
}
|
|
382
|
+
let obj2 =Object.assign({}, obj);
|
|
383
|
+
let obj3 = {...obj};
|
|
384
|
+
|
|
385
|
+
obj.name='Jack';
|
|
386
|
+
obj.hobbies.push('coding');
|
|
387
|
+
console.log(obj);//{ name: 'Jack', age: 18,hobbies: [ 'reading', 'photography', 'coding' ] }console.log(obj2);//{ name: 'Yvette', age: 18,hobbies: [ 'reading', 'photography', 'coding' ] }console.log(obj3);//{ name: 'Yvette', age: 18,hobbies: [ 'reading', 'photography', 'coding' ] }
|
|
388
|
+
</code></pre>
|
|
389
|
+
<p>可以看出浅拷贝只最第一层属性进行了拷贝,当第一层的属性值是基本数据类型时,新的对象和原对象互不影响,但是如果第一层的属性值是复杂数据类型,那么新对象和原对象的属性值其指向的是同一块内存地址。来看一下使用 <code>for in</code> 实现浅拷贝。</p>
|
|
390
|
+
<pre><code>let obj = {
|
|
391
|
+
name:'Yvette',
|
|
392
|
+
age:18,
|
|
393
|
+
hobbies: ['reading', 'photography']
|
|
394
|
+
}
|
|
395
|
+
let newObj = {};
|
|
396
|
+
for(let key in obj){
|
|
397
|
+
newObj[key] = obj[key];
|
|
398
|
+
//这一步不需要多说吧,复杂数据类型栈中存的是对应的地址,因此赋值操作,相当于两个属性值指向同一个内存空间
|
|
399
|
+
}
|
|
400
|
+
console.log(newObj);
|
|
401
|
+
//{ name: 'Yvette', age: 18, hobbies: [ 'reading', 'photography' ] }obj.age=20;
|
|
402
|
+
obj.hobbies.pop();
|
|
403
|
+
console.log(newObj);
|
|
404
|
+
//{ name: 'Yvette', age: 18, hobbies: [ 'reading' ] }
|
|
405
|
+
</code></pre>
|
|
406
|
+
<h4 id="深拷贝实现"><a href="#深拷贝实现" class="headerlink" title="深拷贝实现"></a>深拷贝实现</h4><blockquote>
|
|
407
|
+
<p>1.深拷贝最简单的实现是: <code>JSON.parse(JSON.stringify(obj))</code></p>
|
|
408
|
+
</blockquote>
|
|
409
|
+
<pre><code>let obj = {
|
|
410
|
+
name:'Yvette',
|
|
411
|
+
age:18,
|
|
412
|
+
hobbies: ['reading', 'photography']
|
|
413
|
+
}
|
|
414
|
+
let newObj =JSON.parse(JSON.stringify(obj));//newObj和obj互不影响obj.hobbies.push('coding');
|
|
415
|
+
console.log(newObj);//{ name: 'Yvette', age: 18, hobbies: [ 'reading', 'photography' ] }
|
|
416
|
+
</code></pre>
|
|
417
|
+
<p><code>JSON.parse(JSON.stringify(obj))</code> 是最简单的实现方式,但是有一点缺陷:</p>
|
|
418
|
+
<p>1.对象的属性值是函数时,无法拷贝。</p>
|
|
419
|
+
<pre><code>let obj = {
|
|
420
|
+
name:'Yvette',
|
|
421
|
+
age:18,
|
|
422
|
+
hobbies: ['reading', 'photography'],
|
|
423
|
+
sayHi:function() {
|
|
424
|
+
console.log(sayHi);
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
let newObj =JSON.parse(JSON.stringify(obj));
|
|
428
|
+
console.log(newObj);//{ name: 'Yvette', age: 18, hobbies: [ 'reading', 'photography' ] }
|
|
429
|
+
</code></pre>
|
|
430
|
+
<p>2.原型链上的属性无法获取</p>
|
|
431
|
+
<pre><code>functionSuper() {
|
|
432
|
+
|
|
433
|
+
}
|
|
434
|
+
Super.prototype.location='NanJing';
|
|
435
|
+
functionChild(name, age, hobbies) {
|
|
436
|
+
this.name= name;
|
|
437
|
+
this.age= age;
|
|
438
|
+
}
|
|
439
|
+
Child.prototype=newSuper();
|
|
440
|
+
|
|
441
|
+
let obj =newChild('Yvette', 18);
|
|
442
|
+
console.log(obj.location); //NanJinglet newObj =JSON.parse(JSON.stringify(obj));
|
|
443
|
+
console.log(newObj);//{ name: 'Yvette', age: 18}console.log(newObj.location);//undefined;原型链上的属性无法获取
|
|
444
|
+
</code></pre>
|
|
445
|
+
<p>3.不能正确的处理 Date 类型的数据</p>
|
|
446
|
+
<p>4.不能处理 RegExp</p>
|
|
447
|
+
<p>5.会忽略 symbol</p>
|
|
448
|
+
<p>6.会忽略 undefined</p>
|
|
449
|
+
<pre><code>let obj = {
|
|
450
|
+
time:newDate(),
|
|
451
|
+
reg:/\d{3}/,
|
|
452
|
+
sym:Symbol(10),
|
|
453
|
+
name:undefined
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
let obj2 =JSON.parse(JSON.stringify(obj));
|
|
457
|
+
console.log(obj2); //{ time: '2019-06-02T08:16:44.625Z', reg: {} }
|
|
458
|
+
</code></pre>
|
|
459
|
+
<blockquote>
|
|
460
|
+
<p>2.实现一个 deepClone 函数</p>
|
|
461
|
+
</blockquote>
|
|
462
|
+
<ol>
|
|
463
|
+
<li><p>如果是基本数据类型,直接返回</p>
|
|
464
|
+
</li>
|
|
465
|
+
<li><p>如果是 <code>RegExp</code> 或者 <code>Date</code> 类型,返回对应类型</p>
|
|
466
|
+
</li>
|
|
467
|
+
<li><p>如果是复杂数据类型,递归。</p>
|
|
468
|
+
<p> functiondeepClone(obj) { //递归拷贝if(obj instanceofRegExp) returnnewRegExp(obj);<br> if(obj instanceofDate) returnnewDate(obj);<br> if(obj ===null||typeof obj !==’object’) {<br> //如果不是复杂数据类型,直接返回return obj;<br> }<br> /** * 如果obj是数组,那么 obj.constructor 是 [Function: Array] * 如果obj是对象,那么 obj.constructor 是 [Function: Object]*/let t =newobj.constructor();<br> for(let key in obj) {<br> //如果 obj[key] 是复杂数据类型,递归if(obj.hasOwnProperty(key)){//是否是自身的属性<br> t[key] =deepClone(obj[key]);<br> }<br> }<br> return t;<br> }</p>
|
|
469
|
+
</li>
|
|
470
|
+
</ol>
|
|
471
|
+
<p>测试:</p>
|
|
472
|
+
<pre><code>functionSuper() {
|
|
473
|
+
|
|
474
|
+
}
|
|
475
|
+
Super.prototype.location='NanJing';
|
|
476
|
+
functionChild(name, age, hobbies) {
|
|
477
|
+
this.name= name;
|
|
478
|
+
this.age= age;
|
|
479
|
+
this.hobbies= hobbies;
|
|
480
|
+
}
|
|
481
|
+
Child.prototype=newSuper();
|
|
482
|
+
|
|
483
|
+
let obj =newChild('Yvette', 18, ['reading', 'photography']);
|
|
484
|
+
obj.sayHi=function () {
|
|
485
|
+
console.log('hi');
|
|
486
|
+
}
|
|
487
|
+
console.log(obj.location); //NanJinglet newObj =deepClone(obj);
|
|
488
|
+
console.log(newObj);//console.log(newObj.location);//NanJing 可以获取到原型链上的属性newObj.sayHi();//hi 函数属性拷贝正常
|
|
489
|
+
</code></pre>
|
|
490
|
+
<h3 id="参考文章:"><a href="#参考文章:" class="headerlink" title="参考文章:"></a>参考文章:</h3><p>[1] <a target="_blank" rel="noopener" href="https://www.ecma-international.org/ecma-262/6.0/#sec-completion-record-specification-type">https://www.ecma-international.org/ecma-262/6.0/#sec-completion-record-specification-type</a></p>
|
|
491
|
+
<p>[2] <a target="_blank" rel="noopener" href="https://juejin.im/post/5bdfd3e151882516c6432c32">【译】理解 Javascript 执行上下文和执行栈</a></p>
|
|
492
|
+
<p>[3] <a target="_blank" rel="noopener" href="https://css-tricks.com/debouncing-throttling-explained-examples/">https://css-tricks.com/debouncing-throttling-explained-examples/</a></p>
|
|
493
|
+
<p>[4] <a target="_blank" rel="noopener" href="https://github.com/mqyqingfeng/Blog/issues/4">mqyqingfeng/Blog#4</a></p>
|
|
494
|
+
<p>[5] <a target="_blank" rel="noopener" href="https://www.cnblogs.com/coco1s/p/4017544.html">https://www.cnblogs.com/coco1s/p/4017544.html</a></p>
|
|
495
|
+
<p>[6] <a target="_blank" rel="noopener" href="https://www.cnblogs.com/wangfupeng1988/p/4000798.html">https://www.cnblogs.com/wangfupeng1988/p/4000798.html</a></p>
|
|
496
|
+
<p>[7] <a target="_blank" rel="noopener" href="https://www.w3.org/TR/2011/REC-CSS2-20110607/visuren.html#block-boxes">https://www.w3.org/TR/2011/REC-CSS2-20110607/visuren.html#block-boxes</a></p>
|
|
497
|
+
<p>[8] <a target="_blank" rel="noopener" href="https://github.com/mqyqingfeng/Blog/issues/4">mqyqingfeng/Blog#4</a></p>
|
|
498
|
+
<p>谢谢各位小伙伴愿意花费宝贵的时间阅读本文,如果本文给了您一点帮助或者是启发,请不要吝啬你的赞和Star,您的肯定是我前进的最大动力。<a target="_blank" rel="noopener" href="https://github.com/YvetteLau/Blog">https://github.com/YvetteLau/Blog</a></p>
|
|
499
|
+
</div><iframe src="/donate/?AliPayQR=https://store.xuehuayu.cn/store/public/alipay_qr.jpg&WeChatQR=https://store.xuehuayu.cn/store/public/wechat_qr.png&UnionPayQR=null&GitHub=null&BTCQR=null&BTCKEY=null&PayPal=https://www.paypal.com/paypalme/OrdinaryPerson" style="overflow-x:hidden; overflow-y:hidden; border:0xp none #fff; min-height:240px; width:100%;" frameborder="0" scrolling="no"></iframe><div><ul class="post-copyright"><li class="post-copyright-author"><strong>本文作者:</strong>雪花雨</li><li class="post-copyright-link"><strong>本文链接:</strong><a href="/article/21782.html">https://xuehuayu.cn/article/21782.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/38359.html">高频面试题深入解析/ 周刊 03</a><a class="next" href="/article/44964.html">精读《最佳前端面试题》及面试官技巧</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
|
|
500
|
+
const serverURL = origin.includes('cainiaoblog') ? 'https://cmts.cainiaoblog.cn' : 'https://cmts.xuehuayu.cn'
|
|
501
|
+
const locale = {
|
|
502
|
+
placeholder: '请正确填写昵称和邮箱,方便接收回复通知~',
|
|
503
|
+
sofa: '沙发空缺中,还不快抢~',
|
|
504
|
+
};
|
|
505
|
+
Waline.init({
|
|
506
|
+
el: '#vcomment',
|
|
507
|
+
serverURL: serverURL,
|
|
508
|
+
pageSize: '20',
|
|
509
|
+
visitor: true, // 阅读量统计
|
|
510
|
+
requiredMeta: ['nick', 'mail'],
|
|
511
|
+
emoji: [
|
|
512
|
+
'https://cdn.jsdelivr.net/gh/walinejs/emojis@1.0.0/weibo',
|
|
513
|
+
'https://cdn.jsdelivr.net/gh/walinejs/emojis@1.0.0/qq',
|
|
514
|
+
'https://cdn.jsdelivr.net/gh/walinejs/emojis@1.0.0/tw-emoji',
|
|
515
|
+
],
|
|
516
|
+
locale,
|
|
517
|
+
pageview: true
|
|
518
|
+
})
|
|
519
|
+
</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.staticaly.com/gh/npljy/npljy.github.io/main/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() {
|
|
520
|
+
var val = $(this).val()
|
|
521
|
+
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>'
|
|
522
|
+
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>'
|
|
523
|
+
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>'
|
|
524
|
+
|
|
525
|
+
if (val === 'self') {
|
|
526
|
+
$('#search').html(self)
|
|
527
|
+
var search_path = 'search.xml';
|
|
528
|
+
if (search_path.length == 0) {
|
|
529
|
+
search_path = 'search.xml';
|
|
530
|
+
}
|
|
531
|
+
var path = 'https://cdn.staticaly.com/gh/npljy/npljy.github.io/main/' + search_path;
|
|
532
|
+
searchFunc(path, 'local-search-input', 'local-search-result');
|
|
533
|
+
} else if (val === 'baidu') {
|
|
534
|
+
$('#search').html(baidu)
|
|
535
|
+
} else if (val === 'google') {
|
|
536
|
+
$('#search').html(google)
|
|
537
|
+
}
|
|
538
|
+
})</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">191</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/%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">2</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/c5576490.html">面试准备</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(){
|
|
539
|
+
var cnb =window.location.origin.indexOf('cainiaoblog') !==-1
|
|
540
|
+
if (cnb) {
|
|
541
|
+
var gxba =document.getElementById('gxba')
|
|
542
|
+
var gaba =document.getElementById('gaba')
|
|
543
|
+
var gabaLink =document.getElementById('gaba-link')
|
|
544
|
+
gxba.innerText ='京ICP备20007647号-1'
|
|
545
|
+
gaba.innerText ='京公网安备 11010802031254号'
|
|
546
|
+
gabaLink.setAttribute('href','http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=11010802031254')
|
|
547
|
+
}
|
|
548
|
+
})()</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.staticaly.com/gh/npljy/npljy.github.io/main/js/totop.min.js" async></script><script type="text/javascript" src="//cdn.staticaly.com/gh/npljy/npljy.github.io/main/js/dark.min.js" async></script><script type="text/javascript" src="//cdn.staticaly.com/gh/npljy/npljy.github.io/main/js/codeblock-resizer.min.js"></script><script type="text/javascript" src="//cdn.staticaly.com/gh/npljy/npljy.github.io/main/js/smartresize.min.js"></script></div></body></html>
|