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.
Files changed (401) hide show
  1. package/CNAME +1 -0
  2. package/MP_verify_o6dHCK5mIkxNpzvZ.txt +1 -0
  3. package/README.md +8 -0
  4. package/about/index.html +54 -0
  5. package/ads.txt +1 -0
  6. package/app/manual.html +104 -0
  7. package/appConfigs/config +1 -0
  8. package/archives/2018/index.html +48 -0
  9. package/archives/2019/index.html +48 -0
  10. package/archives/2019/page/2/index.html +48 -0
  11. package/archives/2020/index.html +48 -0
  12. package/archives/2021/index.html +48 -0
  13. package/archives/2022/index.html +48 -0
  14. package/archives/2023/index.html +48 -0
  15. package/archives/index.html +48 -0
  16. package/archives/page/2/index.html +48 -0
  17. package/archives/page/3/index.html +48 -0
  18. package/article/10047.html +148 -0
  19. package/article/10164.html +64 -0
  20. package/article/10624.html +436 -0
  21. package/article/10745.html +586 -0
  22. package/article/11674.html +71 -0
  23. package/article/11939.html +72 -0
  24. package/article/12238.html +86 -0
  25. package/article/1230.html +533 -0
  26. package/article/13265.html +69 -0
  27. package/article/13823.html +78 -0
  28. package/article/14125.html +72 -0
  29. package/article/14192.html +561 -0
  30. package/article/14375.html +85 -0
  31. package/article/14744.html +83 -0
  32. package/article/14936.html +451 -0
  33. package/article/1518.html +250 -0
  34. package/article/15428.html +71 -0
  35. package/article/15518.html +288 -0
  36. package/article/15569.html +418 -0
  37. package/article/1566.html +122 -0
  38. package/article/16017.html +156 -0
  39. package/article/16947.html +440 -0
  40. package/article/17096.html +82 -0
  41. package/article/17246.html +89 -0
  42. package/article/17575.html +350 -0
  43. package/article/179.html +757 -0
  44. package/article/18039.html +233 -0
  45. package/article/18071.html +375 -0
  46. package/article/18142.html +71 -0
  47. package/article/19909.html +160 -0
  48. package/article/20014.html +89 -0
  49. package/article/20021.html +389 -0
  50. package/article/20037.html +280 -0
  51. package/article/20056.html +95 -0
  52. package/article/20093.html +404 -0
  53. package/article/2021.html +607 -0
  54. package/article/20459.html +115 -0
  55. package/article/20613.html +263 -0
  56. package/article/20635.html +71 -0
  57. package/article/21317.html +71 -0
  58. package/article/21320.html +90 -0
  59. package/article/21782.html +548 -0
  60. package/article/22230.html +435 -0
  61. package/article/22237.html +347 -0
  62. package/article/22398.html +109 -0
  63. package/article/22422.html +270 -0
  64. package/article/22565.html +300 -0
  65. package/article/23046.html +250 -0
  66. package/article/23083.html +215 -0
  67. package/article/23195.html +297 -0
  68. package/article/23301.html +835 -0
  69. package/article/23589.html +285 -0
  70. package/article/23655.html +338 -0
  71. package/article/23864.html +76 -0
  72. package/article/23914.html +96 -0
  73. package/article/24169.html +135 -0
  74. package/article/24581.html +349 -0
  75. package/article/2475.html +500 -0
  76. package/article/24826.html +77 -0
  77. package/article/24924.html +247 -0
  78. package/article/25164.html +1495 -0
  79. package/article/25318.html +394 -0
  80. package/article/25710.html +1129 -0
  81. package/article/25734.html +83 -0
  82. package/article/26083.html +174 -0
  83. package/article/26147.html +283 -0
  84. package/article/26291.html +110 -0
  85. package/article/26354.html +71 -0
  86. package/article/26624.html +145 -0
  87. package/article/26639.html +298 -0
  88. package/article/26850.html +138 -0
  89. package/article/26940.html +258 -0
  90. package/article/27796.html +190 -0
  91. package/article/27800.html +161 -0
  92. package/article/28963.html +159 -0
  93. package/article/28976.html +247 -0
  94. package/article/29042.html +72 -0
  95. package/article/29596.html +81 -0
  96. package/article/29619.html +183 -0
  97. package/article/29623.html +329 -0
  98. package/article/29829.html +205 -0
  99. package/article/29abbd1c.html +112 -0
  100. package/article/30215.html +178 -0
  101. package/article/30552.html +78 -0
  102. package/article/30818.html +201 -0
  103. package/article/31330.html +364 -0
  104. package/article/3154.html +577 -0
  105. package/article/31695.html +348 -0
  106. package/article/31826.html +71 -0
  107. package/article/31843.html +132 -0
  108. package/article/32280.html +212 -0
  109. package/article/32431.html +74 -0
  110. package/article/32443.html +72 -0
  111. package/article/32732.html +122 -0
  112. package/article/3286.html +251 -0
  113. package/article/32960.html +198 -0
  114. package/article/33713.html +72 -0
  115. package/article/33899.html +615 -0
  116. package/article/34351.html +74 -0
  117. package/article/34372.html +89 -0
  118. package/article/34410.html +74 -0
  119. package/article/34431.html +118 -0
  120. package/article/3447.html +75 -0
  121. package/article/34474.html +142 -0
  122. package/article/34871.html +147 -0
  123. package/article/35397.html +175 -0
  124. package/article/3544.html +199 -0
  125. package/article/35503.html +115 -0
  126. package/article/35624.html +84 -0
  127. package/article/35697.html +384 -0
  128. package/article/35863.html +73 -0
  129. package/article/36037.html +253 -0
  130. package/article/36118.html +71 -0
  131. package/article/3621.html +119 -0
  132. package/article/36251.html +296 -0
  133. package/article/36642.html +352 -0
  134. package/article/37102.html +763 -0
  135. package/article/37336.html +351 -0
  136. package/article/37351.html +89 -0
  137. package/article/3760.html +294 -0
  138. package/article/37749.html +75 -0
  139. package/article/37789.html +83 -0
  140. package/article/38005.html +765 -0
  141. package/article/38009.html +284 -0
  142. package/article/38269.html +194 -0
  143. package/article/38344.html +88 -0
  144. package/article/38359.html +334 -0
  145. package/article/38423.html +379 -0
  146. package/article/38530.html +213 -0
  147. package/article/38743.html +268 -0
  148. package/article/38753.html +204 -0
  149. package/article/38881.html +71 -0
  150. package/article/39087.html +414 -0
  151. package/article/39309.html +84 -0
  152. package/article/39486.html +74 -0
  153. package/article/39637.html +306 -0
  154. package/article/39839.html +72 -0
  155. package/article/39937.html +152 -0
  156. package/article/39970.html +71 -0
  157. package/article/402.html +559 -0
  158. package/article/40698.html +71 -0
  159. package/article/40811.html +71 -0
  160. package/article/40964.html +462 -0
  161. package/article/41011.html +322 -0
  162. package/article/41152.html +78 -0
  163. package/article/41696.html +71 -0
  164. package/article/41717.html +281 -0
  165. package/article/41777.html +149 -0
  166. package/article/419.html +985 -0
  167. package/article/4233.html +136 -0
  168. package/article/4292.html +86 -0
  169. package/article/43302.html +96 -0
  170. package/article/43397.html +106 -0
  171. package/article/43724.html +281 -0
  172. package/article/43999.html +224 -0
  173. package/article/44426.html +77 -0
  174. package/article/44964.html +137 -0
  175. package/article/45004.html +123 -0
  176. package/article/4510.html +83 -0
  177. package/article/45156.html +320 -0
  178. package/article/45157.html +52 -0
  179. package/article/45267.html +87 -0
  180. package/article/45641.html +207 -0
  181. package/article/45960.html +75 -0
  182. package/article/46100.html +1262 -0
  183. package/article/46366.html +74 -0
  184. package/article/46771.html +96 -0
  185. package/article/46911.html +517 -0
  186. package/article/46948.html +137 -0
  187. package/article/46ee4850.html +349 -0
  188. package/article/47019.html +84 -0
  189. package/article/47532.html +94 -0
  190. package/article/4783.html +429 -0
  191. package/article/47972.html +72 -0
  192. package/article/48216.html +127 -0
  193. package/article/48252.html +185 -0
  194. package/article/48520.html +74 -0
  195. package/article/48722.html +75 -0
  196. package/article/48807.html +99 -0
  197. package/article/49126.html +323 -0
  198. package/article/50001.html +88 -0
  199. package/article/50058.html +151 -0
  200. package/article/50343.html +410 -0
  201. package/article/50510.html +82 -0
  202. package/article/51082.html +98 -0
  203. package/article/51677.html +111 -0
  204. package/article/5204.html +1085 -0
  205. package/article/52500.html +538 -0
  206. package/article/52689.html +259 -0
  207. package/article/52877.html +569 -0
  208. package/article/53125.html +191 -0
  209. package/article/53428.html +251 -0
  210. package/article/53524.html +74 -0
  211. package/article/53698.html +322 -0
  212. package/article/53803e6.html +93 -0
  213. package/article/53924.html +291 -0
  214. package/article/53962.html +253 -0
  215. package/article/54006.html +71 -0
  216. package/article/54018.html +88 -0
  217. package/article/54161.html +83 -0
  218. package/article/54178.html +69 -0
  219. package/article/54258.html +327 -0
  220. package/article/54295.html +214 -0
  221. package/article/54313.html +1976 -0
  222. package/article/54351.html +90 -0
  223. package/article/54604.html +80 -0
  224. package/article/54632.html +71 -0
  225. package/article/54912.html +756 -0
  226. package/article/54918.html +129 -0
  227. package/article/55119.html +136 -0
  228. package/article/55756.html +118 -0
  229. package/article/55769.html +136 -0
  230. package/article/55870.html +161 -0
  231. package/article/56139.html +92 -0
  232. package/article/56557.html +69 -0
  233. package/article/56604.html +69 -0
  234. package/article/56816.html +266 -0
  235. package/article/56926.html +153 -0
  236. package/article/57747.html +409 -0
  237. package/article/57965.html +475 -0
  238. package/article/58816.html +78 -0
  239. package/article/59059.html +435 -0
  240. package/article/59095.html +350 -0
  241. package/article/59349.html +244 -0
  242. package/article/59402.html +216 -0
  243. package/article/59448.html +55 -0
  244. package/article/59870.html +94 -0
  245. package/article/59877.html +208 -0
  246. package/article/5dbb6f41.html +86 -0
  247. package/article/6008.html +75 -0
  248. package/article/60327.html +126 -0
  249. package/article/6035.html +76 -0
  250. package/article/60428.html +71 -0
  251. package/article/60544.html +128 -0
  252. package/article/61319.html +95 -0
  253. package/article/61367.html +93 -0
  254. package/article/624d1918.html +292 -0
  255. package/article/62543.html +71 -0
  256. package/article/62887.html +169 -0
  257. package/article/63074.html +120 -0
  258. package/article/63266.html +311 -0
  259. package/article/63351.html +74 -0
  260. package/article/63542.html +104 -0
  261. package/article/63824.html +275 -0
  262. package/article/64051.html +653 -0
  263. package/article/64189b69.html +72 -0
  264. package/article/64354.html +75 -0
  265. package/article/64869.html +79 -0
  266. package/article/64923.html +596 -0
  267. package/article/65128.html +95 -0
  268. package/article/65295.html +79 -0
  269. package/article/6888.html +75 -0
  270. package/article/7065.html +84 -0
  271. package/article/7455.html +85 -0
  272. package/article/7a3ef8f.html +315 -0
  273. package/article/8140.html +188 -0
  274. package/article/8190.html +85 -0
  275. package/article/8225.html +78 -0
  276. package/article/84c9ccd6.html +159 -0
  277. package/article/8f9a9ae3.html +82 -0
  278. package/article/9174.html +73 -0
  279. package/article/9738.html +294 -0
  280. package/article/a4145266.html +71 -0
  281. package/article/bedea419.html +72 -0
  282. package/article/bf7e7421.html +78 -0
  283. package/article/c1867fbf.html +103 -0
  284. package/article/c5576490.html +70 -0
  285. package/article/dcb0db28.html +76 -0
  286. package/article/fc3b727a.html +79 -0
  287. package/atom.xml +445 -0
  288. package/baidusitemap.xml +1079 -0
  289. package/blocks/dns.txt +264 -0
  290. package/blocks/filter.txt +1070 -0
  291. package/blocks/script.js +42 -0
  292. package/categories/CDN/index.html +48 -0
  293. package/categories/IDE/index.html +48 -0
  294. package/categories/git/index.html +48 -0
  295. package/categories/hexo/index.html +48 -0
  296. package/categories//345/205/254/345/205/261/350/212/202/346/227/245/index.html +48 -0
  297. package/categories//345/210/206/344/272/253/index.html +48 -0
  298. package/categories//345/211/215/347/253/257/index.html +48 -0
  299. package/categories//345/211/215/347/253/257/page/2/index.html +48 -0
  300. package/categories//345/211/215/347/253/257//346/265/217/350/247/210/345/231/250/index.html +48 -0
  301. 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
  302. package/categories//345/215/232/345/256/242/index.html +48 -0
  303. package/categories//345/267/245/345/205/267/index.html +48 -0
  304. package/categories//345/271/277/345/221/212/350/277/207/346/273/244/index.html +48 -0
  305. 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
  306. package/categories//346/255/243/345/210/231/index.html +48 -0
  307. package/categories//346/265/217/350/247/210/345/231/250/index.html +48 -0
  308. package/categories//347/256/227/346/263/225/index.html +48 -0
  309. package/categories//350/265/204/350/256/257/index.html +48 -0
  310. package/categories//350/275/273/346/235/276/344/270/200/345/210/273/index.html +48 -0
  311. package/cdn/css/font-awesome.min.css +4 -0
  312. package/cdn/css/grids-responsive-min.css +7 -0
  313. package/cdn/css/normalize.css +349 -0
  314. package/cdn/css/pure-min.css +11 -0
  315. package/cdn/fonts/fontawesome-webfont.eot +0 -0
  316. package/cdn/fonts/fontawesome-webfont.svg +2671 -0
  317. package/cdn/fonts/fontawesome-webfont.ttf +0 -0
  318. package/cdn/fonts/fontawesome-webfont.woff +0 -0
  319. package/cdn/fonts/fontawesome-webfont.woff2 +0 -0
  320. package/cdn/js/Valine.min.js +17 -0
  321. package/cdn/js/canvas-nest.js +1 -0
  322. package/cdn/js/clipboard.min.js +7 -0
  323. package/cdn/js/crypto-js.js +25 -0
  324. package/cdn/js/jquery.min.js +2 -0
  325. package/css/default.css +1144 -0
  326. package/css/donate.css +338 -0
  327. package/css/hbe.style.css +749 -0
  328. package/css/style.css +2095 -0
  329. package/donate/index.html +39 -0
  330. package/google917dcf72f6e5c7f5.html +1 -0
  331. package/guestbook/index.html +68 -0
  332. package/hosts/ads.txt +149 -0
  333. package/hosts/flash.txt +9 -0
  334. package/hosts/github.txt +6 -0
  335. package/hosts/google.txt +16936 -0
  336. package/hosts/winrar.txt +2 -0
  337. package/img/alipay.svg +46 -0
  338. package/img/bitcoin.svg +135 -0
  339. package/img/blog.ico +0 -0
  340. package/img/blog.png +0 -0
  341. package/img/gaba.png +0 -0
  342. package/img/github.svg +1 -0
  343. package/img/like.svg +1 -0
  344. package/img/mp-mini.jpg +0 -0
  345. package/img/mp.png +0 -0
  346. package/img/paypal.svg +63 -0
  347. package/img/upy_logo.svg +59 -0
  348. package/img/wechat.svg +49 -0
  349. package/index.html +48 -0
  350. package/jd_root.txt +1 -0
  351. package/js/codeblock-resizer.js +51 -0
  352. package/js/dark.js +12 -0
  353. package/js/donate.js +87 -0
  354. package/js/fixedPage.js +106 -0
  355. package/js/gitment.browser.js +3751 -0
  356. package/js/search.js +86 -0
  357. package/js/share.js +60 -0
  358. package/js/smartresize.js +32 -0
  359. package/js/totop.js +12 -0
  360. package/kankan/index.html +77 -0
  361. package/lib/hbe.js +293 -0
  362. package/package.json +25 -0
  363. package/page/10/index.html +49 -0
  364. package/page/11/index.html +59 -0
  365. package/page/12/index.html +67 -0
  366. package/page/13/index.html +63 -0
  367. package/page/14/index.html +66 -0
  368. package/page/15/index.html +60 -0
  369. package/page/16/index.html +60 -0
  370. package/page/17/index.html +62 -0
  371. package/page/18/index.html +61 -0
  372. package/page/19/index.html +58 -0
  373. package/page/2/index.html +48 -0
  374. package/page/20/index.html +57 -0
  375. package/page/21/index.html +61 -0
  376. package/page/22/index.html +55 -0
  377. package/page/23/index.html +64 -0
  378. package/page/24/index.html +60 -0
  379. package/page/25/index.html +58 -0
  380. package/page/26/index.html +48 -0
  381. package/page/27/index.html +58 -0
  382. package/page/3/index.html +48 -0
  383. package/page/4/index.html +48 -0
  384. package/page/5/index.html +51 -0
  385. package/page/6/index.html +51 -0
  386. package/page/7/index.html +51 -0
  387. package/page/8/index.html +53 -0
  388. package/page/9/index.html +48 -0
  389. package/randomcall/README.html +1 -0
  390. package/randomcall/lucker.html +290 -0
  391. package/randomcall/lucky.png +0 -0
  392. package/robots.txt +22 -0
  393. package/search.xml +6740 -0
  394. package/sitemap.xml +2669 -0
  395. package/tags//345/216/237/345/210/233/index.html +48 -0
  396. package/tags//345/250/261/344/271/220/index.html +48 -0
  397. package/tags//346/211/213/345/206/231/index.html +48 -0
  398. package/tags//347/226/253/346/203/205/index.html +48 -0
  399. package/tags//350/275/254/350/275/275/index.html +48 -0
  400. package/tags//350/275/254/350/275/275/page/2/index.html +48 -0
  401. package/v.html +90 -0
@@ -0,0 +1,538 @@
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>20个棘手的ES6面试问题来提高JavaScript技能 | 前端壹菜鸟</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">20个棘手的ES6面试问题来提高JavaScript技能</h1><div class="post-meta"><span class="date">2019-12-09</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%89%8D%E7%AB%AF/">前端 </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.2k</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"> 17</span><span class="post-meta-item-text"> 分钟</span></span></span></div><a class="disqus-comment-count" href="/article/52500.html#vcomment"><span class="waline-comment-count" data-path="/article/52500.html"></span><span> 条评论</span></a><div class="post-content"><p><code>原文地址:https://www.html.cn/web/javascript/14238.html</code></p>
20
+ <p>ECMAScript 6(以下简称ES6)是 JS 语言的下一代标准,已经在<code>2015</code>年<code>6</code>月正式发布了。它的目标,是使得 JS 语言可以用来编写复杂的大型应用程序,成为企业级开发语言。接下来咱们来看看 20 道棘手的面试题,通过做题,顺带提升一下咱们的 JS 的技能。</p>
21
+ <span id="more"></span>
22
+ <p><img src="https://img.php.cn/upload/article/000/000/006/5ddb99e59aece319.jpg" alt="xuehuayu.cn"></p>
23
+ <h4 id="问题1:可以解释一下-ES5-和ES6的区别吗"><a href="#问题1:可以解释一下-ES5-和ES6的区别吗" class="headerlink" title="问题1:可以解释一下 ES5 和ES6的区别吗?"></a>问题1:可以解释一下 <code>ES5</code> 和<code>ES6</code>的区别吗?</h4><blockquote>
24
+ <p>主题: JavaScript<br>难度: ⭐⭐⭐</p>
25
+ </blockquote>
26
+ <p>**ECMAScript 5 (ES5)**:ECMAScript 的第五版,于2009年标准化,该标准已在所有现代浏览器中完全支持。</p>
27
+ <p><strong>ECMAScript 6 (ES6)&#x2F; ECMAScript 2015 (ES2015)</strong>:ECMAscript 第 6 版,2015 年标准化。这个标准已经在大多数现代浏览器中部分实现。</p>
28
+ <p>以下是ES5和ES6之间的一些主要区别:</p>
29
+ <p><strong>箭头函数和字符串插值</strong></p>
30
+ <pre><code>const greetings = (name) =&gt; &#123;
31
+ return `hello $&#123;name&#125;`;
32
+ &#125;
33
+ </code></pre>
34
+ <p>也可以这样写:</p>
35
+ <pre><code>const greetings = name =&gt; `hello $&#123;name&#125;`;
36
+ </code></pre>
37
+ <p><strong>const</strong>:<code>const</code> 表示无法修改变量的原始值。需要注意的是,<code>const</code>表示对值的常量引用,咱们可以改变被引用的对象的属性值,但不能改变引用本身。</p>
38
+ <pre><code>const NAMES = [];
39
+ NAMES.push(&quot;Jim&quot;);
40
+ console.log(NAMES.length === 1); // true
41
+ NAMES = [&quot;Steve&quot;, &quot;John&quot;]; // error
42
+ </code></pre>
43
+ <p><strong>块作用域</strong>:ES6 中 <code>let</code>, <code>const</code> 会创建块级作用域,不会像 <code>var</code> 声明变量一样会被提升。</p>
44
+ <p><strong>默认参数</strong>:默认参数使咱们可以使用默认值初始化函数。当参数省略或 <code>undefined</code> 时使用默认参数值。</p>
45
+ <pre><code>function multiply (a, b = 2) &#123;
46
+ return a * b;
47
+ &#125;
48
+ multiply(5); // 10
49
+ </code></pre>
50
+ <p><strong>类定义与继承</strong></p>
51
+ <p>ES6 引入了对类(<code>class</code>关键字)、构造函数(<code>constructor</code>关键字)和 <code>extend</code> 关键字(用于继承)的语言支持。</p>
52
+ <p><strong>for-of 运算符</strong></p>
53
+ <p><code>for...of</code> 语句创建一个遍历可迭代对象的循环。</p>
54
+ <p><strong>展开操作符</strong></p>
55
+ <pre><code>const obj1 = &#123; a: 1, b: 2 &#125;
56
+ const obj2 = &#123; a: 2, c: 3, d: 4&#125;
57
+ const obj3 = &#123;...obj1, ...obj2&#125;
58
+ </code></pre>
59
+ <p><strong>Promises</strong>: Promises 提供了一种机制来处理异步操作的结果和错误。可以使用回调来完成相同的事情,但是<code>Promises</code> 通过方法链接和简洁的错误处理来提高可读性。</p>
60
+ <pre><code>const isGreater = (a, b) =&gt; &#123;
61
+ return new Promise ((resolve, reject) =&gt; &#123;
62
+ if(a &gt; b) &#123;
63
+ resolve(true)
64
+ &#125; else &#123;
65
+ reject(false)
66
+ &#125;
67
+ &#125;)
68
+ &#125;
69
+ isGreater(1, 2)
70
+ .then(result =&gt; &#123;
71
+ console.log(&#39;greater&#39;)
72
+ &#125;)
73
+ .catch(result =&gt; &#123;
74
+ console.log(&#39;smaller&#39;)
75
+ &#125;)
76
+ </code></pre>
77
+ <p><strong>模块导出</strong></p>
78
+ <pre><code>const myModule = &#123; x: 1, y: () =&gt; &#123; console.log(&#39;This is ES5&#39;) &#125; &#125;
79
+ export default myModule;
80
+ </code></pre>
81
+ <p><strong>和导入</strong></p>
82
+ <pre><code>import myModule from &#39;./myModule&#39;;
83
+ </code></pre>
84
+ <h4 id="问题-2:什么是-IIFE-立即调用的函数表达式"><a href="#问题-2:什么是-IIFE-立即调用的函数表达式" class="headerlink" title="问题 2:什么是 IIFE (立即调用的函数表达式)"></a>问题 2:什么是 IIFE (立即调用的函数表达式)</h4><blockquote>
85
+ <p>主题: JavaScript<br>难度: ⭐⭐⭐</p>
86
+ </blockquote>
87
+ <p><code>IIFE</code>是一个立即调用的函数表达式,它在创建后立即执行</p>
88
+ <pre><code>(function IIFE()&#123;
89
+ console.log( &quot;Hello!&quot; );
90
+ &#125;)();
91
+ // &quot;Hello!&quot;
92
+ </code></pre>
93
+ <p>常常使用此模式来避免污染全局命名空间,因为在<code>IIFE</code>中使用的所有变量(与任何其他普通函数一样)在其作用域之外都是不可见的。</p>
94
+ <h4 id="问题-3:何时在-ES6-中使用箭头函数?"><a href="#问题-3:何时在-ES6-中使用箭头函数?" class="headerlink" title="问题 3:何时在 ES6 中使用箭头函数?"></a>问题 3:何时在 ES6 中使用箭头函数?</h4><blockquote>
95
+ <p>主题: JavaScript<br>难度: ⭐⭐⭐</p>
96
+ </blockquote>
97
+ <p>以下是一些经验分享:</p>
98
+ <ul>
99
+ <li>在全局作用域内和<code>Object.prototype</code>属性中使用 <code>function</code> 。</li>
100
+ <li>为对象构造函数使用 <code>class</code>。</li>
101
+ <li>其它情况使用箭头函数。</li>
102
+ </ul>
103
+ <p>为啥大多数情况都使用<strong>箭头函数</strong>?</p>
104
+ <ul>
105
+ <li><strong>作用域安全性</strong>:当箭头函数被一致使用时,所有东西都保证使用与根对象相同的<code>thisObject</code>。如果一个标准函数回调与一堆箭头函数混合在一起,那么作用域就有可能变得混乱。</li>
106
+ <li><strong>紧凑性</strong>:箭头函数更容易读写。</li>
107
+ <li>清晰度:使用箭头函数可明确知道当前 <code>this</code> 指向。</li>
108
+ </ul>
109
+ <h4 id="问题-4-将-Symbol-引入ES6-的目的是什么?"><a href="#问题-4-将-Symbol-引入ES6-的目的是什么?" class="headerlink" title="问题 4:将 Symbol 引入ES6 的目的是什么?"></a>问题 4:将 Symbol 引入ES6 的目的是什么?</h4><blockquote>
110
+ <p>主题: JavaScript<br>难度: ⭐⭐⭐</p>
111
+ </blockquote>
112
+ <p><code>Symbol</code> 是一种新的、特殊的对象,可以用作对象中惟一的属性名。使用 <code>Symbol</code> 替换<code>string</code> 可以避免不同的模块属性的冲突。还可以将<code>Symbol</code>设置为私有,以便尚无直接访问<code>Symbol</code>权限的任何人都不能访问它们的属性。</p>
113
+ <p><code>Symbol</code> 是JS新的基本数据类型。与<code>number</code>、<code>string</code>和<code>boolean</code> 原始类型一样,<code>Symbol</code> 也有一个用于创建它们的函数。与其他原始类型不同,<code>Symbol</code>没有字面量语法。创建它们的唯一方法是使用以下方法中的<code>Symbol</code>构造函数</p>
114
+ <pre><code>let symbol = Symbol();
115
+ </code></pre>
116
+ <h4 id="问题-5-在-ES6-中使用展开-spread-语法有什么好处-它与剩余-rest-语法有什么不同"><a href="#问题-5-在-ES6-中使用展开-spread-语法有什么好处-它与剩余-rest-语法有什么不同" class="headerlink" title="问题 5: 在 ES6 中使用展开(spread)语法有什么好处? 它与剩余(rest)语法有什么不同?"></a>问题 5: 在 ES6 中使用展开(spread)语法有什么好处? 它与剩余(rest)语法有什么不同?</h4><blockquote>
117
+ <p>主题: JavaScript<br>难度: ⭐⭐⭐</p>
118
+ </blockquote>
119
+ <p>ES6 的展开语法在以函数形式进行编码时非常有用,因为咱们可以轻松地创建数组或对象的副本,而无需求助于<code>Object.create,slice</code>或库函数。<code>Redux</code> 和<code>rx.js</code>项目中经常使用此特性。</p>
120
+ <pre><code>function putDookieInAnyArray(arr) &#123;
121
+ return [...arr, &#39;dookie&#39;];
122
+ &#125;
123
+
124
+ const result = putDookieInAnyArray([&#39;I&#39;, &#39;really&#39;, &quot;don&#39;t&quot;, &#39;like&#39;]);
125
+ // [&quot;I&quot;, &quot;really&quot;, &quot;don&#39;t&quot;, &quot;like&quot;, &quot;dookie&quot;]
126
+
127
+ const person = &#123;
128
+ name: &#39;Todd&#39;,
129
+ age: 29,
130
+ &#125;;
131
+
132
+ const copyOfTodd = &#123; ...person &#125;;
133
+ </code></pre>
134
+ <p>ES6 的 rest 语法提供了一种捷径,其中包括要传递给函数的任意数量的参数。</p>
135
+ <p>就像展开语法的逆过程一样,它将数据放入并填充到数组中而不是展开数组,并且它在函数变量以及数组和对象解构分中也经常用到。</p>
136
+ <pre><code> function addFiveToABunchOfNumbers(...numbers) &#123;
137
+ return numbers.map(x =&gt; x + 5);
138
+ &#125;
139
+
140
+ const result = addFiveToABunchOfNumbers(4, 5, 6, 7, 8, 9, 10);
141
+ // [9, 10, 11, 12, 13, 14, 15]
142
+
143
+ const [a, b, ...rest] = [1, 2, 3, 4]; // a: 1, b: 2, rest: [3, 4]
144
+
145
+ const &#123; e, f, ...others &#125; = &#123;
146
+ e: 1,
147
+ f: 2,
148
+ g: 3,
149
+ h: 4,
150
+ &#125;; // e: 1, f: 2, others: &#123; g: 3, h: 4 &#125;
151
+ </code></pre>
152
+ <h4 id="问题-6-ES6-类和-ES5-函数构造函数有什么区别?"><a href="#问题-6-ES6-类和-ES5-函数构造函数有什么区别?" class="headerlink" title="问题 6: ES6 类和 ES5 函数构造函数有什么区别?"></a>问题 6: ES6 类和 ES5 函数构造函数有什么区别?</h4><blockquote>
153
+ <p>主题: JavaScript<br>难度: ⭐⭐⭐</p>
154
+ </blockquote>
155
+ <pre><code>// ES5 Function Constructor
156
+ function Person(name) &#123;
157
+ this.name = name;
158
+ &#125;
159
+
160
+ // ES6 Class
161
+ class Person &#123;
162
+ constructor(name) &#123;
163
+ this.name = name;
164
+ &#125;
165
+ &#125;
166
+ </code></pre>
167
+ <p>对于简单的构造函数,它们看起来非常相似。</p>
168
+ <p>构造函数的主要区别在于使用继承。如果咱们创建一个继承<code>Person</code>类的<code>Student</code>子类并添加一个<code>studentId</code>字段,以下是两种方式的使用:</p>
169
+ <pre><code>// ES5 Function Constructor
170
+ function Student(name, studentID) &#123;
171
+ // 调用你类的构造函数以初始化你类派生的成员。
172
+ Person.call(this. name)
173
+ // 初始化子类的成员。
174
+ this.studentId = studentId
175
+ &#125;
176
+
177
+ Student.prototype = Object.create(Person.prototype)
178
+ Student.prototype.constructor = Student
179
+
180
+ // ES6 Class
181
+ class Student extends Person &#123;
182
+ constructor(name, studentId) &#123;
183
+ super(name)
184
+ this.studentId = studentId
185
+ &#125;
186
+ &#125;
187
+ </code></pre>
188
+ <p>在 ES5 中使用继承要复杂得多,而且 ES6 版本更容易理解和记住。</p>
189
+ <h4 id="问题-7-call-和-apply-区别是啥?"><a href="#问题-7-call-和-apply-区别是啥?" class="headerlink" title="问题 7: .call 和 .apply 区别是啥?"></a>问题 7: <code>.call</code> 和 <code>.apply</code> 区别是啥?</h4><blockquote>
190
+ <p>主题: JavaScript<br>难度: ⭐⭐⭐</p>
191
+ </blockquote>
192
+ <p><code>.call</code>和<code>.apply</code>均用于调用函数,并且第一个参数将用作函数中<code>this</code>的值。但是,<code>.call</code>将逗号分隔的参数作为下一个参数,而<code>.apply</code>将参数数组作为下一个参数。简单记忆法:<strong>C</strong>用于<code>call</code>和逗号分隔,<strong>A</strong>用于<code>apply</code>和参数数组。</p>
193
+ <pre><code> function add(a, b) &#123;
194
+ return a + b;
195
+ &#125;
196
+
197
+ console.log(add.call(null, 1, 2)); // 3
198
+ console.log(add.apply(null, [1, 2])); // 3
199
+ </code></pre>
200
+ <h4 id="问题-8-为什么要使用-ES6-类?"><a href="#问题-8-为什么要使用-ES6-类?" class="headerlink" title="问题 8: 为什么要使用 ES6 类?"></a>问题 8: 为什么要使用 ES6 类?</h4><blockquote>
201
+ <p>主题: JavaScript<br>难度: ⭐⭐⭐</p>
202
+ </blockquote>
203
+ <p>选择使用类的一些原因:</p>
204
+ <ul>
205
+ <li>语法更简单,更不容易出错。</li>
206
+ <li>使用新语法比使用旧语法更容易(而且更不易出错)地设置继承层次结构。</li>
207
+ <li><code>class</code>可以避免构造函数中使用new的常见错误(如果构造函数不是有效的对象,则使构造函数抛出异常)。</li>
208
+ <li>用新语法调用父原型方法的版本比旧语法要简单得多,用<code>super.method()</code>代替<code>ParentConstructor.prototype.method.call(this)</code> 或<code>Object.getPrototypeOf(Object.getPrototypeOf(this)).method.call(this)</code></li>
209
+ </ul>
210
+ <p>考虑下面代码:</p>
211
+ <pre><code>// **ES5**
212
+ var Person = function(first, last) &#123;
213
+ if (!(this instanceof Person)) &#123;
214
+ throw new Error(&quot;Person is a constructor function, use new with it&quot;);
215
+ &#125;
216
+ this.first = first;
217
+ this.last = last;
218
+ &#125;;
219
+
220
+ Person.prototype.personMethod = function() &#123;
221
+ return &quot;Result from personMethod: this.first = &quot; + this.first + &quot;, this.last = &quot; + this.last;
222
+ &#125;;
223
+
224
+ var Employee = function(first, last, position) &#123;
225
+ if (!(this instanceof Employee)) &#123;
226
+ throw new Error(&quot;Employee is a constructor function, use new with it&quot;);
227
+ &#125;
228
+ Person.call(this, first, last);
229
+ this.position = position;
230
+ &#125;;
231
+ Employee.prototype = Object.create(Person.prototype);
232
+ Employee.prototype.constructor = Employee;
233
+ Employee.prototype.personMethod = function() &#123;
234
+ var result = Person.prototype.personMethod.call(this);
235
+ return result + &quot;, this.position = &quot; + this.position;
236
+ &#125;;
237
+ Employee.prototype.employeeMethod = function() &#123;
238
+ // ...
239
+ &#125;;
240
+ </code></pre>
241
+ <p>使用 ES6 实现上述功能:</p>
242
+ <pre><code>// ***ES2015+**
243
+ class Person &#123;
244
+ constructor(first, last) &#123;
245
+ this.first = first;
246
+ this.last = last;
247
+ &#125;
248
+
249
+ personMethod() &#123;
250
+ // ...
251
+ &#125;
252
+ &#125;
253
+
254
+ class Employee extends Person &#123;
255
+ constructor(first, last, position) &#123;
256
+ super(first, last);
257
+ this.position = position;
258
+ &#125;
259
+
260
+ employeeMethod() &#123;
261
+ // ...
262
+ &#125;
263
+ &#125;
264
+ </code></pre>
265
+ <h4 id="问题-9-在-JS-中定义枚举的首选语法是什么"><a href="#问题-9-在-JS-中定义枚举的首选语法是什么" class="headerlink" title="问题 9: 在 JS 中定义枚举的首选语法是什么"></a>问题 9: 在 JS 中定义枚举的首选语法是什么</h4><blockquote>
266
+ <p>主题: JavaScript<br>难度: ⭐⭐⭐</p>
267
+ </blockquote>
268
+ <p>可以 <code>Object.freeze</code> 来实现枚举</p>
269
+ <pre><code>var DaysEnum = Object.freeze(&#123;
270
+ &quot;monday&quot;: 1,
271
+ &quot;tuesday&quot;: 2,
272
+ &quot;wednesday&quot;: 3,
273
+ ...
274
+ &#125;)
275
+ </code></pre>
276
+ <p>或者</p>
277
+ <pre><code>var DaysEnum = &#123;
278
+ &quot;monday&quot;: 1,
279
+ &quot;tuesday&quot;: 2,
280
+ &quot;wednesday&quot;: 3,
281
+ ...
282
+ &#125;
283
+ Object.freeze(DaysEnum)
284
+ </code></pre>
285
+ <p>但是,这阻止咱们把值分配给变量:</p>
286
+ <pre><code>let day = DaysEnum.tuesday
287
+ day = 298832342 // 不会报错
288
+ </code></pre>
289
+ <h4 id="问题-10-解释一下-Object-freeze-和-const-的区别"><a href="#问题-10-解释一下-Object-freeze-和-const-的区别" class="headerlink" title="问题 10: 解释一下 Object.freeze() 和 const 的区别"></a>问题 10: 解释一下 <code>Object.freeze()</code> 和 <code>const</code> 的区别</h4><blockquote>
290
+ <p>主题: JavaScript<br>难度: ⭐⭐⭐</p>
291
+ </blockquote>
292
+ <p><code>const</code>和<code>Object.freeze</code>是两个完全不同的概念。</p>
293
+ <p><code>const</code> 声明一个只读的变量,一旦声明,常量的值就不可改变:</p>
294
+ <pre><code>const person = &#123;
295
+ name: &quot;Leonardo&quot;
296
+ &#125;;
297
+ let animal = &#123;
298
+ species: &quot;snake&quot;
299
+ &#125;;
300
+ person = animal; // ERROR &quot;person&quot; is read-only
301
+ </code></pre>
302
+ <p><code>Object.freeze</code>适用于值,更具体地说,适用于对象值,它使对象不可变,即不能更改其属性。</p>
303
+ <pre><code>let person = &#123;
304
+ name: &quot;Leonardo&quot;
305
+ &#125;;
306
+ let animal = &#123;
307
+ species: &quot;snake&quot;
308
+ &#125;;
309
+ Object.freeze(person);
310
+ person.name = &quot;Lima&quot;; //TypeError: Cannot assign to read only property &#39;name&#39; of object
311
+ console.log(person);
312
+ </code></pre>
313
+ <h4 id="问题-11-JS-的提升是什么"><a href="#问题-11-JS-的提升是什么" class="headerlink" title="问题 11: JS 的提升是什么"></a>问题 11: JS 的提升是什么</h4><blockquote>
314
+ <p>主题: JavaScript<br>难度: ⭐⭐⭐⭐</p>
315
+ </blockquote>
316
+ <p>提升是指 JS 解释器将所有变量和函数声明移动到当前作用域顶部的操作,提升有两种类型</p>
317
+ <ul>
318
+ <li>变量提升</li>
319
+ <li>函数提升</li>
320
+ </ul>
321
+ <p>只要一个<code>var</code>(或函数声明)出现在一个作用域内,这个声明就被认为属于整个作用域,并且可以在任何地方访问。</p>
322
+ <pre><code>var a = 2
323
+ foo() // 正常运行, foo 已被提升
324
+
325
+ function foo() &#123;
326
+ a = 3
327
+ console.log(a) // 3
328
+ var a
329
+ &#125;
330
+
331
+ console.log( a ) // 2
332
+ </code></pre>
333
+ <h4 id="问题-12-解释一下原型设计模式-Prototype-Pattern"><a href="#问题-12-解释一下原型设计模式-Prototype-Pattern" class="headerlink" title="问题 12: 解释一下原型设计模式(Prototype Pattern)"></a>问题 12: 解释一下原型设计模式(Prototype Pattern)</h4><blockquote>
334
+ <p>主题: JavaScript<br>难度: ⭐⭐⭐⭐</p>
335
+ </blockquote>
336
+ <p>原型模式会创建新的对象,而不是创建未初始化的对象,它会返回使用从原型或样本对象复制的值进行初始化的对象。原型模式也称为属性模式。</p>
337
+ <p>原型模式有用的一个例子是使用与数据库中的默认值匹配的值初始化业务对象。原型对象保留默认值,这些默认值将被复制到新创建的业务对象中。</p>
338
+ <p>传统语言很少使用原型模式,但是JavaScript作为一种原型语言,在构建新对象及其原型时使用这种模式。</p>
339
+ <h4 id="问题-13-ES6-中的临时死区是什么"><a href="#问题-13-ES6-中的临时死区是什么" class="headerlink" title="问题 13: ES6 中的临时死区是什么"></a>问题 13: ES6 中的临时死区是什么</h4><blockquote>
340
+ <p>主题: JavaScript<br>难度: ⭐⭐⭐⭐</p>
341
+ </blockquote>
342
+ <p>在 ES6 中,<code>let</code> 和<code>const</code> 跟 <code>var</code>、<code>class</code>和<code>function</code>一样也会被提升,只是在进入作用域和被声明之间有一段时间不能访问它们,这段时间是**临时死区(TDZ)**。</p>
343
+ <pre><code>//console.log(aLet) // would throw ReferenceError
344
+
345
+ let aLet;
346
+ console.log(aLet); // undefined
347
+ aLet = 10;
348
+ console.log(aLet); // 10
349
+ </code></pre>
350
+ <h4 id="问题-14-什么时候不使用箭头函数-说出三个或更多的例子"><a href="#问题-14-什么时候不使用箭头函数-说出三个或更多的例子" class="headerlink" title="问题 14: 什么时候不使用箭头函数? 说出三个或更多的例子"></a>问题 14: 什么时候不使用箭头函数? 说出三个或更多的例子</h4><blockquote>
351
+ <p>主题: JavaScript<br>难度: ⭐⭐⭐⭐</p>
352
+ </blockquote>
353
+ <p>不应该使用箭头函数一些情况:</p>
354
+ <ul>
355
+ <li>当想要函数被提升时(箭头函数是匿名的)</li>
356
+ <li>要在函数中使用<code>this/arguments</code>时,由于箭头函数本身不具有<code>this/arguments</code>,因此它们取决于外部上下文</li>
357
+ <li>使用命名函数(箭头函数是匿名的)</li>
358
+ <li>使用函数作为构造函数时(箭头函数没有构造函数)</li>
359
+ <li>当想在对象字面是以将函数作为属性添加并在其中使用对象时,因为咱们无法访问 <code>this</code> 即对象本身。</li>
360
+ </ul>
361
+ <h4 id="问题-15-ES6-中的-WeakMa-p的实际用途是什么?"><a href="#问题-15-ES6-中的-WeakMa-p的实际用途是什么?" class="headerlink" title="问题 15: ES6 中的 WeakMa p的实际用途是什么?"></a>问题 15: ES6 中的 WeakMa p的实际用途是什么?</h4><blockquote>
362
+ <p>主题: JavaScript<br>难度: ⭐⭐⭐⭐</p>
363
+ </blockquote>
364
+ <p><strong>WeakMaps</strong> 提供了一种从外部扩展对象而不影响垃圾收集的方法。当咱们想要扩展一个对象,但是因为它是封闭的或者来自外部源而不能扩展时,可以应用<code>WeakMap</code>。</p>
365
+ <p><strong>WeakMap</strong>只适用于 ES6 或以上版本。<strong>WeakMap</strong>是键和值对的集合,其中键<strong>必须是对象</strong>。</p>
366
+ <pre><code>var map = new WeakMap();
367
+ var pavloHero = &#123;
368
+ first: &quot;Pavlo&quot;,
369
+ last: &quot;Hero&quot;
370
+ &#125;;
371
+ var gabrielFranco = &#123;
372
+ first: &quot;Gabriel&quot;,
373
+ last: &quot;Franco&quot;
374
+ &#125;;
375
+ map.set(pavloHero, &quot;This is Hero&quot;);
376
+ map.set(gabrielFranco, &quot;This is Franco&quot;);
377
+ console.log(map.get(pavloHero)); //This is Hero
378
+ </code></pre>
379
+ <p><strong>WeakMaps</strong>的有趣之处在于,它包含了对<code>map</code>内部键的弱引用。弱引用意味着如果对象被销毁,垃圾收集器将从<code>WeakMap</code>中删除整个条目,从而释放内存。</p>
380
+ <h4 id="问题-16-说明下列方法为何不能用作-IIFE,要使其成为-IIFE,需要进行哪些更改?"><a href="#问题-16-说明下列方法为何不能用作-IIFE,要使其成为-IIFE,需要进行哪些更改?" class="headerlink" title="问题 16: 说明下列方法为何不能用作 IIFE,要使其成为 IIFE,需要进行哪些更改?"></a>问题 16: 说明下列方法为何不能用作 IIFE,要使其成为 IIFE,需要进行哪些更改?</h4><blockquote>
381
+ <p>主题: JavaScript<br>难度: ⭐⭐⭐⭐</p>
382
+ </blockquote>
383
+ <pre><code>function foo()&#123; &#125;();
384
+ </code></pre>
385
+ <p><code>IIFE</code> 代表立即调用的函数表达式。JS解析器读取函数<code>foo()&#123;&#125;();</code>作为函数<code>foo()&#123;&#125;</code>和<code>();</code>,前者是一个函数声明,后者(一对括号)是尝试调用一个函数,但没有指定名称,因此它抛出<code>Uncaught SyntaxError: Unexpected token</code> 异常。</p>
386
+ <p>咱们可以使用<code>void</code>操作符:<code>void function foo()&#123; &#125;();</code>。不幸的是,这种方法有一个问题。给定表达式的求值总是<code>undefined</code>的,所以如果IIFE 函数有返回值,则不能使用它,如下所示:</p>
387
+ <pre><code>const foo = void
388
+ function bar() &#123;
389
+ console.log(&#39;前端小智&#39;)
390
+ return &#39;foo&#39;;
391
+ &#125;();
392
+
393
+ console.log(foo); // undefined
394
+ </code></pre>
395
+ <h4 id="问题-17-能否比较模块模式与构造函数-x2F-原型模式的用法?"><a href="#问题-17-能否比较模块模式与构造函数-x2F-原型模式的用法?" class="headerlink" title="问题 17: 能否比较模块模式与构造函数&#x2F;原型模式的用法?"></a>问题 17: 能否比较模块模式与构造函数&#x2F;原型模式的用法?</h4><blockquote>
396
+ <p>主题: JavaScript<br>难度: ⭐⭐⭐⭐</p>
397
+ </blockquote>
398
+ <p>模块模式通常用于命名空间,在该模式中,使用单个实例作为存储来对相关函数和对象进行分组。这是一个不同于原型设计的用例,它们并不是相互排斥,咱们可以同时使用它们(例如,将一个构造函数放在一个模块中,并使用<code>new MyNamespace.MyModule.MyClass(arguments)</code> )。</p>
399
+ <p>构造函数和原型是实现类和实例的合理方法之一。它们与模型并不完全对应,因此通常需要选择一个特定的<code>scheme</code>或辅助方法来实现原型中的类。</p>
400
+ <h4 id="问题-18-ES6-Map-和-WeakMap-有什么区别?"><a href="#问题-18-ES6-Map-和-WeakMap-有什么区别?" class="headerlink" title="问题 18: ES6 Map 和 WeakMap 有什么区别?"></a>问题 18: ES6 Map 和 WeakMap 有什么区别?</h4><blockquote>
401
+ <p>主题: JavaScript<br>难度: ⭐⭐⭐⭐⭐</p>
402
+ </blockquote>
403
+ <p>当它们的键&#x2F;值引用的对象被删除时,它们的行为都不同,以下面的代码为例:</p>
404
+ <pre><code>var map = new Map()
405
+ var weakmap = new WeakMap()
406
+
407
+ (function() &#123;
408
+ var a = &#123;
409
+ x: 12
410
+ &#125;;
411
+ var b = &#123;
412
+ y: 12
413
+ &#125;;
414
+
415
+ map.set(a, 1);
416
+ weakmap.set(b, 2);
417
+ &#125;)()
418
+ </code></pre>
419
+ <p>执行上面的 IIFE,就无法再引用<code>&#123;x:12&#125;</code>和<code>&#123;y:12&#125;</code>。垃圾收集器继续运行,并从 <code>WeakMa</code>中删除<code>键b</code>指针,还从内存中删除了<code>&#123;y:12&#125;</code>。</p>
420
+ <p>但在使用 <code>Map</code>的情况下,垃圾收集器不会从<code>Map</code>中删除指针,也不会从内存中删除<code>&#123;x:12&#125;</code>。</p>
421
+ <p><code>WeakMap</code> 允许垃圾收集器执行其回收任务,但<code>Map</code>不允许。对于手动编写的 <code>Map</code>,数组将保留对键对象的引用,以防止被垃圾回收。但在<code>WeakMap</code>中,对键对象的引用被“弱”保留,这意味着在没有其他对象引用的情况下,它们不会阻止垃圾回收。</p>
422
+ <h4 id="问题-19-举一个柯里化函数的例子,并说明柯里化的好处?"><a href="#问题-19-举一个柯里化函数的例子,并说明柯里化的好处?" class="headerlink" title="问题 19: 举一个柯里化函数的例子,并说明柯里化的好处?"></a>问题 19: 举一个柯里化函数的例子,并说明柯里化的好处?</h4><blockquote>
423
+ <p>主题: JavaScript<br>难度: ⭐⭐⭐⭐⭐</p>
424
+ </blockquote>
425
+ <p>柯里化是一种模式,其中一个具有多个参数的函数被分解成多个函数,当被串联调用时,这些函数将一次累加一个所需的所有参数。这种技术有助于使用函数式编写的代码更容易阅读和编写。需要注意的是,要实现一个函数,它需要从一个函数开始,然后分解成一系列函数,每个函数接受一个参数。</p>
426
+ <pre><code>function curry(fn) &#123;
427
+ if (fn.length === 0) &#123;
428
+ return fn;
429
+ &#125;
430
+
431
+ function _curried(depth, args) &#123;
432
+ return function(newArgument) &#123;
433
+ if (depth - 1 === 0) &#123;
434
+ return fn(...args, newArgument);
435
+ &#125;
436
+ return _curried(depth - 1, [...args, newArgument]);
437
+ &#125;;
438
+ &#125;
439
+
440
+ return _curried(fn.length, []);
441
+ &#125;
442
+
443
+ function add(a, b) &#123;
444
+ return a + b;
445
+ &#125;
446
+
447
+ var curriedAdd = curry(add);
448
+ var addFive = curriedAdd(5);
449
+
450
+ var result = [0, 1, 2, 3, 4, 5].map(addFive); // [5, 6, 7, 8, 9, 10]
451
+ </code></pre>
452
+ <h4 id="问题-20-如何在-JS-中“深冻结”对象"><a href="#问题-20-如何在-JS-中“深冻结”对象" class="headerlink" title="问题 20: 如何在 JS 中“深冻结”对象"></a>问题 20: 如何在 JS 中“深冻结”对象</h4><blockquote>
453
+ <p>主题: JavaScript<br>难度: ⭐⭐⭐⭐⭐</p>
454
+ </blockquote>
455
+ <p>如果咱们想要确保对象被深冻结,就必须创建一个递归函数来冻结对象类型的每个属性:</p>
456
+ <p><strong>没有深冻结</strong></p>
457
+ <pre><code>let person = &#123;
458
+ name: &quot;Leonardo&quot;,
459
+ profession: &#123;
460
+ name: &quot;developer&quot;
461
+ &#125;
462
+ &#125;;
463
+ Object.freeze(person);
464
+ person.profession.name = &quot;doctor&quot;;
465
+ console.log(person); //output &#123; name: &#39;Leonardo&#39;, profession: &#123; name: &#39;doctor&#39; &#125; &#125;
466
+ </code></pre>
467
+ <p><strong>深冻结</strong></p>
468
+ <pre><code>function deepFreeze(object) &#123;
469
+ let propNames = Object.getOwnPropertyNames(object);
470
+ for (let name of propNames) &#123;
471
+ let value = object[name];
472
+ object[name] = value &amp;&amp; typeof value === &quot;object&quot; ?
473
+ deepFreeze(value) : value;
474
+ &#125;
475
+ return Object.freeze(object);
476
+ &#125;
477
+ let person = &#123;
478
+ name: &quot;Leonardo&quot;,
479
+ profession: &#123;
480
+ name: &quot;developer&quot;
481
+ &#125;
482
+ &#125;;
483
+ deepFreeze(person);
484
+ person.profession.name = &quot;doctor&quot;; // TypeError: Cannot assign to read only property &#39;name&#39; of object
485
+ </code></pre>
486
+ <p><code>原文地址:https://dev.to/fullstackcafe/20-tricky-es6-interview-questions-to-revamp-your-javascript-skills-5a4o</code></p>
487
+ <p>为了保证的可读性,本文采用意译而非直译。</p>
488
+ <p>以上就是20个棘手的ES6面试问题来提高JavaScript技能的详细内容,更多请关注html中文网其它相关文章!</p>
489
+ </div><iframe src="/donate/?AliPayQR=https://store.xuehuayu.cn/store/public/alipay_qr.jpg&amp;WeChatQR=https://store.xuehuayu.cn/store/public/wechat_qr.png&amp;UnionPayQR=null&amp;GitHub=null&amp;BTCQR=null&amp;BTCKEY=null&amp;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/52500.html">https://xuehuayu.cn/article/52500.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/43999.html">11 种在大多数教程中找不到的JavaScript技巧</a><a class="next" href="/article/54258.html">50个最简单的JavaScript面试题</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
490
+ const serverURL = origin.includes('cainiaoblog') ? 'https://cmts.cainiaoblog.cn' : 'https://cmts.xuehuayu.cn'
491
+ const locale = {
492
+ placeholder: '请正确填写昵称和邮箱,方便接收回复通知~',
493
+ sofa: '沙发空缺中,还不快抢~',
494
+ };
495
+ Waline.init({
496
+ el: '#vcomment',
497
+ serverURL: serverURL,
498
+ pageSize: '20',
499
+ visitor: true, // 阅读量统计
500
+ requiredMeta: ['nick', 'mail'],
501
+ emoji: [
502
+ 'https://cdn.jsdelivr.net/gh/walinejs/emojis@1.0.0/weibo',
503
+ 'https://cdn.jsdelivr.net/gh/walinejs/emojis@1.0.0/qq',
504
+ 'https://cdn.jsdelivr.net/gh/walinejs/emojis@1.0.0/tw-emoji',
505
+ ],
506
+ locale,
507
+ pageview: true
508
+ })
509
+ </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() {
510
+ var val = $(this).val()
511
+ 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>'
512
+ 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>'
513
+ 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>'
514
+
515
+ if (val === 'self') {
516
+ $('#search').html(self)
517
+ var search_path = 'search.xml';
518
+ if (search_path.length == 0) {
519
+ search_path = 'search.xml';
520
+ }
521
+ var path = 'https://cdn.staticaly.com/gh/npljy/npljy.github.io/main/' + search_path;
522
+ searchFunc(path, 'local-search-input', 'local-search-result');
523
+ } else if (val === 'baidu') {
524
+ $('#search').html(baidu)
525
+ } else if (val === 'google') {
526
+ $('#search').html(google)
527
+ }
528
+ })</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(){
529
+ var cnb =window.location.origin.indexOf('cainiaoblog') !==-1
530
+ if (cnb) {
531
+ var gxba =document.getElementById('gxba')
532
+ var gaba =document.getElementById('gaba')
533
+ var gabaLink =document.getElementById('gaba-link')
534
+ gxba.innerText ='京ICP备20007647号-1'
535
+ gaba.innerText ='京公网安备 11010802031254号'
536
+ gabaLink.setAttribute('href','http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=11010802031254')
537
+ }
538
+ })()</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&amp;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>