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,440 @@
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>面试常考手写代码学习技巧总结 | 前端壹菜鸟</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">面试常考手写代码学习技巧总结</h1><div class="post-meta"><span class="date">2020-01-16</span><span> | </span><span class="tag"><a href="/tags/%E8%BD%AC%E8%BD%BD/">转载 </a></span><span class="tag"><a href="/tags/%E6%89%8B%E5%86%99/">手写 </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"> 5k</span><span class="post-meta-item-text"> 字</span></span></span><span class="post-time"> | <span class="post-meta-item-icon"><i class="fa fa-hourglass-half"></i><span class="post-count"> 20</span><span class="post-meta-item-text"> 分钟</span></span></span></div><a class="disqus-comment-count" href="/article/16947.html#vcomment"><span class="waline-comment-count" data-path="/article/16947.html"></span><span> 条评论</span></a><div class="post-content"><p><code>原文地址:https://mp.weixin.qq.com/s/RpWUtU4WXSzWZIHMCaGisg</code><br>我们在面试的时候,经常会被面试官问到几个手写代码的问题。手写一个数组去重复,深拷贝,数组拍平等等。有些小伙伴面试之前准备了,但是在编写的时候还是会忘掉,本文总结了一个<strong>如何应对手写代码的大纲</strong>,前面是一些基础内容,但是也希望能帮助到你,都会就当复习一遍,嘿嘿。</p>
20
+ <span id="more"></span>
21
+ <h2 id="1-起名字与具体功能考虑"><a href="#1-起名字与具体功能考虑" class="headerlink" title="1. 起名字与具体功能考虑"></a>1. 起名字与具体功能考虑</h2><h3 id="起名字"><a href="#起名字" class="headerlink" title="起名字"></a>起名字</h3><p>手写函数的时候,我每次给参数或者函数起名字都要犹豫那么几秒。面试官还以为我不会写嘞!</p>
22
+ <ul>
23
+ <li>代码规范遵守</li>
24
+ <li>函数名称直接使用功能英文命名(这里你必须知道你要手写的函数要实现什么功能)</li>
25
+ <li>至于传递的参数,还有函数内部声明的一些数组,变量等,完全不要考虑太多,可以直接使用<code>arr</code> 和 <code>arr+功能名称</code> 简写。</li>
26
+ </ul>
27
+ <p>其实直接可以使用 arr1,arr2 来代替,能区分开就好了,别在犹豫这种事浪费时间。</p>
28
+ <h2 id="2-新变量与返回值"><a href="#2-新变量与返回值" class="headerlink" title="2. 新变量与返回值"></a>2. 新变量与返回值</h2><p>看完一道手写面试题,可以先看下是否需要声明新变量,需要返回的结果和结果类型等。</p>
29
+ <ul>
30
+ <li>数组拍平 肯定需要<strong>返回一个数组</strong>,可以考虑在初期声明一个数组的方式,也可以考虑使用 map,fliter等函数直接返回。</li>
31
+ <li>对象深拷贝 肯定需要返回一个一个拷贝后的对象,在初期会<strong>声明一个空对象</strong>,最后<strong>返回</strong>这个处理过的<strong>对象</strong>。</li>
32
+ <li>很多情况可以声明新变量或者不声明新变量,都能解决问题,但是就要考虑到时间复杂度和空间复杂度了,先用一种实现就好。面试官会继续问你有没有其他方案的,嘿嘿。</li>
33
+ </ul>
34
+ <h2 id="3-考虑是用循环?递归?"><a href="#3-考虑是用循环?递归?" class="headerlink" title="3. 考虑是用循环?递归?"></a>3. 考虑是用循环?递归?</h2><h3 id="循环"><a href="#循环" class="headerlink" title="循环"></a>循环</h3><h4 id="for-循环"><a href="#for-循环" class="headerlink" title="for 循环"></a>for 循环</h4><ol>
35
+ <li><p>for 有三个表达式:①声明循环变量;②判断循环条件;③更新循环变量;    三个表达式之间,用;分割,for 循环三个表达式都可以省略,但是两个“;”缺一不可。</p>
36
+ </li>
37
+ <li><p>for 循环的执行特点:先判断再执行,与 while 相同</p>
38
+ </li>
39
+ <li><p>for 循环三个表达式都可以有多部分组成,第二部分多个判断条件用&amp;&amp; ||连接,第一三部分用逗号分割;</p>
40
+ <p> for (var num &#x3D;1; num&lt;&#x3D;10; num++) {<br> document.write(num+” <br />“); &#x2F;&#x2F;1 2 3 4 5 6 7 8 9 10<br> }</p>
41
+ </li>
42
+ </ol>
43
+ <h4 id="for-in-循环"><a href="#for-in-循环" class="headerlink" title="for in 循环"></a>for in 循环</h4><p>for-in 循环主要用于遍历对象   for() 中的格式:for(keys in object){}   keys 表示 obj 对象的每一个键值对的键!!所有循环中,需要使用obj[keys]来取到每一个值!!!</p>
44
+ <p>for-in 循环,遍历时不仅能读取对象自身上面的成员属性,也能延续原型链遍历出对象的原型属性   所以,可以使用 hasOwnProperty 判断一个属性是不是对象自身上的属性</p>
45
+ <p>obj.hasOwnProperty(keys)&#x3D;&#x3D;true 表示这个属性是对象的成员属性,而不是原先属性。</p>
46
+ <pre><code>//声明一个Peson类
47
+ functionPerson()&#123;
48
+ this.name = &quot;kaola&quot;;
49
+ this.age = 24;
50
+ this.func1 = function()&#123;
51
+
52
+ &#125;
53
+ &#125;
54
+ //实例化这个类
55
+ var bei = new Person();
56
+ //使用for-in遍历这个对象
57
+ for(keys in bei)&#123;
58
+ console.log(bei[keys])
59
+ &#125;
60
+ </code></pre>
61
+ <h4 id="for-of-循环"><a href="#for-of-循环" class="headerlink" title="for of 循环"></a>for of 循环</h4><p>ES6 借鉴 C++、Java、C# 和 Python 语言,引入了 for…of 循环,作为遍历所有数据结构的统一的方法。</p>
62
+ <p>一个数据结构只要部署了 Symbol.iterator 属性,就被视为具有 iterator 接口,就可以用 for…of 循环遍历它的成员。也就是说,for…of 循环内部调用的是数据结构的 Symbol.iterator 方法。</p>
63
+ <p>for…of 循环可以使用的范围包括数组、Set 和 Map 结构、某些类似数组的对象(比如arguments对象、DOM NodeList 对象)、后文的 Generator 对象,以及字符串。</p>
64
+ <h3 id="递归"><a href="#递归" class="headerlink" title="递归"></a>递归</h3><p>关于递归的详细内容可以看我的这篇文章,聊聊面试必考-递归思想与实战 文章中常用的递归手写代码都用写到。</p>
65
+ <h2 id="4-考虑界限"><a href="#4-考虑界限" class="headerlink" title="4. 考虑界限"></a>4. 考虑界限</h2><h3 id="4-1-类型判断"><a href="#4-1-类型判断" class="headerlink" title="4.1 类型判断"></a>4.1 类型判断</h3><blockquote>
66
+ <p>★<br>如何判断数据类型?怎么判断一个值到底是数组类型还是对象?<br>”</p>
67
+ </blockquote>
68
+ <p>三种方式,分别为 <code>typeof</code>、<code>instanceof</code> 和<code>Object.prototype.toString.call()</code></p>
69
+ <h4 id="typeof"><a href="#typeof" class="headerlink" title="typeof"></a>typeof</h4><p>通过 <code>typeof</code>操作符来判断一个值属于哪种基本类型。</p>
70
+ <pre><code>typeof&#39;seymoe&#39;// &#39;string&#39;
71
+ typeoftrue// &#39;boolean&#39;
72
+ typeof10// &#39;number&#39;
73
+ typeofSymbol() // &#39;symbol&#39;
74
+ typeofnull// &#39;object&#39; 无法判定是否为 null
75
+ typeofundefined// &#39;undefined&#39;
76
+
77
+ typeof &#123;&#125; // &#39;object&#39;
78
+ typeof [] // &#39;object&#39;
79
+ typeof(() =&gt; &#123;&#125;) // &#39;function&#39;
80
+ </code></pre>
81
+ <p>上面代码的输出结果可以看出,</p>
82
+ <ol>
83
+ <li><p><code>null</code> 的判定有误差,得到的结果 如果使用 <code>typeof null</code>得到的结果是<code>object</code></p>
84
+ </li>
85
+ <li><p>操作符对对象类型及其子类型,例如函数(可调用对象)、数组(有序索引对象)等进行判定,则除了函数都会得到 <code>object</code> 的结果。</p>
86
+ </li>
87
+ </ol>
88
+ <p>在对象的子类型和<code>null</code>情况下,可以看出<code>typeOf</code>对于判断类型还有一些不足。</p>
89
+ <h4 id="instanceof"><a href="#instanceof" class="headerlink" title="instanceof"></a>instanceof</h4><p>通过 <code>instanceof</code> 操作符也可以对对象类型进行判定,其原理就是测试构造函数的<code>prototype</code> 是否出现在被检测对象的原型链上。</p>
90
+ <pre><code>[] instanceofArray// true
91
+ (&#123;&#125;) instanceofObject// true
92
+ (()=&gt;&#123;&#125;) instanceofFunction// true
93
+ </code></pre>
94
+ <p>复制代码注意:<code>instanceof</code> 也不是万能的。</p>
95
+ <p>举个例子:</p>
96
+ <pre><code>let arr = []
97
+ let obj = &#123;&#125;
98
+ arr instanceofArray// true
99
+ arr instanceofObject// true
100
+ obj instanceofObject// true
101
+ obj instanceofArray// false
102
+ </code></pre>
103
+ <p>在这个例子中,<code>arr</code> 数组相当于 <code>new Array()</code> 出的一个实例,所以 <code>arr.__proto__ === Array.prototype</code>,又因为 <code>Array</code>属于 <code>Object</code> 子类型,即<code>Array.prototype.__proto__ === Object.prototype</code>,因此 <code>Object</code> 构造函数在 <code>arr</code> 的原型链上。所以 <code>instanceof</code> 仍然无法优雅的判断一个值到底属于数组还是普通对象。</p>
104
+ <p>还有一点需要说明下,有些开发者会说 <code>Object.prototype.__proto__ === null</code>,岂不是说 <code>arr instanceof null</code> 也应该为 <code>true</code>,这个语句其实会报错提示右侧参数应该为对象,这也印证 <code>typeof null</code> 的结果为 <code>object</code> 真的只是<code>javascript</code>中的一个<code>bug</code> 。</p>
105
+ <h4 id="Object-prototype-toString-(推荐款)"><a href="#Object-prototype-toString-(推荐款)" class="headerlink" title="Object.prototype.toString() (推荐款)"></a><code>Object.prototype.toString()</code> (推荐款)</h4><p>可以说是判定 <code>JavaScript</code> 中数据类型的终极解决方法了,具体用法请看以下代码:</p>
106
+ <pre><code>Object.prototype.toString.call(&#123;&#125;) // &#39;[object Object]&#39;
107
+ Object.prototype.toString.call([]) // &#39;[object Array]&#39;
108
+ Object.prototype.toString.call(() =&gt; &#123;&#125;) // &#39;[object Function]&#39;
109
+ Object.prototype.toString.call(&#39;seymoe&#39;) // &#39;[object String]&#39;
110
+ Object.prototype.toString.call(1) // &#39;[object Number]&#39;
111
+ Object.prototype.toString.call(true) // &#39;[object Boolean]&#39;
112
+ Object.prototype.toString.call(Symbol()) // &#39;[object Symbol]&#39;
113
+ Object.prototype.toString.call(null) // &#39;[object Null]&#39;
114
+ Object.prototype.toString.call(undefined) // &#39;[object Undefined]&#39;
115
+
116
+ Object.prototype.toString.call(newDate()) // &#39;[object Date]&#39;
117
+ Object.prototype.toString.call(Math) // &#39;[object Math]&#39;
118
+ Object.prototype.toString.call(newSet()) // &#39;[object Set]&#39;
119
+ Object.prototype.toString.call(newWeakSet()) // &#39;[object WeakSet]&#39;
120
+ Object.prototype.toString.call(newMap()) // &#39;[object Map]&#39;
121
+ Object.prototype.toString.call(newWeakMap()) // &#39;[object WeakMap]&#39;
122
+ </code></pre>
123
+ <p>我们可以发现该方法在传入任何类型的值都能返回对应准确的对象类型。用法虽简单明了,但其中有几个点需要理解清楚:</p>
124
+ <ul>
125
+ <li>该方法本质就是依托<code>Object.prototype.toString()</code>方法得到对象内部属性 <code>[[Class]]</code></li>
126
+ <li>传入原始类型却能够判定出结果是因为对值进行了包装</li>
127
+ <li><code>null</code> 和 <code>undefined</code> 能够输出结果是内部实现有做处理</li>
128
+ </ul>
129
+ <p>对于类型判断,我们可以通过 Object.prototype.toString() 进行一个简单的封装,这样我们再判断类型的时候,直接使用 type 函数就可以了。</p>
130
+ <p>代码如下:</p>
131
+ <pre><code>var type = function(data) &#123;
132
+ var toString = Object.prototype.toString;
133
+ var dataType = toString
134
+ .call(data)
135
+ .replace(/\[object\s(.+)\]/, &quot;$1&quot;)
136
+ .toLowerCase()
137
+ return dataType
138
+ &#125;;
139
+ </code></pre>
140
+ <h4 id="Array-isArray"><a href="#Array-isArray" class="headerlink" title="Array.isArray()"></a>Array.isArray()</h4><p>Array.isArray 也可以判断传递参数是否是数组。需要注意的是这是 <code>Array.isArray</code> 是 <code>ES 5.1</code> 推出的,不支持 <code>IE6~8</code>,所以在使用的时候也应注意兼容问题。</p>
141
+ <ul>
142
+ <li>出现不兼容问题解决办法<br> if (!Array.isArray) {<br> Array.isArray &#x3D; function(arg) {<br> returnObject.prototype.toString.call(arg) &#x3D;&#x3D;&#x3D; ‘[object Array]’;<br>};<br> }</li>
143
+ </ul>
144
+ <h3 id="4-2-空值判断"><a href="#4-2-空值判断" class="headerlink" title="4.2 空值判断"></a>4.2 空值判断</h3><h4 id="空值判断的重要性"><a href="#空值判断的重要性" class="headerlink" title="空值判断的重要性"></a>空值判断的重要性</h4><pre><code>if([]) &#123;
145
+ console.log(&#39;true&#39;);
146
+ &#125; else &#123;
147
+ consoel.log(&#39;false&#39;);
148
+ &#125;
149
+ // res:true
150
+
151
+ if(&#123;&#125;) &#123;
152
+ console.log(&#39;true&#39;);
153
+ &#125; else &#123;
154
+ consoel.log(&#39;false&#39;);
155
+ &#125;
156
+ // res:true
157
+ </code></pre>
158
+ <p>看这段代码,不知道有没有小伙伴会认为输出false,以上对象和数组虽然为空,但是会被转换为ture,所以在写一些判断条件时候要格外注意。</p>
159
+ <h4 id="空数组判断"><a href="#空数组判断" class="headerlink" title="空数组判断"></a>空数组判断</h4><p>数组为空很简单,通过上面的类型判断是数组类型,然后它的<code>length&gt;0</code>即可</p>
160
+ <h4 id="空对象判断"><a href="#空对象判断" class="headerlink" title="空对象判断"></a>空对象判断</h4><ol>
161
+ <li>Object.getOwnPropertyNames()</li>
162
+ </ol>
163
+ <p>使用<code>Object.getOwnPropertyNames()</code>。返回值是对象中属性明名成的数组</p>
164
+ <pre><code>var obj = &#123;&#125;
165
+ Object.getOwnPropertyNames(obj).length === 0; // true
166
+ </code></pre>
167
+ <ol start="2">
168
+ <li>json 对象转换为字符串</li>
169
+ </ol>
170
+ <p>将json对象转换为字符串,然后比较该字符串与”{}”是否相等</p>
171
+ <pre><code>var obj = &#123;&#125;;
172
+ var a = JSON.stringify(obj);
173
+ a === &quot;&#123;&#125;&quot;; // true
174
+ // a === &#123;&#125;; // false
175
+ </code></pre>
176
+ <ol start="3">
177
+ <li><p>for…in… 循环判断</p>
178
+ <p> var obj &#x3D; {};</p>
179
+ <p> functionjudgeObj(obj) {<br> for(let key in obj) {<br> returnfalse<br> }<br> return true<br> };</p>
180
+ <p> judgeObj(obj); &#x2F;&#x2F; true</p>
181
+ </li>
182
+ <li><p>Object.keys()</p>
183
+ </li>
184
+ </ol>
185
+ <p>使用Object.keys()。ES6的新方法,返回值同样是属性名组成的数组</p>
186
+ <pre><code>var obj = &#123;&#125;
187
+ Object.keys(obj).length === 0; // true
188
+ </code></pre>
189
+ <ol start="5">
190
+ <li><p>直接使用对象属性判断 前提是要确定如果obj不为空,一定会包含name属性</p>
191
+ <p> var obj &#x3D; {};</p>
192
+ <p> obj &amp;&amp; obj.name ? ‘不为空’ : ‘为空’; &#x2F;&#x2F;</p>
193
+ </li>
194
+ </ol>
195
+ <h3 id="4-3-等号使用"><a href="#4-3-等号使用" class="headerlink" title="4.3 等号使用"></a>4.3 等号使用</h3><p>比较过程:</p>
196
+ <ul>
197
+ <li>双等号&#x3D;&#x3D;:</li>
198
+ </ul>
199
+ <p>(1)如果两个值类型相同,再进行三个等号(&#x3D;&#x3D;&#x3D;)的比较</p>
200
+ <p>(2)如果两个值类型不同,也有可能相等,需根据以下规则进行类型转换在比较:</p>
201
+ <p>1)如果一个是null,一个是undefined,那么相等</p>
202
+ <p>2)如果一个是字符串,一个是数值,把字符串转换成数值之后再进行比较</p>
203
+ <ul>
204
+ <li>三等号&#x3D;&#x3D;&#x3D;:</li>
205
+ </ul>
206
+ <p>(1)如果类型不同,就一定不相等</p>
207
+ <p>(2)如果两个都是数值,并且是同一个值,那么相等;如果其中至少一个是NaN,那么不相等。(判断一个值是否是NaN,只能使用isNaN( ) 来判断)</p>
208
+ <p>(3)如果两个都是字符串,每个位置的字符都一样,那么相等,否则不相等。</p>
209
+ <p>(4)如果两个值都是true,或是false,那么相等</p>
210
+ <p>(5)如果两个值都引用同一个对象或是函数,那么相等,否则不相等</p>
211
+ <p>(6)如果两个值都是null,或是undefined,那么相等</p>
212
+ <h2 id="5-数组-字符串-对象-常用函数掌握"><a href="#5-数组-字符串-对象-常用函数掌握" class="headerlink" title="5. 数组 字符串 对象 常用函数掌握"></a>5. 数组 字符串 对象 常用函数掌握</h2><h3 id="5-1-数组部分常用函数"><a href="#5-1-数组部分常用函数" class="headerlink" title="5.1 数组部分常用函数"></a>5.1 数组部分常用函数</h3><h4 id="splice函数-改变原始数组"><a href="#splice函数-改变原始数组" class="headerlink" title="splice函数(改变原始数组)"></a>splice函数(改变原始数组)</h4><ul>
213
+ <li>有向数组指定位置添加元素的功能</li>
214
+ </ul>
215
+ <p><code>Array.splice(begin, deleteCount, addItem1, addItem2...)</code></p>
216
+ <pre><code>// a的初始值:[1,2,3,4,5]
217
+
218
+ var b = arr.splice(1,2)
219
+ // a: [1,4,5]
220
+ // b: [2,3]
221
+
222
+ var c = arr.splice(1,2,777,888)
223
+ // a: [1,777,888,4,5]
224
+ // b: [2,3]
225
+ </code></pre>
226
+ <h4 id="slice-函数-不改变原数组,创建新数组"><a href="#slice-函数-不改变原数组,创建新数组" class="headerlink" title="slice 函数(不改变原数组,创建新数组)"></a>slice 函数(不改变原数组,创建新数组)</h4><p>slice() 方法将数组中一部分元素浅复制存入新的数组对象,并且返回这个数组对象。</p>
227
+ <p><code>语法:arr.slice([start[, end]])</code></p>
228
+ <p>参数 <code>start</code> 指定复制开始位置的索引,<code>end</code>如果有值则表示复制结束位置的索引(不包括此位置)。</p>
229
+ <p>如果 <code>start</code> 的值为负数,假如数组长度为 <code>length</code>,则表示从 length+start 的位置开始复制,此时参数 end 如果有值,只能是比 start 大的负数,否则将返回空数组。</p>
230
+ <p>slice方法参数为空时,同concat方法一样,都是浅复制生成一个新数组。</p>
231
+ <pre><code>var array = [&quot;one&quot;, &quot;two&quot;, &quot;three&quot;,&quot;four&quot;, &quot;five&quot;];
232
+ console.log(array.slice()); // [&quot;one&quot;, &quot;two&quot;, &quot;three&quot;,&quot;four&quot;, &quot;five&quot;]
233
+ console.log(array.slice(2,3)); // [&quot;three&quot;]
234
+ </code></pre>
235
+ <p>浅复制 是指当对象的被复制时,只是复制了对象的引用,指向的依然是同一个对象。下面来说明slice为什么是浅复制。</p>
236
+ <pre><code>var array = [&#123;color:&quot;yellow&quot;&#125;, 2, 3];
237
+ var array2 = array.slice(0,1);
238
+ console.log(array2); // [&#123;color:&quot;yellow&quot;&#125;]
239
+ array[0][&quot;color&quot;] = &quot;blue&quot;;
240
+ console.log(array2); // [&#123;color:&quot;bule&quot;&#125;]
241
+ </code></pre>
242
+ <p>由于slice是浅复制,复制到的对象只是一个引用,改变原数组array的值,array2也随之改变。</p>
243
+ <p>同时,稍微利用下 slice 方法第一个参数为负数时的特性,我们可以非常方便的拿到数组的最后一项元素,如下:</p>
244
+ <p>console.log([1,2,3].slice(-1));&#x2F;&#x2F;[3]</p>
245
+ <h4 id="join-函数"><a href="#join-函数" class="headerlink" title="join 函数"></a>join 函数</h4><p>join() 方法将数组中的所有元素连接成一个字符串。</p>
246
+ <p><code>语法 arr.join(&#39;xxx&#39;)</code></p>
247
+ <pre><code>var b = arr.join(&#39;,&#39;); // b: &#39;1,2,3&#39;
248
+ var b = arr.join(&#39;*&#39;); // b: &#39;1*2*3&#39;
249
+ </code></pre>
250
+ <h4 id="push-函数"><a href="#push-函数" class="headerlink" title="push 函数"></a>push 函数</h4><p>数组中添加值。</p>
251
+ <h4 id="concat-函数"><a href="#concat-函数" class="headerlink" title="concat 函数"></a>concat 函数</h4><p>concat() 方法将传入的数组或者元素与原数组合并,组成一个新的数组并返回。</p>
252
+ <h4 id="indexOf函数"><a href="#indexOf函数" class="headerlink" title="indexOf函数"></a>indexOf函数</h4><p>indexOf() 方法用于查找元素在数组中第一次出现时的索引,如果没有,则返回-1。</p>
253
+ <p>语法:<code>arr.indexOf(element, fromIndex=0)</code></p>
254
+ <p>element 为需要查找的元素。</p>
255
+ <p>fromIndex 为开始查找的位置,缺省默认为0。如果超出数组长度,则返回-1。如果为负值,假设数组长度为length,则从数组的第 length + fromIndex项开始往数组末尾查找,如果length + fromIndex&lt;0 则整个数组都会被查找。</p>
256
+ <p>indexOf使用严格相等(即使用 &#x3D;&#x3D;&#x3D; 去匹配数组中的元素)。</p>
257
+ <pre><code>var array = [&#39;abc&#39;, &#39;def&#39;, &#39;ghi&#39;,&#39;123&#39;];
258
+ console.log(array.indexOf(&#39;def&#39;)); // 1
259
+ console.log(array.indexOf(&#39;def&#39;,-1)); // -1 此时表示从最后一个元素往后查找,因此查找失败返回-1
260
+ console.log(array.indexOf(&#39;def&#39;,-4)); // 1 由于4大于数组长度,此时将查找整个数组,因此返回1
261
+ console.log(array.indexOf(123)); // -1, 由于是严格匹配,因此并不会匹配到字符串&#39;123&#39;
262
+ </code></pre>
263
+ <h4 id="includes-函数"><a href="#includes-函数" class="headerlink" title="includes 函数"></a>includes 函数</h4><p>includes() 方法<strong>基于ECMAScript 2016(ES7)规范</strong>,它用来判断当前数组是否包含某个指定的值,如果是,则返回 true,否则返回 false。</p>
264
+ <p>语法:<code>arr.includes(element, fromIndex=0)</code></p>
265
+ <p>element 为需要查找的元素。</p>
266
+ <p>fromIndex 表示从该索引位置开始查找 element,缺省为0,它是正向查找,即从索引处往数组末尾查找。</p>
267
+ <pre><code>var array = [-0, 1, 2];
268
+ console.log(array.includes(+0)); // true
269
+ console.log(array.includes(1)); // true
270
+ console.log(array.includes(2,-4)); // true
271
+ </code></pre>
272
+ <p>以上,includes似乎忽略了 -0 与 +0 的区别,这不是问题,因为JavaScript一直以来都是不区分 -0 和 +0 的。</p>
273
+ <p>你可能会问,既然有了indexOf方法,为什么又造一个includes方法,arr.indexOf(x)&gt;-1不就等于arr.includes(x)?看起来是的,几乎所有的时候它们都等同,唯一的区别就是includes能够发现NaN,而indexOf不能。</p>
274
+ <pre><code>var array = [NaN];
275
+ console.log(array.includes(NaN)); // true
276
+ console.log(arra.indexOf(NaN)&gt;-1); // false
277
+ </code></pre>
278
+ <p>(这里大家可以考虑下 indexOf 和 includes 的效率谁高,和底层实现)</p>
279
+ <blockquote>
280
+ <p>★<br>数组函数有很多,上面只列举了常用的几个,发现一篇很全的数组函数文章,非常棒,感谢作者分享,推荐给大家:<a target="_blank" rel="noopener" href="http://louiszhai.github.io/2017/04/28/array/">http://louiszhai.github.io/2017/04/28/array/</a><br>”</p>
281
+ </blockquote>
282
+ <h3 id="5-2-字符串常用函数"><a href="#5-2-字符串常用函数" class="headerlink" title="5.2 字符串常用函数"></a>5.2 字符串常用函数</h3><h4 id="split-函数"><a href="#split-函数" class="headerlink" title="split 函数"></a>split 函数</h4><ul>
283
+ <li><p>把字符串分割称数组</p>
284
+ </li>
285
+ <li><p>不改变原始字符串</p>
286
+ <p> string.split(separator,limit)</p>
287
+ </li>
288
+ </ul>
289
+ <h4 id="substr-函数"><a href="#substr-函数" class="headerlink" title="substr 函数"></a>substr 函数</h4><p>substr() 方法返回字符串指定位置开始的指定数量的字符。</p>
290
+ <p>语法:<code>str.substr(start[, length])</code></p>
291
+ <p>start 表示开始截取字符的位置,可取正值或负值。取正值时表示start位置的索引,取负值时表示 length+start位置的索引。</p>
292
+ <p>length 表示截取的字符长度。</p>
293
+ <pre><code>var str = &quot;Yesterday is history. Tomorrow is mystery. But today is a gift.&quot;;
294
+ console.log(str.substr(47)); // today is a gift.
295
+ console.log(str.substr(-16)); // today is a gift.
296
+ </code></pre>
297
+ <blockquote>
298
+ <p>★<br>数组函数有很多,上面只列举了常用的几个,发现一篇很全的字符串函数文章,非常棒,感谢作者分享,推荐给大家:<a target="_blank" rel="noopener" href="http://louiszhai.github.io/2016/01/12/js.String/#substr">http://louiszhai.github.io/2016/01/12/js.String/#substr</a><br>”</p>
299
+ </blockquote>
300
+ <h3 id="5-3-对象的常用函数"><a href="#5-3-对象的常用函数" class="headerlink" title="5.3 对象的常用函数"></a>5.3 对象的常用函数</h3><h4 id="Object-prototype-hasOwnProperty-prop"><a href="#Object-prototype-hasOwnProperty-prop" class="headerlink" title="Object.prototype.hasOwnProperty(prop)"></a>Object.prototype.hasOwnProperty(prop)</h4><p>该方法仅在目标属性为对象自身属性时返回true,而当该属性是从原型链中继承而来或根本不存在时,返回false。</p>
301
+ <pre><code>var o = &#123;prop:1&#125;;
302
+ o.hasOwnProperty(&#39;prop&#39;); // true
303
+ o.hasOwnProperty(&#39;toString&#39;); // false
304
+ o.hasOwnProperty(&#39;formString&#39;); // false
305
+ </code></pre>
306
+ <h4 id="Object-create-obj-descr-ES5"><a href="#Object-create-obj-descr-ES5" class="headerlink" title="Object.create(obj, descr) (ES5)"></a>Object.create(obj, descr) (ES5)</h4><p>该方法主要用于创建一个新对象,并为其设置原型,用(上述)属性描述符来定义对象的原型属性。</p>
307
+ <pre><code>var parent = &#123;hi: &#39;Hello&#39;&#125;;
308
+ var o = Object.create(parent, &#123;
309
+ prop: &#123;
310
+ value: 1
311
+ &#125;
312
+ &#125;);
313
+ o.hi; // &#39;Hello&#39;
314
+ // 获得它的原型
315
+ Object.getPrototypeOf(parent) === Object.prototype; // true 说明parent的原型是Object.prototype
316
+ Object.getPrototypeOf(o); // &#123;hi: &quot;Hello&quot;&#125; // 说明o的原型是&#123;hi: &quot;Hello&quot;&#125;
317
+ o.hasOwnProperty(&#39;hi&#39;); // false 说明hi是原型上的
318
+ o.hasOwnProperty(&#39;prop&#39;); // true 说明prop是原型上的自身上的属性。
319
+ </code></pre>
320
+ <p>现在,我们甚至可以用它来创建一个完全空白的对象,这样的事情在ES3中可是做不到的。</p>
321
+ <pre><code>var o = Object.create(null);
322
+ typeof o.toString(); // &#39;undefined&#39;
323
+ </code></pre>
324
+ <blockquote>
325
+ <p>★<br>数组函数有很多,上面只列举了常用的几个,发现一篇很全的对象函数文章,非常棒,感谢作者分享,推荐给大家:<a target="_blank" rel="noopener" href="https://www.lxchuan12.cn/js-object-api">https://www.lxchuan12.cn/js-object-api</a><br>”</p>
326
+ </blockquote>
327
+ <h2 id="6-常用特殊说明"><a href="#6-常用特殊说明" class="headerlink" title="6. 常用特殊说明"></a>6. 常用特殊说明</h2><h3 id="6-1-arguments-类似数组对象"><a href="#6-1-arguments-类似数组对象" class="headerlink" title="6.1 arguments 类似数组对象"></a>6.1 arguments 类似数组对象</h3><p>什么是类似数组对象,举个例子:</p>
328
+ <pre><code>let arrayLike = &#123;
329
+ &#39;0&#39;: &#39;a&#39;,
330
+ &#39;1&#39;: &#39;b&#39;,
331
+ &#39;2&#39;: &#39;c&#39;,
332
+ length: 3
333
+ &#125;;
334
+ </code></pre>
335
+ <p>类数组转换的几种方式</p>
336
+ <ul>
337
+ <li><p>ES6 扩展运算符进行转换</p>
338
+ <p> var arr1 &#x3D; […arrayLike]; &#x2F;&#x2F; [‘a’,’b’,’c’]</p>
339
+ </li>
340
+ <li><p>ES6 中的 Array.from</p>
341
+ <p> let arr2 &#x3D; Array.from(arrayLike); &#x2F;&#x2F; [‘a’, ‘b’, ‘c’]</p>
342
+ </li>
343
+ </ul>
344
+ <p><code>Array.from()</code> 的另一个应用是,将字符串转为数组,然后返回字符串的长度。</p>
345
+ <pre><code>functioncountSymbols(string) &#123;
346
+ returnArray.from(string).length;
347
+ &#125;
348
+ </code></pre>
349
+ <ul>
350
+ <li><p>ES5中 Array.prototype.slice.call()</p>
351
+ <p> functiontest(a,b,c,d)<br> {<br> var arg &#x3D; Array.prototype.slice.call(arguments,1);<br> alert(arg);<br> }<br> test(“a”,”b”,”c”,”d”); &#x2F;&#x2F;b,c,d</p>
352
+ </li>
353
+ </ul>
354
+ <p><code>Array.prototype.slice.call(arguments)</code>能将具有<code>length</code>属性的对象转成数组,除了<code>IE</code>下的节点集合(因为ie下的dom对象是以com对象的形式实现的,js对象与com对象不能进行转换)</p>
355
+ <ul>
356
+ <li>第一个参数是context(就是上下文的意思),用来替换对象函数中的this</li>
357
+ <li>第二个参数是传递给对象函数的参数</li>
358
+ </ul>
359
+ <h3 id="6-2-高阶函数使用"><a href="#6-2-高阶函数使用" class="headerlink" title="6.2 高阶函数使用"></a>6.2 高阶函数使用</h3><p>高阶函数相关内容可以看这篇文章。【JS必知必会】高阶函数详解与实战</p>
360
+ <p>在实现无限叠加,数组拍平,去重等都可以用到高阶函数。</p>
361
+ <h2 id="7-向面试官证明-ES6-也会"><a href="#7-向面试官证明-ES6-也会" class="headerlink" title="7. 向面试官证明 ES6 也会"></a>7. 向面试官证明 ES6 也会</h2><p>让你手写代码的时候,可以考虑一下使用 ES6 方式如何简洁实现。(这里大家可以去看一下ES6的扩展运算符…,set集合,箭头函数等常用的ES6知识点,附上ES6阮一峰老师书籍学习地址:<a target="_blank" rel="noopener" href="http://es6.ruanyifeng.com/">http://es6.ruanyifeng.com/</a>)</p>
362
+ <h2 id="8-练习一下"><a href="#8-练习一下" class="headerlink" title="8. 练习一下"></a>8. 练习一下</h2><p>Node.js 中有一个queryString模块,可以实现将 urlStr 主机地址后面的参数转化为对象。</p>
363
+ <pre><code>let urlStr = &#39;http://www.inode.club?name=koala&amp;study=js&amp;study=node&#39;;
364
+ </code></pre>
365
+ <p>转换结果如下:</p>
366
+ <pre><code>&#123; name: &#39;koala&#39;, study: [ &#39;js&#39;, &#39;node&#39; ] &#125;
367
+ </code></pre>
368
+ <h3 id="代码实现"><a href="#代码实现" class="headerlink" title="代码实现"></a>代码实现</h3><p>你可以现自己实现一下,看完本篇想一下流程</p>
369
+ <pre><code>let urlStr = &#39;http://www.inode.club?name=koala&amp;study=js&amp;study=node&#39;
370
+ // 参数转成对象
371
+ functionqueryString(request)&#123;
372
+ let params = request.split(&#39;?&#39;)[1];
373
+ let param = params.split(&#39;&amp;&#39;);
374
+ let obj = &#123;&#125;;
375
+ for (let i = 0;i&lt;param.length;i++)&#123;
376
+ let paramsA = param[i].split(&#39;=&#39;);
377
+ let key = paramsA[0];
378
+ let value = paramsA[1];
379
+ if(obj[key])&#123;
380
+ obj[key] = Array.isArray(obj[key])?obj[key]:[obj[key]];
381
+ obj[key].push(value);
382
+ &#125;else&#123;
383
+ obj[key] = value;
384
+ &#125;
385
+ &#125;
386
+ return obj;
387
+ &#125;
388
+ console.log(queryString(urlStr));
389
+ </code></pre>
390
+ <h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p>本文是一个应对手写代码的学习大纲,一些函数并没有全部列全,但是大家有时间按照大纲复习一遍,再去看一些常考的手写代码问题,个人感觉能好记而且清晰了很多,希望本文能对大家有所帮助。</p>
391
+ </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/16947.html">https://xuehuayu.cn/article/16947.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><a href="/tags/%E6%89%8B%E5%86%99/">手写</a></div><div class="post-nav"><a class="pre" href="/article/54313.html">70个JavaScript面试问题</a><a class="next" href="/article/27796.html">CSS实现一个粒子动效的按钮</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
392
+ const serverURL = origin.includes('cainiaoblog') ? 'https://cmts.cainiaoblog.cn' : 'https://cmts.xuehuayu.cn'
393
+ const locale = {
394
+ placeholder: '请正确填写昵称和邮箱,方便接收回复通知~',
395
+ sofa: '沙发空缺中,还不快抢~',
396
+ };
397
+ Waline.init({
398
+ el: '#vcomment',
399
+ serverURL: serverURL,
400
+ pageSize: '20',
401
+ visitor: true, // 阅读量统计
402
+ requiredMeta: ['nick', 'mail'],
403
+ emoji: [
404
+ 'https://cdn.jsdelivr.net/gh/walinejs/emojis@1.0.0/weibo',
405
+ 'https://cdn.jsdelivr.net/gh/walinejs/emojis@1.0.0/qq',
406
+ 'https://cdn.jsdelivr.net/gh/walinejs/emojis@1.0.0/tw-emoji',
407
+ ],
408
+ locale,
409
+ pageview: true
410
+ })
411
+ </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() {
412
+ var val = $(this).val()
413
+ 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>'
414
+ 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>'
415
+ 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>'
416
+
417
+ if (val === 'self') {
418
+ $('#search').html(self)
419
+ var search_path = 'search.xml';
420
+ if (search_path.length == 0) {
421
+ search_path = 'search.xml';
422
+ }
423
+ var path = 'https://cdn.staticaly.com/gh/npljy/npljy.github.io/main/' + search_path;
424
+ searchFunc(path, 'local-search-input', 'local-search-result');
425
+ } else if (val === 'baidu') {
426
+ $('#search').html(baidu)
427
+ } else if (val === 'google') {
428
+ $('#search').html(google)
429
+ }
430
+ })</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(){
431
+ var cnb =window.location.origin.indexOf('cainiaoblog') !==-1
432
+ if (cnb) {
433
+ var gxba =document.getElementById('gxba')
434
+ var gaba =document.getElementById('gaba')
435
+ var gabaLink =document.getElementById('gaba-link')
436
+ gxba.innerText ='京ICP备20007647号-1'
437
+ gaba.innerText ='京公网安备 11010802031254号'
438
+ gabaLink.setAttribute('href','http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=11010802031254')
439
+ }
440
+ })()</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>