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,653 @@
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>48个 JS 开发常用工具函数 | 前端壹菜鸟</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">48个 JS 开发常用工具函数</h1><div class="post-meta"><span class="date">2019-12-02</span><span> | </span><span class="tag"><a href="/tags/%E8%BD%AC%E8%BD%BD/">转载 </a></span><span> | </span><span class="category"><a href="/categories/%E5%89%8D%E7%AB%AF/">前端 </a></span><span id="busuanzi_container_page_pv"> | <span id="busuanzi_value_page_pv"><i class="fa fa-spinner"></i></span><span> 阅读</span></span><span class="post-time"><span class="post-meta-item-text"> | </span><span class="post-meta-item-icon"><i class="fa fa-keyboard-o"></i><span class="post-count"> 3.9k</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/64051.html#vcomment"><span class="waline-comment-count" data-path="/article/64051.html"></span><span> 条评论</span></a><div class="post-content"><p><code>原文地址:https://segmentfault.com/a/1190000019601333</code></p>
20
+ <span id="more"></span>
21
+ <h2 id="1、isStatic:检测数据是不是除了symbol外的原始数据"><a href="#1、isStatic:检测数据是不是除了symbol外的原始数据" class="headerlink" title="1、isStatic:检测数据是不是除了symbol外的原始数据"></a>1、isStatic:检测数据是不是除了symbol外的原始数据</h2><pre><code>function isStatic(value) &#123;
22
+ return(
23
+ typeofvalue === &#39;string&#39; ||
24
+ typeofvalue === &#39;number&#39; ||
25
+ typeofvalue === &#39;boolean&#39; ||
26
+ typeofvalue === &#39;undefined&#39; ||
27
+ value === null
28
+ )
29
+ &#125;
30
+ </code></pre>
31
+ <h2 id="2、isPrimitive:检测数据是不是原始数据"><a href="#2、isPrimitive:检测数据是不是原始数据" class="headerlink" title="2、isPrimitive:检测数据是不是原始数据"></a>2、isPrimitive:检测数据是不是原始数据</h2><pre><code>function isPrimitive(value) &#123;
32
+ return isStatic(value) || typeofvalue === &#39;symbol&#39;
33
+ &#125;
34
+ </code></pre>
35
+ <h2 id="3、isObject:判断数据是不是引用类型的数据-例如:-arrays-functions-objects-regexes-new-Number-0-以及-new-String-‘’"><a href="#3、isObject:判断数据是不是引用类型的数据-例如:-arrays-functions-objects-regexes-new-Number-0-以及-new-String-‘’" class="headerlink" title="3、isObject:判断数据是不是引用类型的数据 (例如: arrays, functions, objects, regexes, new Number(0),以及 new String(‘’))"></a>3、isObject:判断数据是不是引用类型的数据 (例如: arrays, functions, objects, regexes, new Number(0),以及 new String(‘’))</h2><pre><code>functionisObject(value) &#123;
36
+ let type = typeof value;
37
+ returnvalue != null &amp;&amp; (type== &#39;object&#39; || type== &#39;function&#39;);
38
+ &#125;
39
+ </code></pre>
40
+ <h2 id="4、isObjectLike:检查-value-是否是-类对象。-如果一个值是类对象,那么它不应该是-null,而且-typeof-后的结果是-“object”"><a href="#4、isObjectLike:检查-value-是否是-类对象。-如果一个值是类对象,那么它不应该是-null,而且-typeof-后的结果是-“object”" class="headerlink" title="4、isObjectLike:检查 value 是否是 类对象。 如果一个值是类对象,那么它不应该是 null,而且 typeof 后的结果是 “object”"></a>4、isObjectLike:检查 value 是否是 类对象。 如果一个值是类对象,那么它不应该是 null,而且 typeof 后的结果是 “object”</h2><pre><code>function isObjectLike(value) &#123;
41
+ returnvalue != null &amp;&amp; typeofvalue == &#39;object&#39;;
42
+ &#125;
43
+ </code></pre>
44
+ <h2 id="5、getRawType:获取数据类型,返回结果为-Number、String、Object、Array等"><a href="#5、getRawType:获取数据类型,返回结果为-Number、String、Object、Array等" class="headerlink" title="5、getRawType:获取数据类型,返回结果为 Number、String、Object、Array等"></a>5、getRawType:获取数据类型,返回结果为 Number、String、Object、Array等</h2><pre><code>functiongetRawType(value) &#123;
45
+ returnObject.prototype.toString.call(value).slice(8, -1)
46
+ &#125;
47
+ //getoRawType([]) ==&gt; Array
48
+ </code></pre>
49
+ <h2 id="6、isPlainObject:判断数据是不是Object类型的数据"><a href="#6、isPlainObject:判断数据是不是Object类型的数据" class="headerlink" title="6、isPlainObject:判断数据是不是Object类型的数据"></a>6、isPlainObject:判断数据是不是Object类型的数据</h2><pre><code>functionisPlainObject(obj) &#123;
50
+ returnObject.prototype.toString.call(obj) === &#39;[object Object]&#39;
51
+ &#125;
52
+ </code></pre>
53
+ <h2 id="7、isArray:判断数据是不是数组类型的数据"><a href="#7、isArray:判断数据是不是数组类型的数据" class="headerlink" title="7、isArray:判断数据是不是数组类型的数据"></a>7、isArray:判断数据是不是数组类型的数据</h2><pre><code>functionisArray(arr) &#123;
54
+ returnObject.prototype.toString.call(arr) === &#39;[object Array]&#39;
55
+ &#125;
56
+ </code></pre>
57
+ <p>将isArray挂载到Array上</p>
58
+ <pre><code>Array.isArray = Array.isArray || isArray;
59
+ </code></pre>
60
+ <h2 id="8、isRegExp:判断数据是不是正则对象"><a href="#8、isRegExp:判断数据是不是正则对象" class="headerlink" title="8、isRegExp:判断数据是不是正则对象"></a>8、isRegExp:判断数据是不是正则对象</h2><pre><code>function isRegExp(value) &#123;
61
+ return Object.prototype.toString.call(value) === &#39;[object RegExp]&#39;
62
+ &#125;
63
+ </code></pre>
64
+ <h2 id="9、isDate:判断数据是不是时间对象"><a href="#9、isDate:判断数据是不是时间对象" class="headerlink" title="9、isDate:判断数据是不是时间对象"></a>9、isDate:判断数据是不是时间对象</h2><pre><code>function isDate(value) &#123;
65
+ return Object.prototype.toString.call(value) === &#39;[object Date]&#39;
66
+ &#125;
67
+ </code></pre>
68
+ <h2 id="10、isNative:判断-value-是不是浏览器内置函数"><a href="#10、isNative:判断-value-是不是浏览器内置函数" class="headerlink" title="10、isNative:判断 value 是不是浏览器内置函数"></a>10、isNative:判断 value 是不是浏览器内置函数</h2><p>内置函数toString后的主体代码块为 [native code] ,而非内置函数则为相关代码,所以非内置函数可以进行拷贝(toString后掐头去尾再由Function转)</p>
69
+ <pre><code>functionisNative(value)&#123;
70
+ returntypeof value === &#39;function&#39; &amp;&amp; /native code/.test(value.toString())
71
+ &#125;
72
+ </code></pre>
73
+ <h2 id="11、isFunction:检查-value-是不是函数"><a href="#11、isFunction:检查-value-是不是函数" class="headerlink" title="11、isFunction:检查 value 是不是函数"></a>11、isFunction:检查 value 是不是函数</h2><pre><code>functionisFunction(value) &#123;
74
+ returnObject.prototype.toString.call(value) === &#39;[object Function]&#39;
75
+ &#125;
76
+ </code></pre>
77
+ <h2 id="12、isLength:检查-value-是否为有效的类数组长度"><a href="#12、isLength:检查-value-是否为有效的类数组长度" class="headerlink" title="12、isLength:检查 value 是否为有效的类数组长度"></a>12、isLength:检查 value 是否为有效的类数组长度</h2><pre><code>function isLength(value) &#123;
78
+ returntypeofvalue == &#39;number&#39; &amp;&amp; value &gt; -1 &amp;&amp; value % 1 == 0 &amp;&amp; value &lt;= Number.MAX_SAFE_INTEGER;
79
+ &#125;
80
+ </code></pre>
81
+ <h2 id="13、isArrayLike:检查-value-是否是类数组"><a href="#13、isArrayLike:检查-value-是否是类数组" class="headerlink" title="13、isArrayLike:检查 value 是否是类数组"></a>13、isArrayLike:检查 value 是否是类数组</h2><p>如果一个值被认为是类数组,那么它不是一个函数,并且value.length是个整数,大于等于 0,小于或等于 Number.MAX_SAFE_INTEGER。这里字符串也将被当作类数组</p>
82
+ <pre><code>function isArrayLike(value) &#123;
83
+ returnvalue != null &amp;&amp; isLength(value.length) &amp;&amp; !isFunction(value);
84
+ &#125;
85
+ </code></pre>
86
+ <h2 id="14、isEmpty:检查-value-是否为空"><a href="#14、isEmpty:检查-value-是否为空" class="headerlink" title="14、isEmpty:检查 value 是否为空"></a>14、isEmpty:检查 value 是否为空</h2><p>如果是null,直接返回true;如果是类数组,判断数据长度;如果是Object对象,判断是否具有属性;如果是其他数据,直接返回false(也可改为返回true)</p>
87
+ <pre><code>function isEmpty(value) &#123;
88
+ if (value == null) &#123;
89
+ return true;
90
+ &#125;
91
+ if (isArrayLike(value)) &#123;
92
+ return !value.length;
93
+ &#125;elseif(isPlainObject(value))&#123;
94
+ for (let key invalue) &#123;
95
+ if (hasOwnProperty.call(value, key)) &#123;
96
+ returnfalse;
97
+ &#125;
98
+ &#125;
99
+ return true;
100
+ &#125;
101
+ returnfalse;
102
+ &#125;
103
+ </code></pre>
104
+ <h2 id="15、cached:记忆函数:缓存函数的运算结果"><a href="#15、cached:记忆函数:缓存函数的运算结果" class="headerlink" title="15、cached:记忆函数:缓存函数的运算结果"></a>15、cached:记忆函数:缓存函数的运算结果</h2><pre><code>functioncached(fn) &#123;
105
+ let cache = Object.create(null);
106
+ returnfunctioncachedFn(str) &#123;
107
+ let hit = cache[str];
108
+ return hit || (cache[str] = fn(str))
109
+ &#125;
110
+ &#125;
111
+ </code></pre>
112
+ <h2 id="16、camelize:横线转驼峰命名"><a href="#16、camelize:横线转驼峰命名" class="headerlink" title="16、camelize:横线转驼峰命名"></a>16、camelize:横线转驼峰命名</h2><pre><code>let camelizeRE = /-(\w)/g;
113
+ functioncamelize(str) &#123;
114
+ return str.replace(camelizeRE, function(_, c) &#123;
115
+ return c ? c.toUpperCase() : &#39;&#39;;
116
+ &#125;)
117
+ &#125;
118
+ //ab-cd-ef ==&gt; abCdEf//使用记忆函数let _camelize = cached(camelize)
119
+ </code></pre>
120
+ <h2 id="17、hyphenate:驼峰命名转横线命名:拆分字符串,使用-相连,并且转换为小写"><a href="#17、hyphenate:驼峰命名转横线命名:拆分字符串,使用-相连,并且转换为小写" class="headerlink" title="17、hyphenate:驼峰命名转横线命名:拆分字符串,使用 - 相连,并且转换为小写"></a>17、hyphenate:驼峰命名转横线命名:拆分字符串,使用 - 相连,并且转换为小写</h2><pre><code>let hyphenateRE = /\B([A-Z])/g;
121
+ functionhyphenate(str)&#123;
122
+ return str.replace(hyphenateRE, &#39;-$1&#39;).toLowerCase()
123
+ &#125;
124
+ //abCd ==&gt; ab-cd//使用记忆函数let _hyphenate = cached(hyphenate);
125
+ </code></pre>
126
+ <h2 id="18、capitalize:字符串首位大写"><a href="#18、capitalize:字符串首位大写" class="headerlink" title="18、capitalize:字符串首位大写"></a>18、capitalize:字符串首位大写</h2><pre><code>functioncapitalize(str)&#123;
127
+ return str.charAt(0).toUpperCase() + str.slice(1)
128
+ &#125;
129
+ // abc ==&gt; Abc//使用记忆函数let _capitalize = cached(capitalize)
130
+ </code></pre>
131
+ <h2 id="19、extend:将属性混合到目标对象中"><a href="#19、extend:将属性混合到目标对象中" class="headerlink" title="19、extend:将属性混合到目标对象中"></a>19、extend:将属性混合到目标对象中</h2><pre><code>function extend(to, _from) &#123;
132
+ for(let key in _from) &#123;
133
+ to[key] = _from[key];
134
+ &#125;
135
+ returnto
136
+ &#125;
137
+ </code></pre>
138
+ <h2 id="20、Object-assign:对象属性复制,浅拷贝"><a href="#20、Object-assign:对象属性复制,浅拷贝" class="headerlink" title="20、Object.assign:对象属性复制,浅拷贝"></a>20、Object.assign:对象属性复制,浅拷贝</h2><pre><code>Object.assign = Object.assign || function()&#123;
139
+ if(arguments.length == 0) thrownewTypeError(&#39;Cannot convert undefined or null to object&#39;);
140
+
141
+ let target = arguments[0],
142
+ args = Array.prototype.slice.call(arguments, 1),
143
+ key
144
+ args.forEach(function(item)&#123;
145
+ for(key in item)&#123;
146
+ item.hasOwnProperty(key) &amp;&amp; ( target[key] = item[key] )
147
+ &#125;
148
+ &#125;)
149
+ return target
150
+ &#125;
151
+ </code></pre>
152
+ <p>使用Object.assign可以浅克隆一个对象:</p>
153
+ <pre><code>let clone= Object.assign(&#123;&#125;, target)
154
+ </code></pre>
155
+ <p>简单的深克隆可以使用JSON.parse()和JSON.stringify(),这两个api是解析json数据的,所以只能解析除symbol外的原始类型及数组和对象</p>
156
+ <pre><code>let clone= JSON.parse( JSON.stringify(target) )
157
+ </code></pre>
158
+ <h2 id="21、clone:克隆数据,可深度克隆"><a href="#21、clone:克隆数据,可深度克隆" class="headerlink" title="21、clone:克隆数据,可深度克隆"></a>21、clone:克隆数据,可深度克隆</h2><p>这里列出了原始类型,时间、正则、错误、数组、对象的克隆规则,其他的可自行补充</p>
159
+ <pre><code>function clone(value, deep) &#123;
160
+ if (isPrimitive(value)) &#123;
161
+ returnvalue
162
+ &#125;
163
+
164
+ if (isArrayLike(value)) &#123; //是类数组value = Array.prototype.slice.call(value)
165
+ return deep ? value.map(item =&gt; clone(item, deep)) : value
166
+ &#125; elseif (isPlainObject(value)) &#123; //是对象let target = &#123;&#125;, key;
167
+ for (key invalue) &#123;
168
+ value.hasOwnProperty(key) &amp;&amp; (target[key] = deep ? clone(value[key], deep) : value[key])
169
+ &#125;
170
+ return target
171
+ &#125;
172
+
173
+ let type = getRawType(value)
174
+
175
+ switch (type) &#123;
176
+ case&#39;Date&#39;:
177
+ case&#39;RegExp&#39;:
178
+ case&#39;Error&#39;: value = new window[type](value); break;
179
+ &#125;
180
+ returnvalue
181
+ &#125;~~~~
182
+ </code></pre>
183
+ <h2 id="22、识别各种浏览器及平台"><a href="#22、识别各种浏览器及平台" class="headerlink" title="22、识别各种浏览器及平台"></a>22、识别各种浏览器及平台</h2><pre><code>//运行环境是浏览器let inBrowser = typeofwindow !== &#39;undefined&#39;;
184
+ //运行环境是微信let inWeex = typeof WXEnvironment !== &#39;undefined&#39; &amp;&amp; !!WXEnvironment.platform;
185
+ let weexPlatform = inWeex &amp;&amp; WXEnvironment.platform.toLowerCase();
186
+ //浏览器 UA 判断let UA = inBrowser &amp;&amp; window.navigator.userAgent.toLowerCase();
187
+ let isIE = UA &amp;&amp; /msie|trident/.test(UA);
188
+ let isIE9 = UA &amp;&amp; UA.indexOf(&#39;msie 9.0&#39;) &gt; 0;
189
+ let isEdge = UA &amp;&amp; UA.indexOf(&#39;edge/&#39;) &gt; 0;
190
+ let isAndroid = (UA &amp;&amp; UA.indexOf(&#39;android&#39;) &gt; 0) || (weexPlatform === &#39;android&#39;);
191
+ let isIOS = (UA &amp;&amp; /iphone|ipad|ipod|ios/.test(UA)) || (weexPlatform === &#39;ios&#39;);
192
+ let isChrome = UA &amp;&amp; /chrome\/\d+/.test(UA) &amp;&amp; !isEdge;
193
+ </code></pre>
194
+ <h2 id="23、getExplorerInfo:获取浏览器信息"><a href="#23、getExplorerInfo:获取浏览器信息" class="headerlink" title="23、getExplorerInfo:获取浏览器信息"></a>23、getExplorerInfo:获取浏览器信息</h2><pre><code>function getExplorerInfo() &#123;
195
+ let t = navigator.userAgent.toLowerCase();
196
+ return 0 &lt;= t.indexOf(&quot;msie&quot;) ? &#123; //ie &lt; 11type: &quot;IE&quot;,
197
+ version: Number(t.match(/msie ([\d]+)/)[1])
198
+ &#125; : !!t.match(/trident\/.+?rv:(([\d.]+))/) ? &#123; // ie 11type: &quot;IE&quot;,
199
+ version: 11
200
+ &#125; : 0 &lt;= t.indexOf(&quot;edge&quot;) ? &#123;
201
+ type: &quot;Edge&quot;,
202
+ version: Number(t.match(/edge\/([\d]+)/)[1])
203
+ &#125; : 0 &lt;= t.indexOf(&quot;firefox&quot;) ? &#123;
204
+ type: &quot;Firefox&quot;,
205
+ version: Number(t.match(/firefox\/([\d]+)/)[1])
206
+ &#125; : 0 &lt;= t.indexOf(&quot;chrome&quot;) ? &#123;
207
+ type: &quot;Chrome&quot;,
208
+ version: Number(t.match(/chrome\/([\d]+)/)[1])
209
+ &#125; : 0 &lt;= t.indexOf(&quot;opera&quot;) ? &#123;
210
+ type: &quot;Opera&quot;,
211
+ version: Number(t.match(/opera.([\d]+)/)[1])
212
+ &#125; : 0 &lt;= t.indexOf(&quot;Safari&quot;) ? &#123;
213
+ type: &quot;Safari&quot;,
214
+ version: Number(t.match(/version\/([\d]+)/)[1])
215
+ &#125; : &#123;
216
+ type: t,
217
+ version: -1
218
+ &#125;
219
+ &#125;
220
+ </code></pre>
221
+ <h2 id="24、isPCBroswer:检测是否为PC端浏览器模式"><a href="#24、isPCBroswer:检测是否为PC端浏览器模式" class="headerlink" title="24、isPCBroswer:检测是否为PC端浏览器模式"></a>24、isPCBroswer:检测是否为PC端浏览器模式</h2><pre><code>function isPCBroswer() &#123;
222
+ let e = navigator.userAgent.toLowerCase()
223
+ , t = &quot;ipad&quot; == e.match(/ipad/i)
224
+ , i = &quot;iphone&quot; == e.match(/iphone/i)
225
+ , r = &quot;midp&quot; == e.match(/midp/i)
226
+ , n = &quot;rv:1.2.3.4&quot; == e.match(/rv:1.2.3.4/i)
227
+ , a = &quot;ucweb&quot; == e.match(/ucweb/i)
228
+ , o = &quot;android&quot; == e.match(/android/i)
229
+ , s = &quot;windows ce&quot; == e.match(/windows ce/i)
230
+ , l = &quot;windows mobile&quot; == e.match(/windows mobile/i);
231
+ return !(t || i || r || n || a || o || s || l)
232
+ &#125;
233
+ </code></pre>
234
+ <h2 id="25、unique:数组去重,返回一个新数组"><a href="#25、unique:数组去重,返回一个新数组" class="headerlink" title="25、unique:数组去重,返回一个新数组"></a>25、unique:数组去重,返回一个新数组</h2><pre><code>function unique(arr)&#123;
235
+ if(!isArrayLink(arr))&#123; //不是类数组对象return arr
236
+ &#125;
237
+ let result = []
238
+ let objarr = []
239
+ let obj = Object.create(null)
240
+
241
+ arr.forEach(item =&gt; &#123;
242
+ if(isStatic(item))&#123;//是除了symbol外的原始数据letkey = item + &#39;_&#39; + getRawType(item);
243
+ if(!obj[key])&#123;
244
+ obj[key] = true
245
+ result.push(item)
246
+ &#125;
247
+ &#125;else&#123;//引用类型及symbolif(!objarr.includes(item))&#123;
248
+ objarr.push(item)
249
+ result.push(item)
250
+ &#125;
251
+ &#125;
252
+ &#125;)
253
+
254
+ return resulte
255
+ &#125;
256
+ </code></pre>
257
+ <h2 id="26、Set简单实现"><a href="#26、Set简单实现" class="headerlink" title="26、Set简单实现"></a>26、Set简单实现</h2><pre><code>window.Set = window.Set || (function () &#123;
258
+ functionSet(arr) &#123;
259
+ this.items = arr ? unique(arr) : [];
260
+ this.size = this.items.length; // Array的大小
261
+ &#125;
262
+ Set.prototype = &#123;
263
+ add: function (value) &#123;
264
+ // 添加元素,若元素已存在,则跳过,返回 Set 结构本身。if (!this.has(value)) &#123;
265
+ this.items.push(value);
266
+ this.size++;
267
+ &#125;
268
+ returnthis;
269
+ &#125;,
270
+ clear: function () &#123;
271
+ //清除所有成员,没有返回值。this.items = []
272
+ this.size = 0
273
+ &#125;,
274
+ delete: function (value) &#123;
275
+ //删除某个值,返回一个布尔值,表示删除是否成功。returnthis.items.some((v, i) =&gt; &#123;
276
+ if(v === value)&#123;
277
+ this.items.splice(i,1)
278
+ return true
279
+ &#125;
280
+ returnfalse
281
+ &#125;)
282
+ &#125;,
283
+ has: function (value) &#123;
284
+ //返回一个布尔值,表示该值是否为Set的成员。returnthis.items.some(v =&gt; v === value)
285
+ &#125;,
286
+ values: function () &#123;
287
+ returnthis.items
288
+ &#125;,
289
+ &#125;
290
+
291
+ returnSet;
292
+ &#125;());
293
+ </code></pre>
294
+ <h2 id="27、repeat:生成一个重复的字符串,有n个str组成,可修改为填充为数组等"><a href="#27、repeat:生成一个重复的字符串,有n个str组成,可修改为填充为数组等" class="headerlink" title="27、repeat:生成一个重复的字符串,有n个str组成,可修改为填充为数组等"></a>27、repeat:生成一个重复的字符串,有n个str组成,可修改为填充为数组等</h2><pre><code>function repeat(str, n) &#123;
295
+ let res = &#39;&#39;;while(n) &#123;
296
+ if(n % 2 === 1) &#123;
297
+ res += str;
298
+ &#125;
299
+ if(n &gt; 1) &#123;
300
+ str += str;
301
+ &#125;
302
+ n &gt;&gt;= 1;
303
+ &#125;
304
+ return res
305
+ &#125;;//repeat(&#39;123&#39;,3) ==&gt; 123123123
306
+ </code></pre>
307
+ <h2 id="28、dateFormater:格式化时间"><a href="#28、dateFormater:格式化时间" class="headerlink" title="28、dateFormater:格式化时间"></a>28、dateFormater:格式化时间</h2><pre><code>functiondateFormater(formater, t)&#123;
308
+ letdate = t ? newDate(t) : newDate(),
309
+ Y = date.getFullYear() + &#39;&#39;,
310
+ M = date.getMonth() + 1,
311
+ D = date.getDate(),
312
+ H = date.getHours(),
313
+ m = date.getMinutes(),
314
+ s = date.getSeconds();
315
+ return formater.replace(/YYYY|yyyy/g,Y)
316
+ .replace(/YY|yy/g,Y.substr(2,2))
317
+ .replace(/MM/g,(M&lt;10?&#39;0&#39;:&#39;&#39;) + M)
318
+ .replace(/DD/g,(D&lt;10?&#39;0&#39;:&#39;&#39;) + D)
319
+ .replace(/HH|hh/g,(H&lt;10?&#39;0&#39;:&#39;&#39;) + H)
320
+ .replace(/mm/g,(m&lt;10?&#39;0&#39;:&#39;&#39;) + m)
321
+ .replace(/ss/g,(s&lt;10?&#39;0&#39;:&#39;&#39;) + s)
322
+ &#125;
323
+ // dateFormater(&#39;YYYY-MM-DD HH:mm&#39;, t) ==&gt; 2019-06-26 18:30// dateFormater(&#39;YYYYMMDDHHmm&#39;, t) ==&gt; 201906261830
324
+ </code></pre>
325
+ <h2 id="29、dateStrForma:将指定字符串由一种时间格式转化为另一种"><a href="#29、dateStrForma:将指定字符串由一种时间格式转化为另一种" class="headerlink" title="29、dateStrForma:将指定字符串由一种时间格式转化为另一种"></a>29、dateStrForma:将指定字符串由一种时间格式转化为另一种</h2><p>from的格式应对应str的位置</p>
326
+ <pre><code>function dateStrForma(str, from, to)&#123;
327
+ //&#39;20190626&#39;&#39;YYYYMMDD&#39;&#39;YYYY年MM月DD日&#39;
328
+ str += &#39;&#39;
329
+ let Y = &#39;&#39;if(~(Y = from.indexOf(&#39;YYYY&#39;)))&#123;
330
+ Y = str.substr(Y, 4)
331
+ to = to.replace(/YYYY|yyyy/g,Y)
332
+ &#125;elseif(~(Y = from.indexOf(&#39;YY&#39;)))&#123;
333
+ Y = str.substr(Y, 2)
334
+ to = to.replace(/YY|yy/g,Y)
335
+ &#125;
336
+
337
+ let k,i
338
+ [&#39;M&#39;,&#39;D&#39;,&#39;H&#39;,&#39;h&#39;,&#39;m&#39;,&#39;s&#39;].forEach(s =&gt;&#123;
339
+ i = from.indexOf(s+s)
340
+ k = ~i ? str.substr(i, 2) : &#39;&#39;
341
+ to = to.replace(s+s, k)
342
+ &#125;)
343
+ return to
344
+ &#125;
345
+ // dateStrForma(&#39;20190626&#39;, &#39;YYYYMMDD&#39;, &#39;YYYY年MM月DD日&#39;) ==&gt;2019年06月26日
346
+ // dateStrForma(&#39;121220190626&#39;, &#39;----YYYYMMDD&#39;, &#39;YYYY年MM月DD日&#39;) ==&gt;2019年06月26日
347
+ // dateStrForma(&#39;2019年06月26日&#39;, &#39;YYYY年MM月DD日&#39;, &#39;YYYYMMDD&#39;) ==&gt;20190626
348
+
349
+ // 一般的也可以使用正则来实现
350
+ //&#39;2019年06月26日&#39;.replace(/(\d&#123;4&#125;)年(\d&#123;2&#125;)月(\d&#123;2&#125;)日/, &#39;$1-$2-$3&#39;) ==&gt;2019-06-26
351
+ </code></pre>
352
+ <h2 id="30、getPropByPath:根据字符串路径获取对象属性-‘obj-0-count’"><a href="#30、getPropByPath:根据字符串路径获取对象属性-‘obj-0-count’" class="headerlink" title="30、getPropByPath:根据字符串路径获取对象属性 : ‘obj[0].count’"></a>30、getPropByPath:根据字符串路径获取对象属性 : ‘obj[0].count’</h2><pre><code>functiongetPropByPath(obj, path, strict) &#123;
353
+ let tempObj = obj;
354
+ path = path.replace(/\[(\w+)\]/g, &#39;.$1&#39;); //将[0]转化为.0
355
+ path = path.replace(/^\./, &#39;&#39;); //去除开头的.let keyArr = path.split(&#39;.&#39;); //根据.切割let i = 0;
356
+ for (let len = keyArr.length; i &lt; len - 1; ++i) &#123;
357
+ if (!tempObj &amp;&amp; !strict) break;
358
+ let key = keyArr[i];
359
+ if (key in tempObj) &#123;
360
+ tempObj = tempObj[key];
361
+ &#125; else &#123;
362
+ if (strict) &#123;//开启严格模式,没找到对应key值,抛出错误thrownewError(&#39;please transfer a valid prop path to form item!&#39;);
363
+ &#125;
364
+ break;
365
+ &#125;
366
+ &#125;
367
+ return &#123;
368
+ o: tempObj, //原始数据
369
+ k: keyArr[i], //key值
370
+ v: tempObj ? tempObj[keyArr[i]] : null// key值对应的值
371
+ &#125;;
372
+ &#125;;
373
+ </code></pre>
374
+ <h2 id="31、GetUrlParam:获取Url参数,返回一个对象"><a href="#31、GetUrlParam:获取Url参数,返回一个对象" class="headerlink" title="31、GetUrlParam:获取Url参数,返回一个对象"></a>31、GetUrlParam:获取Url参数,返回一个对象</h2><pre><code>functionGetUrlParam()&#123;
375
+ let url = document.location.toString();
376
+ let arrObj = url.split(&quot;?&quot;);
377
+ let params = Object.create(null)
378
+ if (arrObj.length &gt; 1)&#123;
379
+ arrObj = arrObj[1].split(&quot;&amp;&quot;);
380
+ arrObj.forEach(item=&gt;&#123;
381
+ item = item.split(&quot;=&quot;);
382
+ params[item[0]] = item[1]
383
+ &#125;)
384
+ &#125;
385
+ return params;
386
+ &#125;
387
+ // ?a=1&amp;b=2&amp;c=3 ==&gt; &#123;a: &quot;1&quot;, b: &quot;2&quot;, c: &quot;3&quot;&#125;
388
+ </code></pre>
389
+ <h2 id="32、downloadFile:base64数据导出文件,文件下载"><a href="#32、downloadFile:base64数据导出文件,文件下载" class="headerlink" title="32、downloadFile:base64数据导出文件,文件下载"></a>32、downloadFile:base64数据导出文件,文件下载</h2><pre><code>functiondownloadFile(filename, data)&#123;
390
+ let DownloadLink = document.createElement(&#39;a&#39;);
391
+
392
+ if ( DownloadLink )&#123;
393
+ document.body.appendChild(DownloadLink);
394
+ DownloadLink.style = &#39;display: none&#39;;
395
+ DownloadLink.download = filename;
396
+ DownloadLink.href = data;
397
+
398
+ if ( document.createEvent )&#123;
399
+ let DownloadEvt = document.createEvent(&#39;MouseEvents&#39;);
400
+
401
+ DownloadEvt.initEvent(&#39;click&#39;, true, false);
402
+ DownloadLink.dispatchEvent(DownloadEvt);
403
+ &#125;
404
+ elseif ( document.createEventObject )
405
+ DownloadLink.fireEvent(&#39;onclick&#39;);
406
+ elseif (typeof DownloadLink.onclick == &#39;function&#39; )
407
+ DownloadLink.onclick();
408
+
409
+ document.body.removeChild(DownloadLink);
410
+ &#125;
411
+ &#125;
412
+ </code></pre>
413
+ <h2 id="33、toFullScreen:全屏"><a href="#33、toFullScreen:全屏" class="headerlink" title="33、toFullScreen:全屏"></a>33、toFullScreen:全屏</h2><pre><code>functiontoFullScreen()&#123;
414
+ let el = document.documentElement;
415
+ let rfs = el.requestFullScreen || el.webkitRequestFullScreen || el.mozRequestFullScreen || el.msRequestFullScreen;
416
+
417
+ //typeof rfs != &quot;undefined&quot; &amp;&amp; rfsif (rfs) &#123;
418
+ rfs.call(el);
419
+ &#125;elseif (typeofwindow.ActiveXObject !== &quot;undefined&quot;) &#123;
420
+ //for IE,这里其实就是模拟了按下键盘的F11,使浏览器全屏let wscript = new ActiveXObject(&quot;WScript.Shell&quot;);
421
+ if (wscript != null) &#123;
422
+ wscript.SendKeys(&quot;&#123;F11&#125;&quot;);
423
+ &#125;
424
+ &#125;else&#123;
425
+ alert(&quot;浏览器不支持全屏&quot;);
426
+ &#125;
427
+ &#125;
428
+ </code></pre>
429
+ <h2 id="34、exitFullscreen:退出全屏"><a href="#34、exitFullscreen:退出全屏" class="headerlink" title="34、exitFullscreen:退出全屏"></a>34、exitFullscreen:退出全屏</h2><pre><code>functionexitFullscreen()&#123;
430
+ let el = parent.document;
431
+ let cfs = el.cancelFullScreen || el.webkitCancelFullScreen || el.mozCancelFullScreen || el.exitFullScreen;
432
+
433
+ //typeof cfs != &quot;undefined&quot; &amp;&amp; cfsif (cfs) &#123;
434
+ cfs.call(el);
435
+ &#125;elseif (typeofwindow.ActiveXObject !== &quot;undefined&quot;) &#123;
436
+ //for IE,这里和fullScreen相同,模拟按下F11键退出全屏let wscript = new ActiveXObject(&quot;WScript.Shell&quot;);
437
+ if (wscript != null) &#123;
438
+ wscript.SendKeys(&quot;&#123;F11&#125;&quot;);
439
+ &#125;
440
+ &#125;else&#123;
441
+ alert(&quot;切换失败,可尝试Esc退出&quot;)
442
+ &#125;
443
+ &#125;
444
+ </code></pre>
445
+ <h2 id="35、requestAnimationFrame:window动画"><a href="#35、requestAnimationFrame:window动画" class="headerlink" title="35、requestAnimationFrame:window动画"></a>35、requestAnimationFrame:window动画</h2><pre><code>window.requestAnimationFrame = window.requestAnimationFrame ||
446
+ window.webkitRequestAnimationFrame ||
447
+ window.mozRequestAnimationFrame ||
448
+ window.msRequestAnimationFrame ||
449
+ window.oRequestAnimationFrame ||
450
+ function (callback) &#123;
451
+ //为了使setTimteout的尽可能的接近每秒60帧的效果window.setTimeout(callback, 1000 / 60);
452
+ &#125;;
453
+
454
+ window.cancelAnimationFrame = window.cancelAnimationFrame ||
455
+ Window.webkitCancelAnimationFrame ||
456
+ window.mozCancelAnimationFrame ||
457
+ window.msCancelAnimationFrame ||
458
+ window.oCancelAnimationFrame ||
459
+ function (id) &#123;
460
+ //为了使setTimteout的尽可能的接近每秒60帧的效果window.clearTimeout(id);
461
+ &#125;
462
+ </code></pre>
463
+ <h2 id="36、-isNaN:检查数据是否是非数字值"><a href="#36、-isNaN:检查数据是否是非数字值" class="headerlink" title="36、_isNaN:检查数据是否是非数字值"></a>36、_isNaN:检查数据是否是非数字值</h2><p>原生的isNaN会把参数转换成数字(valueof),而null、true、false以及长度小于等于1的数组(元素为非NaN数据)会被转换成数字,这不是我想要的。Symbol类型的数据不具有valueof接口,所以isNaN会抛出错误,这里放在后面,可避免错误</p>
464
+ <pre><code>function_isNaN(v)&#123;
465
+ return !(typeof v === &#39;string&#39; || typeof v === &#39;number&#39;) || isNaN(v)
466
+ &#125;
467
+ </code></pre>
468
+ <h2 id="37、max:求取数组中非NaN数据中的最大值"><a href="#37、max:求取数组中非NaN数据中的最大值" class="headerlink" title="37、max:求取数组中非NaN数据中的最大值"></a>37、max:求取数组中非NaN数据中的最大值</h2><pre><code>functionmax(arr)&#123;
469
+ arr = arr.filter(item =&gt; !_isNaN(item))
470
+ return arr.length ? Math.max.apply(null, arr) : undefined
471
+ &#125;
472
+ //max([1, 2, &#39;11&#39;, null, &#39;fdf&#39;, []]) ==&gt; 11
473
+ </code></pre>
474
+ <h2 id="38、min:求取数组中非NaN数据中的最小值"><a href="#38、min:求取数组中非NaN数据中的最小值" class="headerlink" title="38、min:求取数组中非NaN数据中的最小值"></a>38、min:求取数组中非NaN数据中的最小值</h2><pre><code>functionmin(arr)&#123;
475
+ arr = arr.filter(item =&gt; !_isNaN(item))
476
+ return arr.length ? Math.min.apply(null, arr) : undefined
477
+ &#125;
478
+ //min([1, 2, &#39;11&#39;, null, &#39;fdf&#39;, []]) ==&gt; 1
479
+ </code></pre>
480
+ <h2 id="39、random:返回一个lower-upper之间的随机数"><a href="#39、random:返回一个lower-upper之间的随机数" class="headerlink" title="39、random:返回一个lower - upper之间的随机数"></a>39、random:返回一个lower - upper之间的随机数</h2><p>lower、upper无论正负与大小,但必须是非NaN的数据</p>
481
+ <pre><code>function random(lower, upper)&#123;
482
+ lower = +lower || 0upper = +upper || 0return Math.random() * (upper - lower) + lower;
483
+ &#125;
484
+ //random(0, 0.5) ==&gt; 0.3567039135734613//random(2, 1) ===&gt; 1.6718418553475423//random(-2, -1) ==&gt; -1.4474325452361945
485
+ </code></pre>
486
+ <h2 id="40、Object-keys:返回一个由一个给定对象的自身可枚举属性组成的数组"><a href="#40、Object-keys:返回一个由一个给定对象的自身可枚举属性组成的数组" class="headerlink" title="40、Object.keys:返回一个由一个给定对象的自身可枚举属性组成的数组"></a>40、Object.keys:返回一个由一个给定对象的自身可枚举属性组成的数组</h2><pre><code>Object.keys = Object.keys || function keys(object) &#123;
487
+ if(object===null||object===undefined)&#123;
488
+ thrownewTypeError(&#39;Cannot convert undefined or null to object&#39;);
489
+ &#125;
490
+ let result = []
491
+ if(isArrayLike(object) ||isPlainObject(object))&#123;
492
+ for (let key in object) &#123;
493
+ object.hasOwnProperty(key) &amp;&amp; ( result.push(key) )
494
+ &#125;
495
+ &#125;
496
+ return result
497
+ &#125;
498
+ </code></pre>
499
+ <h2 id="41、Object-values:返回一个给定对象自身的所有可枚举属性值的数组"><a href="#41、Object-values:返回一个给定对象自身的所有可枚举属性值的数组" class="headerlink" title="41、Object.values:返回一个给定对象自身的所有可枚举属性值的数组"></a>41、Object.values:返回一个给定对象自身的所有可枚举属性值的数组</h2><pre><code>Object.values = Object.values || function values(object) &#123;
500
+ if(object === null || object === undefined)&#123;
501
+ thrownew TypeError(&#39;Cannot convert undefined or null to object&#39;);
502
+ &#125;
503
+ let result = []
504
+ if(isArrayLike(object) || isPlainObject(object))&#123;
505
+ for (let key inobject) &#123;
506
+ object.hasOwnProperty(key) &amp;&amp; ( result.push(object[key]) )
507
+ &#125;
508
+ &#125;
509
+ return result
510
+ &#125;
511
+ </code></pre>
512
+ <h2 id="42、arr-fill:使用-value-值来填充-array,从start位置开始-到end位置结束(但不包含end位置),返回原数组"><a href="#42、arr-fill:使用-value-值来填充-array,从start位置开始-到end位置结束(但不包含end位置),返回原数组" class="headerlink" title="42、arr.fill:使用 value 值来填充 array,从start位置开始, 到end位置结束(但不包含end位置),返回原数组"></a>42、arr.fill:使用 value 值来填充 array,从start位置开始, 到end位置结束(但不包含end位置),返回原数组</h2><pre><code>Array.prototype.fill = Array.prototype.fill || functionfill(value, start, end) &#123;
513
+ let ctx = this
514
+ let length = ctx.length;
515
+
516
+ start = parseInt(start)
517
+ if(isNaN(start))&#123;
518
+ start = 0
519
+ &#125;elseif (start &lt; 0) &#123;
520
+ start = -start &gt; length ? 0 : (length + start);
521
+ &#125;
522
+
523
+ end = parseInt(end)
524
+ if(isNaN(end) || end &gt; length)&#123;
525
+ end = length
526
+ &#125;elseif (end &lt; 0) &#123;
527
+ end += length;
528
+ &#125;
529
+
530
+ while (start &lt; end) &#123;
531
+ ctx[start++] = value;
532
+ &#125;
533
+ return ctx;
534
+ &#125;
535
+ //Array(3).fill(2) ===&gt; [2, 2, 2]
536
+ </code></pre>
537
+ <h2 id="43、arr-includes:用来判断一个数组是否包含一个指定的值,如果是返回-true,否则false,可指定开始查询的位置"><a href="#43、arr-includes:用来判断一个数组是否包含一个指定的值,如果是返回-true,否则false,可指定开始查询的位置" class="headerlink" title="43、arr.includes:用来判断一个数组是否包含一个指定的值,如果是返回 true,否则false,可指定开始查询的位置"></a>43、arr.includes:用来判断一个数组是否包含一个指定的值,如果是返回 true,否则false,可指定开始查询的位置</h2><pre><code>Array.prototype.includes = Array.prototype.includes || functionincludes(value, start)&#123;
538
+ let ctx = thislet length = ctx.length;
539
+
540
+ start = parseInt(start)
541
+ if(isNaN(start))&#123;
542
+ start = 0
543
+ &#125;elseif (start &lt; 0) &#123;
544
+ start = -start &gt; length ? 0 : (length + start);
545
+ &#125;
546
+
547
+ let index = ctx.indexOf(value)
548
+
549
+ return index &gt;= start;
550
+ &#125;
551
+ </code></pre>
552
+ <h2 id="44、arr-find:返回数组中通过测试(函数fn内判断)的第一个元素的值"><a href="#44、arr-find:返回数组中通过测试(函数fn内判断)的第一个元素的值" class="headerlink" title="44、arr.find:返回数组中通过测试(函数fn内判断)的第一个元素的值"></a>44、arr.find:返回数组中通过测试(函数fn内判断)的第一个元素的值</h2><pre><code>Array.prototype.find = Array.prototype.find || functionfind(fn, ctx)&#123;
553
+ fn = fn.bind(ctx)
554
+
555
+ let result;
556
+ this.some((value, index, arr), thisValue) =&gt; &#123;
557
+ return fn(value, index, arr) ? (result = value, true) : false
558
+ &#125;)
559
+
560
+ return result
561
+ &#125;
562
+ </code></pre>
563
+ <h2 id="45、arr-findIndex-:返回数组中通过测试(函数fn内判断)的第一个元素的下标"><a href="#45、arr-findIndex-:返回数组中通过测试(函数fn内判断)的第一个元素的下标" class="headerlink" title="45、arr.findIndex :返回数组中通过测试(函数fn内判断)的第一个元素的下标"></a>45、arr.findIndex :返回数组中通过测试(函数fn内判断)的第一个元素的下标</h2><pre><code>Array.prototype.findIndex = Array.prototype.findIndex || functionfindIndex(fn, ctx)&#123;
564
+ fn = fn.bind(ctx)
565
+
566
+ let result;
567
+ this.some((value, index, arr), thisValue) =&gt; &#123;
568
+ return fn(value, index, arr) ? (result = index, true) : false
569
+ &#125;)
570
+
571
+ return result
572
+ &#125;
573
+ </code></pre>
574
+ <h2 id="46、performance-timing:利用performance-timing进行性能分析"><a href="#46、performance-timing:利用performance-timing进行性能分析" class="headerlink" title="46、performance.timing:利用performance.timing进行性能分析"></a>46、performance.timing:利用performance.timing进行性能分析</h2><pre><code>window.onload = function()&#123;
575
+ setTimeout(function()&#123;
576
+ let t = performance.timing
577
+ console.log(&#39;DNS查询耗时 :&#39; + (t.domainLookupEnd - t.domainLookupStart).toFixed(0))
578
+ console.log(&#39;TCP链接耗时 :&#39; + (t.connectEnd - t.connectStart).toFixed(0))
579
+ console.log(&#39;request请求耗时 :&#39; + (t.responseEnd - t.responseStart).toFixed(0))
580
+ console.log(&#39;解析dom树耗时 :&#39; + (t.domComplete - t.domInteractive).toFixed(0))
581
+ console.log(&#39;白屏时间 :&#39; + (t.responseStart - t.navigationStart).toFixed(0))
582
+ console.log(&#39;domready时间 :&#39; + (t.domContentLoadedEventEnd - t.navigationStart).toFixed(0))
583
+ console.log(&#39;onload时间 :&#39; + (t.loadEventEnd - t.navigationStart).toFixed(0))
584
+
585
+ if(t = performance.memory)&#123;
586
+ console.log(&#39;js内存使用占比 :&#39; + (t.usedJSHeapSize / t.totalJSHeapSize * 100).toFixed(2) + &#39;%&#39;)
587
+ &#125;
588
+ &#125;)
589
+ &#125;
590
+ </code></pre>
591
+ <h2 id="47、禁止某些键盘事件"><a href="#47、禁止某些键盘事件" class="headerlink" title="47、禁止某些键盘事件"></a>47、禁止某些键盘事件</h2><pre><code>document.addEventListener(&#39;keydown&#39;, function(event)&#123;
592
+ return !(
593
+ 112 == event.keyCode || //F1123 == event.keyCode || //F12event.ctrlKey &amp;&amp; 82 == event.keyCode || //ctrl + Revent.ctrlKey &amp;&amp; 78 == event.keyCode || //ctrl + Nevent.shiftKey &amp;&amp; 121 == event.keyCode || //shift + F10event.altKey &amp;&amp; 115 == event.keyCode || //alt + F4&quot;A&quot; == event.srcElement.tagName &amp;&amp; event.shiftKey //shift + 点击a标签
594
+ ) || (event.returnValue = false)
595
+ &#125;);
596
+ </code></pre>
597
+ <h2 id="48、禁止右键、选择、复制"><a href="#48、禁止右键、选择、复制" class="headerlink" title="48、禁止右键、选择、复制"></a>48、禁止右键、选择、复制</h2><pre><code>[&#39;contextmenu&#39;, &#39;selectstart&#39;, &#39;copy&#39;].forEach(function(ev)&#123;
598
+ document.addEventListener(ev, function(event)&#123;
599
+ return event.returnValue = false
600
+ &#125;)
601
+ &#125;);
602
+ </code></pre>
603
+ <p>github地址:<a target="_blank" rel="noopener" href="https://github.com/hfhan/tools">https://github.com/hfhan/tools</a><a target="_blank" rel="noopener" href="https://github.com/hfhan/tools">https://github.com/hfhan/tools</a></p>
604
+ </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/64051.html">https://xuehuayu.cn/article/64051.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/38530.html">Webpack 是怎样运行的?</a><a class="next" href="/article/419.html">ES6,ES7,ES8,ES9,ES10新特性一览</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
605
+ const serverURL = origin.includes('cainiaoblog') ? 'https://cmts.cainiaoblog.cn' : 'https://cmts.xuehuayu.cn'
606
+ const locale = {
607
+ placeholder: '请正确填写昵称和邮箱,方便接收回复通知~',
608
+ sofa: '沙发空缺中,还不快抢~',
609
+ };
610
+ Waline.init({
611
+ el: '#vcomment',
612
+ serverURL: serverURL,
613
+ pageSize: '20',
614
+ visitor: true, // 阅读量统计
615
+ requiredMeta: ['nick', 'mail'],
616
+ emoji: [
617
+ 'https://cdn.jsdelivr.net/gh/walinejs/emojis@1.0.0/weibo',
618
+ 'https://cdn.jsdelivr.net/gh/walinejs/emojis@1.0.0/qq',
619
+ 'https://cdn.jsdelivr.net/gh/walinejs/emojis@1.0.0/tw-emoji',
620
+ ],
621
+ locale,
622
+ pageview: true
623
+ })
624
+ </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() {
625
+ var val = $(this).val()
626
+ 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>'
627
+ 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>'
628
+ 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>'
629
+
630
+ if (val === 'self') {
631
+ $('#search').html(self)
632
+ var search_path = 'search.xml';
633
+ if (search_path.length == 0) {
634
+ search_path = 'search.xml';
635
+ }
636
+ var path = 'https://cdn.staticaly.com/gh/npljy/npljy.github.io/main/' + search_path;
637
+ searchFunc(path, 'local-search-input', 'local-search-result');
638
+ } else if (val === 'baidu') {
639
+ $('#search').html(baidu)
640
+ } else if (val === 'google') {
641
+ $('#search').html(google)
642
+ }
643
+ })</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(){
644
+ var cnb =window.location.origin.indexOf('cainiaoblog') !==-1
645
+ if (cnb) {
646
+ var gxba =document.getElementById('gxba')
647
+ var gaba =document.getElementById('gaba')
648
+ var gabaLink =document.getElementById('gaba-link')
649
+ gxba.innerText ='京ICP备20007647号-1'
650
+ gaba.innerText ='京公网安备 11010802031254号'
651
+ gabaLink.setAttribute('href','http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=11010802031254')
652
+ }
653
+ })()</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>