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,83 @@
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">2021-11-03</span><span> | </span><span class="tag original"><a href="/tags/%E5%8E%9F%E5%88%9B/">原创 </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"> 648</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"> 3</span><span class="post-meta-item-text"> 分钟</span></span></span></div><a class="disqus-comment-count" href="/article/4510.html#vcomment"><span class="waline-comment-count" data-path="/article/4510.html"></span><span> 条评论</span></a><div class="post-content"><p>input 输入的时候,将数字转为 金额 千分位形式</p>
20
+ <span id="more"></span>
21
+
22
+ <figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">function</span> <span class="title function_">onChange</span> (e) &#123;</span><br><span class="line"> <span class="keyword">let</span> value = e.<span class="property">target</span>.<span class="property">value</span></span><br><span class="line"> value = value.<span class="title function_">toString</span>().<span class="title function_">includes</span>(<span class="string">&#x27;.&#x27;</span>) ? value.<span class="title function_">toLocaleString</span>() : value.<span class="title function_">toString</span>().<span class="title function_">replace</span>(<span class="regexp">/(\d)(?=(?:\d&#123;3&#125;)+$)/g</span>, <span class="string">&#x27;$1,&#x27;</span>)</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>
23
+
24
+ <blockquote>
25
+ <p>正则解释</p>
26
+ </blockquote>
27
+ <p><code>(\d)</code>: 是第一个子项,<code>$1</code> 表示第一个子项<br><code>?=</code>:非捕获元,<code>exp1(?=exp2)</code>表示匹配<code>exp2</code>前面的<code>exp1</code><br><code>?:</code>:<code>?:x</code>表示匹配 ‘x’ 但是不记住匹配项, 圆括号会有一个副作用,使相关的匹配会被缓存,此时可用<code>?:</code>放在第一个选项前来消除这种副作用</p>
28
+ <p>总结:替换 3个连续数字 <code>前面这个数字</code>,替换内容为 <code>前面这个数字</code> 加上一个 逗号<code>,</code></p>
29
+ <p><a target="_blank" rel="noopener" href="https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide/Regular_Expressions">MDN 正则表达式</a></p>
30
+ <blockquote>
31
+ <p>转换为 大写金额,来自网络</p>
32
+ </blockquote>
33
+ <figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br></pre></td><td class="code"><pre><span class="line">changeNumMoneyToChinese (money) &#123;</span><br><span class="line"> <span class="keyword">var</span> cnNums = [<span class="string">&#x27;零&#x27;</span>, <span class="string">&#x27;壹&#x27;</span>, <span class="string">&#x27;贰&#x27;</span>, <span class="string">&#x27;叁&#x27;</span>, <span class="string">&#x27;肆&#x27;</span>, <span class="string">&#x27;伍&#x27;</span>, <span class="string">&#x27;陆&#x27;</span>, <span class="string">&#x27;柒&#x27;</span>, <span class="string">&#x27;捌&#x27;</span>, <span class="string">&#x27;玖&#x27;</span>] <span class="comment">//汉字的数字</span></span><br><span class="line"> <span class="keyword">var</span> cnIntRadice = [<span class="string">&#x27;&#x27;</span>, <span class="string">&#x27;拾&#x27;</span>, <span class="string">&#x27;佰&#x27;</span>, <span class="string">&#x27;仟&#x27;</span>] <span class="comment">//基本单位</span></span><br><span class="line"> <span class="keyword">var</span> cnIntUnits = [<span class="string">&#x27;&#x27;</span>, <span class="string">&#x27;万&#x27;</span>, <span class="string">&#x27;亿&#x27;</span>, <span class="string">&#x27;兆&#x27;</span>] <span class="comment">//对应整数部分扩展单位</span></span><br><span class="line"> <span class="keyword">var</span> cnDecUnits = [<span class="string">&#x27;角&#x27;</span>, <span class="string">&#x27;分&#x27;</span>, <span class="string">&#x27;毫&#x27;</span>, <span class="string">&#x27;厘&#x27;</span>] <span class="comment">//对应小数部分单位</span></span><br><span class="line"> <span class="keyword">var</span> cnInteger = <span class="string">&#x27;整&#x27;</span> <span class="comment">//整数金额时后面跟的字符</span></span><br><span class="line"> <span class="keyword">var</span> cnIntLast = <span class="string">&#x27;元&#x27;</span> <span class="comment">//整型完以后的单位</span></span><br><span class="line"> <span class="keyword">var</span> maxNum = <span class="number">999999999999999.9999</span> <span class="comment">//最大处理的数字</span></span><br><span class="line"> <span class="keyword">var</span> <span class="title class_">IntegerNum</span> <span class="comment">//金额整数部分</span></span><br><span class="line"> <span class="keyword">var</span> <span class="title class_">DecimalNum</span> <span class="comment">//金额小数部分</span></span><br><span class="line"> <span class="keyword">var</span> <span class="title class_">ChineseStr</span> = <span class="string">&#x27;&#x27;</span> <span class="comment">//输出的中文金额字符串</span></span><br><span class="line"> <span class="keyword">var</span> parts <span class="comment">//分离金额后用的数组,预定义</span></span><br><span class="line"> <span class="keyword">var</span> <span class="title class_">Symbol</span> = <span class="string">&#x27;&#x27;</span> <span class="comment">//正负值标记</span></span><br><span class="line"> <span class="keyword">if</span> (money === <span class="string">&#x27;&#x27;</span>) &#123;</span><br><span class="line"> <span class="keyword">return</span></span><br><span class="line"> &#125;</span><br><span class="line"></span><br><span class="line"> money = <span class="built_in">parseFloat</span>(money)</span><br><span class="line"> <span class="keyword">if</span> (money &gt;= maxNum) &#123;</span><br><span class="line"> <span class="title function_">alert</span>(<span class="string">&#x27;超出最大处理数字&#x27;</span>)</span><br><span class="line"> <span class="keyword">return</span> <span class="string">&#x27;&#x27;</span></span><br><span class="line"> &#125;</span><br><span class="line"> <span class="keyword">if</span> (money === <span class="number">0</span>) &#123;</span><br><span class="line"> <span class="title class_">ChineseStr</span> = cnNums[<span class="number">0</span>] + cnIntLast + cnInteger</span><br><span class="line"> <span class="keyword">return</span> <span class="title class_">ChineseStr</span></span><br><span class="line"> &#125;</span><br><span class="line"> <span class="keyword">if</span> (money &lt; <span class="number">0</span>) &#123;</span><br><span class="line"> money = -money</span><br><span class="line"> <span class="title class_">Symbol</span> = <span class="string">&#x27;负 &#x27;</span></span><br><span class="line"> &#125;</span><br><span class="line"> money = money.<span class="title function_">toString</span>() <span class="comment">//转换为字符串</span></span><br><span class="line"> <span class="keyword">if</span> (money.<span class="title function_">indexOf</span>(<span class="string">&#x27;.&#x27;</span>) === -<span class="number">1</span>) &#123;</span><br><span class="line"> <span class="title class_">IntegerNum</span> = money</span><br><span class="line"> <span class="title class_">DecimalNum</span> = <span class="string">&#x27;&#x27;</span></span><br><span class="line"> &#125; <span class="keyword">else</span> &#123;</span><br><span class="line"> parts = money.<span class="title function_">split</span>(<span class="string">&#x27;.&#x27;</span>)</span><br><span class="line"> <span class="title class_">IntegerNum</span> = parts[<span class="number">0</span>]</span><br><span class="line"> <span class="title class_">DecimalNum</span> = parts[<span class="number">1</span>].<span class="title function_">substr</span>(<span class="number">0</span>, <span class="number">4</span>)</span><br><span class="line"> &#125;</span><br><span class="line"> <span class="keyword">if</span> (<span class="built_in">parseInt</span>(<span class="title class_">IntegerNum</span>, <span class="number">10</span>) &gt; <span class="number">0</span>) &#123; <span class="comment">//获取整型部分转换</span></span><br><span class="line"> <span class="keyword">var</span> zeroCount = <span class="number">0</span></span><br><span class="line"> <span class="keyword">var</span> <span class="title class_">IntLen</span> = <span class="title class_">IntegerNum</span>.<span class="property">length</span></span><br><span class="line"> <span class="keyword">for</span> (<span class="keyword">var</span> i = <span class="number">0</span>; i &lt; <span class="title class_">IntLen</span>; i++) &#123;</span><br><span class="line"> <span class="keyword">var</span> n = <span class="title class_">IntegerNum</span>.<span class="title function_">substr</span>(i, <span class="number">1</span>)</span><br><span class="line"> <span class="keyword">var</span> p = <span class="title class_">IntLen</span> - i - <span class="number">1</span></span><br><span class="line"> <span class="keyword">var</span> q = p / <span class="number">4</span></span><br><span class="line"> <span class="keyword">var</span> m = p % <span class="number">4</span></span><br><span class="line"> <span class="keyword">if</span> (n === <span class="string">&#x27;0&#x27;</span>) &#123;</span><br><span class="line"> zeroCount++</span><br><span class="line"> &#125; <span class="keyword">else</span> &#123;</span><br><span class="line"> <span class="keyword">if</span> (zeroCount &gt; <span class="number">0</span>) &#123;</span><br><span class="line"> <span class="title class_">ChineseStr</span> += cnNums[<span class="number">0</span>]</span><br><span class="line"> &#125;</span><br><span class="line"> zeroCount = <span class="number">0</span> <span class="comment">//归零</span></span><br><span class="line"> <span class="title class_">ChineseStr</span> += cnNums[<span class="built_in">parseInt</span>(n)] + cnIntRadice[m]</span><br><span class="line"> &#125;</span><br><span class="line"> <span class="keyword">if</span> (m === <span class="number">0</span> &amp;&amp; zeroCount &lt; <span class="number">4</span>) &#123;</span><br><span class="line"> <span class="title class_">ChineseStr</span> += cnIntUnits[q]</span><br><span class="line"> &#125;</span><br><span class="line"> &#125;</span><br><span class="line"> <span class="title class_">ChineseStr</span> += cnIntLast</span><br><span class="line"> <span class="comment">//整型部分处理完毕</span></span><br><span class="line"> &#125;</span><br><span class="line"> <span class="keyword">if</span> (<span class="title class_">DecimalNum</span> !== <span class="string">&#x27;&#x27;</span>) &#123; <span class="comment">//小数部分</span></span><br><span class="line"> <span class="keyword">var</span> decLen = <span class="title class_">DecimalNum</span>.<span class="property">length</span></span><br><span class="line"> <span class="keyword">for</span> (<span class="keyword">let</span> i = <span class="number">0</span>; i &lt; decLen; i++) &#123;</span><br><span class="line"> <span class="keyword">let</span> n = <span class="title class_">DecimalNum</span>.<span class="title function_">substr</span>(i, <span class="number">1</span>)</span><br><span class="line"> <span class="keyword">if</span> (n !== <span class="string">&#x27;0&#x27;</span>) &#123;</span><br><span class="line"> <span class="title class_">ChineseStr</span> += cnNums[<span class="title class_">Number</span>(n)] + cnDecUnits[i]</span><br><span class="line"> &#125;</span><br><span class="line"> &#125;</span><br><span class="line"> &#125;</span><br><span class="line"> <span class="keyword">if</span> (<span class="title class_">ChineseStr</span> === <span class="string">&#x27;&#x27;</span>) &#123;</span><br><span class="line"> <span class="title class_">ChineseStr</span> += cnNums[<span class="number">0</span>] + cnIntLast + cnInteger</span><br><span class="line"> &#125; <span class="keyword">else</span> <span class="keyword">if</span> (<span class="title class_">DecimalNum</span> === <span class="string">&#x27;&#x27;</span>) &#123;</span><br><span class="line"> <span class="title class_">ChineseStr</span> += cnInteger</span><br><span class="line"> &#125;</span><br><span class="line"> <span class="title class_">ChineseStr</span> = <span class="title class_">Symbol</span> + <span class="title class_">ChineseStr</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">return</span> <span class="title class_">ChineseStr</span></span><br><span class="line"> &#125;</span><br><span class="line"></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>
34
+ </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/4510.html">https://xuehuayu.cn/article/4510.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/%E5%8E%9F%E5%88%9B/">原创</a></div><div class="post-nav"><a class="pre" href="/article/35503.html">前端history路由和hash路由</a><a class="next" href="/article/8225.html">uni-app自定义tabbar导航栏</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
35
+ const serverURL = origin.includes('cainiaoblog') ? 'https://cmts.cainiaoblog.cn' : 'https://cmts.xuehuayu.cn'
36
+ const locale = {
37
+ placeholder: '请正确填写昵称和邮箱,方便接收回复通知~',
38
+ sofa: '沙发空缺中,还不快抢~',
39
+ };
40
+ Waline.init({
41
+ el: '#vcomment',
42
+ serverURL: serverURL,
43
+ pageSize: '20',
44
+ visitor: true, // 阅读量统计
45
+ requiredMeta: ['nick', 'mail'],
46
+ emoji: [
47
+ 'https://cdn.jsdelivr.net/gh/walinejs/emojis@1.0.0/weibo',
48
+ 'https://cdn.jsdelivr.net/gh/walinejs/emojis@1.0.0/qq',
49
+ 'https://cdn.jsdelivr.net/gh/walinejs/emojis@1.0.0/tw-emoji',
50
+ ],
51
+ locale,
52
+ pageview: true
53
+ })
54
+ </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() {
55
+ var val = $(this).val()
56
+ 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>'
57
+ 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>'
58
+ 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>'
59
+
60
+ if (val === 'self') {
61
+ $('#search').html(self)
62
+ var search_path = 'search.xml';
63
+ if (search_path.length == 0) {
64
+ search_path = 'search.xml';
65
+ }
66
+ var path = 'https://cdn.staticaly.com/gh/npljy/npljy.github.io/main/' + search_path;
67
+ searchFunc(path, 'local-search-input', 'local-search-result');
68
+ } else if (val === 'baidu') {
69
+ $('#search').html(baidu)
70
+ } else if (val === 'google') {
71
+ $('#search').html(google)
72
+ }
73
+ })</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(){
74
+ var cnb =window.location.origin.indexOf('cainiaoblog') !==-1
75
+ if (cnb) {
76
+ var gxba =document.getElementById('gxba')
77
+ var gaba =document.getElementById('gaba')
78
+ var gabaLink =document.getElementById('gaba-link')
79
+ gxba.innerText ='京ICP备20007647号-1'
80
+ gaba.innerText ='京公网安备 11010802031254号'
81
+ gabaLink.setAttribute('href','http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=11010802031254')
82
+ }
83
+ })()</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>
@@ -0,0 +1,320 @@
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>重磅!TypeScript 3.7 RC发布 | 前端壹菜鸟</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">重磅!TypeScript 3.7 RC发布</h1><div class="post-meta"><span class="date">2019-10-25</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/%E8%B5%84%E8%AE%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"> 5.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"> 22</span><span class="post-meta-item-text"> 分钟</span></span></span></div><a class="disqus-comment-count" href="/article/45156.html#vcomment"><span class="waline-comment-count" data-path="/article/45156.html"></span><span> 条评论</span></a><div class="post-content"><p><code>原文地址:https://mp.weixin.qq.com/s/7z8mJvg063ttfHqqkJFpTQ</code></p>
20
+ <span id="more"></span>
21
+ <p><img src="https://mmbiz.qpic.cn/mmbiz_jpg/XIibZ0YbvibkW1ELLUnvYXMdomcibLYibicDEB9uib4a2ueVc7kIECD9xxxicRJ9wL0Ntwx5bcHD5wz8b2teC8qkF2yOw/640?wx_fmt=jpeg&amp;tp=webp&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="xuehuayu.cn"></p>
22
+ <pre><code> 作者|Daniel Rosenwasser、TypeScript 团队
23
+ 译者|王强
24
+ 编辑|王文婧
25
+ 今天,微软发布了 TypeScript 3.7 RC,这是 TypeScript 3.7 的候选发布版本。到最终版本发布之前,除了重要的错误修复,微软表示,预计不会再有其他更改。下面我们来逐一看看有哪些新功能值得关注。 TypeScript 3.7 RC 提供了一些呼声最高的功能特性!
26
+ </code></pre>
27
+ <ul>
28
+ <li><p>可选链</p>
29
+ </li>
30
+ <li><p>空值合并</p>
31
+ </li>
32
+ <li><p>断言函数</p>
33
+ </li>
34
+ <li><p>更好地支持返回 never 的函数</p>
35
+ </li>
36
+ <li><p>(更多)递归类型别名</p>
37
+ </li>
38
+ <li><p>–declaration 和 –allowJs</p>
39
+ </li>
40
+ <li><p>使用项目引用进行免构建编辑</p>
41
+ </li>
42
+ <li><p>未调用函数的检查</p>
43
+ </li>
44
+ <li><p>TypeScript 文件中的 &#x2F;&#x2F; @ts-nocheck</p>
45
+ </li>
46
+ <li><p>分号格式化选项</p>
47
+ </li>
48
+ <li><p>重大更改</p>
49
+ </li>
50
+ <li><p>DOM 更改</p>
51
+ </li>
52
+ <li><p>函数真实性检查</p>
53
+ </li>
54
+ <li><p>本地和导入的类型声明现在会冲突</p>
55
+ </li>
56
+ <li><p>API 更改</p>
57
+ </li>
58
+ </ul>
59
+ <p>你可以通过 NuGet 或以下 npm 命令开始使用 RC 版:<br> npm install typescript@rc</p>
60
+ <p>你可以通过下列途径获得编辑器支持:</p>
61
+ <ul>
62
+ <li>下载 Visual Studio 2019&#x2F;2017。</li>
63
+ <li>查阅 Visual Studio Code 和 Sublime Text 的指引。</li>
64
+ </ul>
65
+ <p>Visual Studio 2019&#x2F;2017:<a target="_blank" rel="noopener" href="https://marketplace.visualstudio.com/items">https://marketplace.visualstudio.com/items</a>?</p>
66
+ <p>Visual Studio Code:<a target="_blank" rel="noopener" href="https://code.visualstudio.com/Docs/languages/typescript#_using-newer-typescript-versions">https://code.visualstudio.com/Docs/languages/typescript#_using-newer-typescript-versions</a></p>
67
+ <p>Sublime Text:<a target="_blank" rel="noopener" href="https://github.com/Microsoft/TypeScript-Sublime-Plugin/#note-using-different-versions-of-typescript">https://github.com/Microsoft/TypeScript-Sublime-Plugin/#note-using-different-versions-of-typescript</a></p>
68
+ <p>下面,我们来逐一介绍 TypeScript 3.7 的新功能。首先是最受瞩目的功能:可选链(Optional Chaining)。<br>可选链<br>TypeScript 3.7 实现了呼声最高的 ECMAScript 功能之一:可选链(Optional Chaining)!我们的团队一直在深度参与 TC39 的标准制定,努力将这一功能推向第三阶段,从而将其带给所有的 TypeScript 用户。<br>那么什么是可选链呢?从本质上讲,有了可选链后,我们编写代码时如果遇到 null 或 undefined 就可以立即停止某些表达式的运行。可选链的核心是新的?. 运算符,用于 <strong>可选的属性访问</strong>。比如下面的代码:<br> let x &#x3D; foo?.bar.baz();</p>
69
+ <p>也就是说,当定义了 foo 时,将计算 foo.bar.<br>baz();但如果 foo 为 null 或 undefined,程序就会停止运行并只返回 undefined。说得更清楚些,以上代码等效下面这种写法。<br> let x &#x3D; (foo &#x3D;&#x3D;&#x3D; null || foo &#x3D;&#x3D;&#x3D; undefined) ?<br> undefined :<br> foo.bar.baz();</p>
70
+ <p>请注意,如果 bar 为 null 或 undefined,我们的代码在访问 baz 时仍会出错。同样,如果 baz 为 null 或 undefined,我们在调用函数时也会出现错误。?. 只会检查其左侧的值是否为 null 或 undefined,而不检查任何后续属性。<br>你可能会使用?. 替换许多使用 &amp;&amp; 运算符执行中间属性检查的代码。<br> &#x2F;&#x2F; 之前<br> if (foo &amp;&amp; foo.bar &amp;&amp; foo.bar.baz) {<br> &#x2F;&#x2F; …<br> }</p>
71
+ <pre><code>// 之后
72
+ if (foo?.bar?.baz) &#123;
73
+ // ...
74
+ &#125;
75
+ </code></pre>
76
+ <p>请记住?. 与 &amp;&amp; 操作的行为有所不同,其中 &amp;&amp; 操作特别针对的是“虚假”值(例如空字符串、0、NaN 和 false)。<br>可选链还包括其他两个操作。首先是 <strong>可选元素访问</strong>,其作用类似可选属性访问,但允许我们访问非标识符属性(例如任意字符串、数字和符号):<br> &#x2F;**<br> * 当我们有一个数组时,返回它的第一个元素<br> * 否则返回 undefined。<br> *&#x2F;<br> function tryGetFirstElement<T>(arr?: T[]) {<br> return arr?.[0];<br> &#x2F;&#x2F; 等效:<br> &#x2F;&#x2F; return (arr &#x3D;&#x3D;&#x3D; null || arr &#x3D;&#x3D;&#x3D; undefined) ?<br> &#x2F;&#x2F; undefined :<br> &#x2F;&#x2F; arr[0];<br> }</p>
77
+ <p>另一个是 <strong>可选调用</strong>,如果表达式不是 null 或 undefined,我们可以有条件地调用它们。<br> async function makeRequest(url: string, log?: (msg: string) &#x3D;&gt; void) {<br> log?.(<code>Request started at $&#123;new Date().toISOString()&#125;</code>);<br> &#x2F;&#x2F; 等效:<br> &#x2F;&#x2F; if (log !&#x3D;&#x3D; null &amp;&amp; log !&#x3D;&#x3D; undefined) {<br> &#x2F;&#x2F; log(<code>Request started at $&#123;new Date().toISOString()&#125;</code>);<br> &#x2F;&#x2F; }</p>
78
+ <pre><code> const result = (await fetch(url)).json();
79
+
80
+ log?.(`Request finished at at $&#123;new Date().toISOString()&#125;`);
81
+
82
+ return result;
83
+ &#125;
84
+ </code></pre>
85
+ <p>可选链的“短路(short-circuiting)”行为仅限于“普通”和可选属性访问、调用和元素访问——它不会从这些表达式进一步扩展。换句话说,下面的代码不会阻止除法或 someComputation() 调用。<br> let result &#x3D; foo?.bar &#x2F; someComputation()</p>
86
+ <p>它相当于:<br> let temp &#x3D; (foo &#x3D;&#x3D;&#x3D; null || foo &#x3D;&#x3D;&#x3D; undefined) ?<br> undefined :<br> foo.bar;</p>
87
+ <pre><code>let result = temp / someComputation();
88
+ </code></pre>
89
+ <p>这可能会导致除法结果 undefined,这就是为什么在 strictNullChecks 中,以下代码会报错:<br> function barPercentage(foo?: { bar: number }) {<br> return foo?.bar &#x2F; 100;<br> &#x2F;&#x2F; ~~~~~~~~<br> &#x2F;&#x2F; 错误:对象可能未定义。<br> }</p>
90
+ <p>有关更多详细信息可以查阅提案和原始的拉取请求。</p>
91
+ <p>提案:<a target="_blank" rel="noopener" href="https://github.com/tc39/proposal-optional-chaining/]">https://github.com/tc39/proposal-optional-chaining/]</a>(<a target="_blank" rel="noopener" href="https://github.com/tc39/proposal-optional-chaining/">https://github.com/tc39/proposal-optional-chaining/</a></p>
92
+ <p>拉取请求:<a target="_blank" rel="noopener" href="https://github.com/microsoft/TypeScript/pull/33294">https://github.com/microsoft/TypeScript/pull/33294</a><br>空值合并<br>另一个即将推出的 ECMAScript 功能是 <strong>空值合并运算符(nullish coalescing operator)</strong>,它与可选链都是我们的团队一直努力推进的功能。<br>你可以设想一下这个功能——?? 运算符可以在处理 null 或 undefined 时“回退”到一个默认值上。例如下面的代码:<br> let x &#x3D; foo ?? bar();</p>
93
+ <p>这是一种新的途径来表示值 foo“存在”时会被使用;但当它为 null 或 undefined 时,就在其位置计算 bar()。<br>同样,以上代码等效于下面的写法。<br> let x &#x3D; (foo !&#x3D;&#x3D; null &amp;&amp; foo !&#x3D;&#x3D; undefined) ?<br> foo :<br> bar();</p>
94
+ <p>尝试使用默认值时,?? 运算符可以代替||。例如,以下代码段尝试获取上次保存在 local-Storage 中的 volume 值(如果曾经保存过),但因为它使用了||,所以会报错。<br> function initializeAudio() {<br> let volume &#x3D; localStorage.volume || 0.5</p>
95
+ <pre><code> // ...
96
+ &#125;
97
+ </code></pre>
98
+ <p>当 localStorage.volume 设置为 0 时,页面会意外地将 volume 设置为 0.5。?? 能避免将 0、NaN 和””中的某些意外行为视为虚假值。</p>
99
+ <p>我们非常感谢社区成员 Wenlu Wang 和 Titian Cernicova Dragomir 实现此功能!有关更多详细信息,请查看其拉取请求和空值合并提案存储库。</p>
100
+ <p>拉取请求:<a target="_blank" rel="noopener" href="https://github.com/microsoft/TypeScript/pull/32883">https://github.com/microsoft/TypeScript/pull/32883</a></p>
101
+ <p>空值合并提案存储库:<a target="_blank" rel="noopener" href="https://github.com/tc39/proposal-nullish-coalescing/">https://github.com/tc39/proposal-nullish-coalescing/</a><br>断言函数如果发生意外情况,有一组特定的函数会 throw 一个错误。它们被称为“断言”函数。例如,Node.js 为此有一个专用函数,称为 assert。<br> assert(someValue &#x3D;&#x3D;&#x3D; 42);</p>
102
+ <p>在此示例中,如果 someValue 不等于 42,则 assert 将抛出 AssertionError。<br>JavaScript 中的断言通常用于防止传入不正确的类型。例如:<br> function multiply(x, y) {<br> assert(typeof x &#x3D;&#x3D;&#x3D; “number”);<br> assert(typeof y &#x3D;&#x3D;&#x3D; “number”);</p>
103
+ <pre><code> return x * y;
104
+ &#125;
105
+ </code></pre>
106
+ <p>不幸的是,在 TypeScript 中,这些检查永远无法正确编码。这意味着 TypeScript 对松散类型的代码检查更少,并经常在稍保守的代码类型中迫使用户使用类型断言。<br> function yell(str) {<br> assert(typeof str &#x3D;&#x3D;&#x3D; “string”);</p>
107
+ <pre><code> return str.toUppercase();
108
+ // 哇!我们拼错了 &#39;toUpperCase&#39;。
109
+ // 希望 TypeScript 还是能捕获它!
110
+ &#125;
111
+ </code></pre>
112
+ <p>替代方法是重写代码以便 TS 语言分析,但这并不方便。<br> function yell(str) {<br> if (typeof str !&#x3D;&#x3D; “string”) {<br> throw new TypeError(“str should have been a string.”)<br> }<br> &#x2F;&#x2F; 错误捕获!<br> return str.toUppercase();<br> }</p>
113
+ <p>TypeScript 的终极目标是以破坏最少的方式嵌入现有的 JavaScript 结构中,所以 TypeScript 3.7 引入了一个称为“断言签名”的新概念,可以对这些断言函数建模。<br>第一种断言签名的建模方式和 Node 的 assert 函数的机制相同。它确保在作用域的其余部分中,无论检查的是什么条件都必须为真。<br> function assert(condition: any, msg?: string): asserts condition {<br> if (!condition) {<br> throw new AssertionError(msg)<br> }<br> }</p>
114
+ <p>asserts condition 表示,如果 assert 返回,则传递给 condition 参数的任何内容都必须为真(否则会抛出错误)。这意味着对于作用域的其余部分,该条件必须是真的。举个例子,使用这个断言函数意味着我们 <strong>确实</strong> 捕获了之前 yell 示例中的异常。<br> function yell(str) {<br> assert(typeof str &#x3D;&#x3D;&#x3D; “string”);</p>
115
+ <pre><code> return str.toUppercase();
116
+ // ~~~~~~~~~~~
117
+ // 错误:属性 &#39;toUppercase&#39; 在 &#39;string&#39; 类型上不存在。
118
+ // 你说的是 &#39;toUpperCase&#39; 吗?
119
+ &#125;
120
+
121
+ function assert(condition: any, msg?: string): asserts condition &#123;
122
+ if (!condition) &#123;
123
+ throw new AssertionError(msg)
124
+ &#125;
125
+ &#125;
126
+ </code></pre>
127
+ <p>另一种断言签名不检查条件,而是告诉 TypeScript 特定的变量或属性具有不同的类型。<br> function assertIsString(val: any): asserts val is string {<br> if (typeof val !&#x3D;&#x3D; “string”) {<br> throw new AssertionError(“Not a string!”);<br> }<br> }</p>
128
+ <p>这里的 assert val is string 确保在对 assertIs-String 进行任何调用之后,传入的任何变量都将是一个 string。<br> function yell(str: any) {<br> assertIsString(str);</p>
129
+ <pre><code> // 现在 TypeScript 知道 &#39;str&#39; 是一个 &#39;string&#39;.
130
+
131
+ return str.toUppercase();
132
+ // ~~~~~~~~~~~
133
+ // 错误:属性 &#39;toUppercase&#39; 在 &#39;string&#39; 类型上不存在。
134
+ // 你说的是 &#39;toUpperCase&#39; 吗?
135
+
136
+ &#125;
137
+ </code></pre>
138
+ <p>这些断言签名与编写类型谓词签名非常相似:<br> function isString(val: any): val is string {<br> return typeof val &#x3D;&#x3D;&#x3D; “string”;<br> }</p>
139
+ <pre><code>function yell(str: any) &#123;
140
+ if (isString(str)) &#123;
141
+ return str.toUppercase();
142
+ &#125;
143
+ throw &quot;Oops!&quot;;
144
+ &#125;
145
+ </code></pre>
146
+ <p>就像类型谓词签名一样,这些断言签名也有着惊人的表现力。我们可以用它们表达一些相当复杂的想法。<br> function assertIsDefined<T>(val: T): asserts val is NonNullable<T> {<br> if (val &#x3D;&#x3D;&#x3D; undefined || val &#x3D;&#x3D;&#x3D; null) {<br> throw new AssertionError(<br> <code>Expected &#39;val&#39; to be defined, but received $&#123;val&#125;</code><br> );<br> }<br> }</p>
147
+ <p>有关断言签名的更多信息,请查看原始的拉取请求。</p>
148
+ <p>拉取请求:<a target="_blank" rel="noopener" href="https://github.com/microsoft/TypeScript/pull/32695">https://github.com/microsoft/TypeScript/pull/32695</a><br>更好地支持返回 never 的函数<br>作为断言签名项目的一部分,TypeScript 需要对调用的函数和调用的位置编码更多信息。于是我们就可以扩展对另一类函数的支持:返回 never 的函数。</p>
149
+ <p>任何返回 never 的函数的意图都是说它不会返回。它表明抛出了异常,出现了暂停错误条件或程序已退出。例如,@types&#x2F;node 中的 process.exit(…) 被指定为返回 never。<br>为了确保函数永远不会返回 undefined,或者说可以从所有代码路径中有效地返回,TypeScript 需要一些语法信号——在函数结尾 return 或 throw。这样用户就会发现自己正在 return 故障函数。<br> function dispatch(x: string | number): SomeType {<br> if (typeof x &#x3D;&#x3D;&#x3D; “string”) {<br> return doThingWithString(x);<br> }<br> else if (typeof x &#x3D;&#x3D;&#x3D; “number”) {<br> return doThingWithNumber(x);<br> }<br> return process.exit(1);<br> }</p>
150
+ <p>现在,当调用这些返回 never 的函数时,TypeScript 会识别出它们会影响控制流图,并说明原因。<br> function dispatch(x: string | number): SomeType {<br> if (typeof x &#x3D;&#x3D;&#x3D; “string”) {<br> return doThingWithString(x);<br> }<br> else if (typeof x &#x3D;&#x3D;&#x3D; “number”) {<br> return doThingWithNumber(x);<br> }<br> process.exit(1);<br> }</p>
151
+ <p>你可以在断言函数的拉取请求中查阅更多信息。<br>(更多)递归类型别名“递归”引用类型别名时一直存在一些限制。原因是一旦用到类型别名就必须能用其别名来代替自己。在某些情况下这是不可能的,因此编译器会拒绝某些递归别名,如下所示:<br> type Foo &#x3D; Foo;</p>
152
+ <p>这是一个合理的限制,因为任何对 Foo 的使用都需要用 Foo 代替,而 Foo 则需要用 Foo 代替,而 Foo 则需要用 Foo 代替……好吧,希望你懂我的意思!最后没有哪一种类型可以代替 Foo。<br>这与其他语言对待类型别名的方式一致,但用户使用这一功能时会出现一些意想不到的问题。例如,在 TypeScript 3.6 和更低版本中,以下代码会报错。<br> type ValueOrArray<T> &#x3D; T | Array&lt;ValueOrArray<T>&gt;;<br> &#x2F;&#x2F; ~~~~~~~~~~~~<br> &#x2F;&#x2F; 错误:类型别名 ‘ValueOrArray’ 循环引用它自己。</p>
153
+ <p>这很奇怪,因为从技术上讲这种用法并没有错,用户应该总是可以通过引入接口来编写实际上是相同的代码。<br> type ValueOrArray<T> &#x3D; T | ArrayOfValueOrArray<T>;</p>
154
+ <pre><code>interface ArrayOfValueOrArray&lt;T&gt; extends Array&lt;ValueOrArray&lt;T&gt;&gt; &#123;&#125;
155
+ </code></pre>
156
+ <p>由于接口(和其他对象类型)引入了一定程度的间接性,并且不需要急切地构建其完整结构,因此 TypeScript 在使用该结构时没有问题。</p>
157
+ <p>但对于用户而言,引入界面的解决方法并不直观。原则上来说,ValueOrArray 的原始版本,也就是直接使用 Array 确实没有任何问题。如果编译器有点“懒惰”,并且仅在必要时才计算 Array 的类型参数,则 TypeScript 就可以正确表达这些参数。</p>
158
+ <p>这正是 TypeScript 3.7 引入的内容。在类型别名的“顶层”,TypeScript 将推迟解析类型参数以允许使用这些模式。<br>这意味着像下面这样的代码(试图表示 JSON)……<br> type Json &#x3D;<br> | string<br> | number<br> | boolean<br> | null<br> | JsonObject<br> | JsonArray;</p>
159
+ <pre><code>interface JsonObject &#123;
160
+ [property: string]: Json;
161
+ &#125;
162
+
163
+ interface JsonArray extends Array&lt;Json&gt; &#123;&#125;
164
+ </code></pre>
165
+ <p>终于无需辅助接口也能重写了。<br> type Json &#x3D;<br> | string<br> | number<br> | boolean<br> | null<br> | { [property: string]: Json }<br> | Json[];</p>
166
+ <p>这种新的宽松条件也使我们可以在元组中递归引用类型别名。下面的代码以前会报错,现在则是有效的 TypeScript 代码:<br> type VirtualNode &#x3D;<br> | string<br> | [string, { [key: string]: any }, …VirtualNode[]];</p>
167
+ <pre><code>const myNode: VirtualNode =
168
+ [&quot;div&quot;, &#123; id: &quot;parent&quot; &#125;,
169
+ [&quot;div&quot;, &#123; id: &quot;first-child&quot; &#125;, &quot;I&#39;m the first child&quot;],
170
+ [&quot;div&quot;, &#123; id: &quot;second-child&quot; &#125;, &quot;I&#39;m the second child&quot;]
171
+ ];
172
+ </code></pre>
173
+ <p>有关更多信息可以查阅原始的拉取请求。</p>
174
+ <p>拉取请求:<a target="_blank" rel="noopener" href="https://github.com/microsoft/TypeScript/pull/33050">https://github.com/microsoft/TypeScript/pull/33050</a><br>–declaration 和 –allowJs<br>TypeScript 中的 –declaration 标志允许我们从源 TypeScript 文件(如.ts 和.tsx 文件)生成.d.ts 文件(声明文件)。这些.d.ts 文件很重要,因为它们允许 TypeScript 对其他项目进行类型检查,而无需重新检查 &#x2F; 构建原始源代码。出于相同的原因,使用项目引用时 <strong>需要</strong> 此设置。</p>
175
+ <p>不幸的是,–declaration 不适用于 –allowJs 之类的设置,无法混合使用 TypeScript 和 JavaScript 输入文件。这是一个令人沮丧的限制,因为它意味着用户即使在迁移代码库时也无法使用 –declaration,即使使用 JSDoc 注释也是如此。TypeScript 3.7 对此做了更改,并允许将这两种功能混合使用!<br>使用 allowJs 时,TypeScript 将尽可能理解 JavaScript 源代码,并将其以等效表示形式保存到.d.ts 文件中。这包括其中所有的 JSDoc 注释,所以像如下代码:<br> &#x2F;**<br> * @callback Job<br> * @returns {void}<br> *&#x2F;</p>
176
+ <pre><code>/** Queues work */
177
+ export class Worker &#123;
178
+ constructor(maxDepth = 10) &#123;
179
+ this.started = false;
180
+ this.depthLimit = maxDepth;
181
+ /**
182
+ * 注意:队列中的作业可能会将更多项目添加到队列中
183
+ * @type &#123;Job[]&#125;
184
+ */
185
+ this.queue = [];
186
+ &#125;
187
+ /**
188
+ * 在队列中添加一个工作项
189
+ * @param &#123;Job&#125; work
190
+ */
191
+ push(work) &#123;
192
+ if (this.queue.length + 1 &gt; this.depthLimit) throw new Error(&quot;Queue full!&quot;);
193
+ this.queue.push(work);
194
+ &#125;
195
+ /**
196
+ * 如果队列尚未开始就启动它
197
+ */
198
+ start() &#123;
199
+ if (this.started) return false;
200
+ this.started = true;
201
+ while (this.queue.length) &#123;
202
+ /** @type &#123;Job&#125; */(this.queue.shift())();
203
+ &#125;
204
+ return true;
205
+ &#125;
206
+ &#125;
207
+ </code></pre>
208
+ <p>现在将转换为以下无需实现的.d.ts 文件:<br> &#x2F;**<br> * @callback Job<br> * @returns {void}<br> <em>&#x2F;<br> &#x2F;</em>* Queues work <em>&#x2F;<br> export class Worker {<br> constructor(maxDepth?: number);<br> started: boolean;<br> depthLimit: number;<br> &#x2F;</em>*<br> * 注意:队列中的作业可能会将更多项目添加到队列中<br> * @type {Job[]}<br> <em>&#x2F;<br> queue: Job[];<br> &#x2F;</em>*<br> * 在队列中添加一个工作项<br> * @param {Job} work<br> <em>&#x2F;<br> push(work: Job): void;<br> &#x2F;</em>*<br> * 如果队列尚未开始就启动它<br> *&#x2F;<br> start(): boolean;<br> }<br> export type Job &#x3D; () &#x3D;&gt; void;</p>
209
+ <p>有关更多详细信息请查阅原始拉取请求。</p>
210
+ <p>拉取请求:<a target="_blank" rel="noopener" href="https://github.com/microsoft/TypeScript/pull/32372">https://github.com/microsoft/TypeScript/pull/32372</a><br>使用项目引用进行免构建编辑<br>TypeScript 的项目引用为我们提供了一种简便的方法来分解代码库,从而提升编译速度。不幸的是,编辑一个尚未建立依赖关系(或输出已过时)的项目时会出现很多问题。</p>
211
+ <p>在 TypeScript 3.7 中,当打开具有依赖项的项目时,TypeScript 将自动使用源.ts &#x2F; .tsx 文件代替。这意味着使用项目引用的项目现在将获得增强的编辑体验,其中语义操作都是最新且“有效”的。你可以使用编译器选项 disableSourceOfProjectReferenceRedirect 禁用此行为,处理非常大的项目(此更改可能影响编辑性能)时用这个选项可能会很合适。</p>
212
+ <p>有关此更改的更多信息请查阅其拉取请求。</p>
213
+ <p>拉取请求:<a target="_blank" rel="noopener" href="https://github.com/microsoft/TypeScript/pull/32028">https://github.com/microsoft/TypeScript/pull/32028</a><br>未调用函数的检查一个常见且危险的错误是忘记调用某个函数,尤其是当函数具有零参数,或者命名更像是属性而非函数时更容易出错。<br> interface User {<br> isAdministrator(): boolean;<br> notify(): void;<br> doNotDisturb?(): boolean;<br> }</p>
214
+ <pre><code>// 稍后……
215
+
216
+ // 代码已破坏, 勿用!
217
+ function doAdminThing(user: User) &#123;
218
+ // oops!
219
+ if (user.isAdministrator) &#123;
220
+ sudo();
221
+ editTheConfiguration();
222
+ &#125;
223
+ else &#123;
224
+ throw new AccessDeniedError(&quot;User is not an admin&quot;);
225
+ &#125;
226
+ &#125;
227
+ </code></pre>
228
+ <p>比如在上面的代码中我们忘记调用 isAdmini-strator,该代码错误地允许非管理员用户编辑配置!<br>在 TypeScript 3.7 中,这被标识为可能的错误:<br> function doAdminThing(user: User) {<br> if (user.isAdministrator) {<br> &#x2F;&#x2F; ~~~~~~~~~~~~~~~~~~~~<br> &#x2F;&#x2F; 错误!这个条件将始终返回 true,因为这个函数定义是一直存在的<br> &#x2F;&#x2F; 你的意思是调用它吗?</p>
229
+ <p>此检查是一项重大更改,但正因如此,检查会非常保守。仅在 if 条件下才发出此错误,并且在 strictNullChecks 关闭,或者以后在 if 的正文中调用该函数时,不会在可选属性上发出此错误:<br> interface User {<br> isAdministrator(): boolean;<br> notify(): void;<br> doNotDisturb?(): boolean;<br> }</p>
230
+ <pre><code>function issueNotification(user: User) &#123;
231
+ if (user.doNotDisturb) &#123;
232
+ // OK, 属性是可选的
233
+ &#125;
234
+ if (user.notify) &#123;
235
+ // OK, 调用了这一函数
236
+ user.notify();
237
+ &#125;
238
+ &#125;
239
+ </code></pre>
240
+ <p>如果你打算在不调用函数的情况下测试它,则可以将其定义更正为包含 undefined&#x2F;null,或使用!! 编写类似 if(!!user.isAdministrator) 的内容以指示强制是故意的。</p>
241
+ <p>我们非常感谢 GitHub 用户 @jwbay,他创建了概念验证,并一直改进到现在这个版本。<br>TypeScript 文件中的 &#x2F;&#x2F; @ts-nocheck<br>TypeScript 3.7 允许我们在 TypeScript 文件的顶部添加 &#x2F;&#x2F; @ts-nocheck 注释以禁用语义检查。过去只有在存在 checkJs 时,JavaScript 源文件中的这一注释才会被认可。但我们已扩展了对 TypeScript 文件的支持,以简化所有用户的迁移过程。<br>分号格式化选项<br>TypeScript 的内置格式化程序现在支持在结尾分号可选的位置,根据 JavaScript 的自动分号插入(ASI)规则插入和删除分号。该设置现在在 Visual Studio Code Insiders 中可用,也在 Visual Studio 16.4 Preview 2 中的“Tools Options”菜单中可用。</p>
242
+ <p><img src="https://mmbiz.qpic.cn/mmbiz_png/XIibZ0YbvibkW1ELLUnvYXMdomcibLYibicDE2MsOhhKwbak2wkwraI77l9FyftfXZF35LdQ9BotyDMa83IWqicFyTrg/640?wx_fmt=png&amp;tp=webp&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="xuehuayu.cn"></p>
243
+ <p>选择“insert”或“remove”的值还会影响自动导入的格式、提取的类型以及 TypeScript 服务提供的其他生成代码。将设置保留为默认值“ignore”会使生成的代码与当前文件中检测到的分号首选项相匹配。<br>重大更改DOM 更改<br>lib.dom.d.ts 中的类型已更新。这些更改大都是与可空性相关的正确性更改,但其影响最终取决于你的代码库。</p>
244
+ <p><a target="_blank" rel="noopener" href="https://github.com/microsoft/TypeScript/pull/33627">https://github.com/microsoft/TypeScript/pull/33627</a><br>函数真实性检查如上所述,当在 if 语句条件下似乎未调用函数时,TypeScript 现在会出错。除非满足以下任一条件,否则在 if 条件下检查函数类型时会发出错误:</p>
245
+ <ul>
246
+ <li>检查值来自可选属性。</li>
247
+ <li>strictNullChecks 已禁用。</li>
248
+ <li>该函数稍后在 if 的正文中调用。</li>
249
+ </ul>
250
+ <p>本地和导入的类型声明现在会起冲突由于一个错误,之前的 TypeScript 版本允许以下构造:<br> &#x2F;&#x2F; .&#x2F;someOtherModule.ts<br> interface SomeType {<br> y: string;<br> }</p>
251
+ <pre><code>// ./myModule.ts
252
+ import &#123; SomeType &#125; from &quot;./someOtherModule&quot;;
253
+ export interface SomeType &#123;
254
+ x: number;
255
+ &#125;
256
+
257
+ function fn(arg: SomeType) &#123;
258
+ console.log(arg.x); // Error! &#39;x&#39; doesn&#39;t exist on &#39;SomeType&#39;
259
+ &#125;
260
+ </code></pre>
261
+ <p>在这里,SomeType 似乎同时源于 import 声明和本地 interface 声明。可能想不到的是,在模块内部 SomeType 仅引用 import 的定义,而本地声明 SomeType 仅在从另一个文件导入时才可用。这非常令人困惑,我们对这类罕见情况的调查表明,开发人员通常会认为出现了一些其他问题。</p>
262
+ <p>TypeScript 3.7 现在可以正确地将其识别为重复的标识符错误。正确的修复方案取决于作者的初衷,具体情况具体分析。通常来说,命名冲突是无意的,最好的解决方法是重命名导入的类型。如果初衷是要扩展导入的类型,则应编写适当的模块扩展。<br>API 更改<br>为了支持前文所述的递归类型别名模式,我们已从 TypeReference 接口中删除了 typeArguments 属性。用户应该在 TypeChecker 实例上使用 getTypeArguments 函数。<br>未来计划<br>TypeScript 3.7 的最终版本将在几周内发布,理想情况下只需极少的更改即可完成!我们希望大家尝试这个 RC 版本并向我们提供反馈,从而打造一个出色的 3.7 版本。如果你有任何建议或遇到任何问题,请随时在我们的问题跟踪器上报告问题!</p>
263
+ <p><a target="_blank" rel="noopener" href="https://github.com/microsoft/TypeScript/issues/new/choose">https://github.com/microsoft/TypeScript/issues/new/choose</a></p>
264
+ <p>编程快乐!</p>
265
+ <p>——Daniel Rosenwasser 和 TypeScript 团队</p>
266
+ <p>原文链接:<a target="_blank" rel="noopener" href="https://devblogs.microsoft.com/typescript/announcing-typescript-3-7-rc/">https://devblogs.microsoft.com/typescript/announcing-typescript-3-7-rc/</a><br> 活动推荐<br>近年来,随着 jQuery 的落幕,三大框架的割据以及小程序的爆发,大前端的发展也经历了从静态页面到 JavaScript 跨时代的诞生,再从 PC 端到移动端的转向,以及由依赖后端到前后端分离的架构演变。</p>
267
+ <p>腾讯在线教育前端团队,近年来在大前端技术架构演进方面也有了不少突破,如 Hybird 方案、离线包方案、PWA 结合 SSR 方案、以及 RN 动态化方案的落地和执行等。</p>
268
+ <p>这次 GMTC 全球大前端技术大会(深圳站)2019,我们专门请到了 <strong>腾讯的前端高级工程师曹海歌</strong>,希望可以从腾讯在线教育前端团队的实操案例中,深入了解腾讯为提升研发效率,进行的前端工程化体系建设过程。扫描下方二维码或点击阅读原文,查看详情。</p>
269
+ <p><img src="https://mmbiz.qpic.cn/mmbiz_png/XIibZ0YbvibkVJ39Bia0ZKsNgbMXreVo0RCzKlWxKvicKhicM1YfHnc2jtT6xLB0OSY1nJaicLsrt0ygDwX7GbhaMC3g/640?wx_fmt=png&amp;tp=webp&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="xuehuayu.cn"></p>
270
+ <p><img src="https://mmbiz.qpic.cn/mmbiz_gif/XIibZ0YbvibkWXXvo603ymFTsEG4KVIRcrIRtichVbn5KRqRzKkOPjnOXEwqSrmsiaL9hm6c168WpMcKicPtPZMEd1g/640?wx_fmt=gif&amp;tp=webp&amp;wxfrom=5&amp;wx_lazy=1" alt="xuehuayu.cn"></p>
271
+ </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/45156.html">https://xuehuayu.cn/article/45156.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/58816.html">使用node运行electron时报Error: spawn electron-forge ENOENT解决办法</a><a class="next" href="/article/59349.html">一文洞察Chrome DevTools近半年新增了哪些功能</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
272
+ const serverURL = origin.includes('cainiaoblog') ? 'https://cmts.cainiaoblog.cn' : 'https://cmts.xuehuayu.cn'
273
+ const locale = {
274
+ placeholder: '请正确填写昵称和邮箱,方便接收回复通知~',
275
+ sofa: '沙发空缺中,还不快抢~',
276
+ };
277
+ Waline.init({
278
+ el: '#vcomment',
279
+ serverURL: serverURL,
280
+ pageSize: '20',
281
+ visitor: true, // 阅读量统计
282
+ requiredMeta: ['nick', 'mail'],
283
+ emoji: [
284
+ 'https://cdn.jsdelivr.net/gh/walinejs/emojis@1.0.0/weibo',
285
+ 'https://cdn.jsdelivr.net/gh/walinejs/emojis@1.0.0/qq',
286
+ 'https://cdn.jsdelivr.net/gh/walinejs/emojis@1.0.0/tw-emoji',
287
+ ],
288
+ locale,
289
+ pageview: true
290
+ })
291
+ </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() {
292
+ var val = $(this).val()
293
+ 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>'
294
+ 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>'
295
+ 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>'
296
+
297
+ if (val === 'self') {
298
+ $('#search').html(self)
299
+ var search_path = 'search.xml';
300
+ if (search_path.length == 0) {
301
+ search_path = 'search.xml';
302
+ }
303
+ var path = 'https://cdn.staticaly.com/gh/npljy/npljy.github.io/main/' + search_path;
304
+ searchFunc(path, 'local-search-input', 'local-search-result');
305
+ } else if (val === 'baidu') {
306
+ $('#search').html(baidu)
307
+ } else if (val === 'google') {
308
+ $('#search').html(google)
309
+ }
310
+ })</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(){
311
+ var cnb =window.location.origin.indexOf('cainiaoblog') !==-1
312
+ if (cnb) {
313
+ var gxba =document.getElementById('gxba')
314
+ var gaba =document.getElementById('gaba')
315
+ var gabaLink =document.getElementById('gaba-link')
316
+ gxba.innerText ='京ICP备20007647号-1'
317
+ gaba.innerText ='京公网安备 11010802031254号'
318
+ gabaLink.setAttribute('href','http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=11010802031254')
319
+ }
320
+ })()</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>