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,350 @@
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>你不知道的 JSON.stringify() 的威力 | 前端壹菜鸟</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">你不知道的 JSON.stringify() 的威力</h1><div class="post-meta"><span class="date">2019-12-13</span><span> | </span><span class="tag"><a href="/tags/%E8%BD%AC%E8%BD%BD/">转载 </a></span><span> | </span><span class="category"><a href="/categories/%E5%89%8D%E7%AB%AF/">前端 </a></span><span id="busuanzi_container_page_pv"> | <span id="busuanzi_value_page_pv"><i class="fa fa-spinner"></i></span><span> 阅读</span></span><span class="post-time"><span class="post-meta-item-text"> | </span><span class="post-meta-item-icon"><i class="fa fa-keyboard-o"></i><span class="post-count"> 4.1k</span><span class="post-meta-item-text"> 字</span></span></span><span class="post-time"> | <span class="post-meta-item-icon"><i class="fa fa-hourglass-half"></i><span class="post-count"> 17</span><span class="post-meta-item-text"> 分钟</span></span></span></div><a class="disqus-comment-count" href="/article/59095.html#vcomment"><span class="waline-comment-count" data-path="/article/59095.html"></span><span> 条评论</span></a><div class="post-content"><p><code>原文地址:https://github.com/NieZhuZhu/Blog/issues/1</code></p>
20
+ <span id="more"></span>
21
+
22
+ <p><a target="_blank" rel="noopener" href="https://user-images.githubusercontent.com/44939961/70389981-692bf780-1a01-11ea-8d30-08f8daf73af3.png"><img src="https://user-images.githubusercontent.com/44939961/70389981-692bf780-1a01-11ea-8d30-08f8daf73af3.png" alt="xuehuayu.cn"></a></p>
23
+ <h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><p>其实有很多有用的东西,当时学习了,也记住了,但是时间久了就是记不住,所以导致在日常开发中总是想不起来原来这个东西可以这么用,而去选择了更加复杂和麻烦的方式。其实我们日常学习的知识就是拿来用的,即使你今天把知识点背下来了,没有去思考这个知识点我们可以用来干嘛,不需要几天就会慢慢地忘掉。所以今天我们来了解一下在日常学习时你遗漏掉或者忘掉或者没有思考过的你不知道的 <code>JSON.stringify()</code> 的威力。</p>
24
+ <h1 id="通过需求学习JSON-stringify"><a href="#通过需求学习JSON-stringify" class="headerlink" title="通过需求学习JSON.stringify()"></a>通过需求学习<code>JSON.stringify()</code></h1><p>首先我们在开发的过程当中遇到这样一个处理数据的需求</p>
25
+ <pre><code>consttodayILearn= &#123;
26
+ _id:1,
27
+ content:&#39;今天学习 JSON.stringify(),我很开心!&#39;,
28
+ created_at:&#39;Mon Nov 25 2019 14:03:55 GMT+0800 (中国标准时间)&#39;,
29
+ updated_at:&#39;Mon Nov 25 2019 16:03:55 GMT+0800 (中国标准时间)&#39;
30
+ &#125;
31
+ </code></pre>
32
+ <p>我们需要将上面这个对象处理成下面这个对象</p>
33
+ <pre><code>consttodayILearn= &#123;
34
+ id:1,
35
+ content:&#39;今天学习 JSON.stringify(),我很开心!&#39;,
36
+ createdAt:&#39;Mon Nov 25 2019 14:03:55 GMT+0800 (中国标准时间)&#39;,
37
+ updatedAt:&#39;Mon Nov 25 2019 16:03:55 GMT+0800 (中国标准时间)&#39;
38
+ &#125;
39
+ </code></pre>
40
+ <p>也就是在不改变属性的值的前提下,将对象属性修改一下。 把<code>_id </code> 改成 <code>id</code>,把 <code>updated_at</code> 改成 <code>updatedAt</code>,把 <code>created_at</code> 改成 <code>createdAt</code>。我们现在通过这个小小的需求来见识一下 <code>JSON.stringify()</code> 的强大吧。</p>
41
+ <p>首先要解决这个问题我们有很多的解决方式,我们先提供两种不优雅的解决方案:</p>
42
+ <ul>
43
+ <li><p><strong>方案一:一次遍历+多声明一个变量</strong></p>
44
+ <p> &#x2F;&#x2F; 多一个变量存储consttodayILearnTemp&#x3D; {};<br> for (const [key, value] ofObject.entries(todayILearn)) {<br>if (key &#x3D;&#x3D;&#x3D;”_id”) todayILearnTemp[“id”] &#x3D; value;<br>elseif (key &#x3D;&#x3D;&#x3D;”created_at”) todayILearnTemp[“createdAt”] &#x3D; value;<br>elseif (key &#x3D;&#x3D;&#x3D;”updatedAt”) todayILearnTemp[“updatedAt”] &#x3D; value;<br>else todayILearnTemp[key] &#x3D; value;<br> }<br> console.log(todayILearnTemp);<br> &#x2F;&#x2F; 结果:&#x2F;&#x2F; { id: 1,&#x2F;&#x2F; content: ‘今天学习 JSON.stringify(),我很开心!’,&#x2F;&#x2F; createdAt: ‘Mon Nov 25 2019 14:03:55 GMT+0800 (中国标准时间)’,&#x2F;&#x2F; updated_at: ‘Mon Nov 25 2019 16:03:55 GMT+0800 (中国标准时间)’ &#x2F;&#x2F; }</p>
45
+ </li>
46
+ </ul>
47
+ <p>方案一完全没有问题可以实现。但是多声明了一个变量又加上一层循环并且还有很多的 <code>if``else</code> 语句,怎么都显得不太优雅。</p>
48
+ <ul>
49
+ <li><p><strong>方案二:暴力 <code>delete</code> 属性和增加属性</strong></p>
50
+ <p> &#x2F;&#x2F; 极致的暴力美学todayILearn.id&#x3D;todayILearn._id;<br> todayILearn.createdAt&#x3D;todayILearn.created_at;<br> todayILearn.updatedAt&#x3D;todayILearn.updated_at;<br> deletetodayILearn._id;<br> deletetodayILearn.created_at;<br> deletetodayILearn.updated_at;<br> console.log(todayILearn);<br> &#x2F;&#x2F; 太暴力😢&#x2F;&#x2F;{ &#x2F;&#x2F; content: ‘今天学习 JSON.stringify(),我很开心!’,&#x2F;&#x2F; id: 1,&#x2F;&#x2F; createdAt: ‘Mon Nov 25 2019 14:03:55 GMT+0800 (中国标准时间)’,&#x2F;&#x2F; updatedAt: ‘Mon Nov 25 2019 16:03:55 GMT+0800 (中国标准时间)’ &#x2F;&#x2F;}</p>
51
+ </li>
52
+ </ul>
53
+ <p>直接 delete 暴力解决太粗鲁了,而且有一个缺点,属性的顺序变了。</p>
54
+ <ul>
55
+ <li><p><strong>方案三:序列化+ <code>replace</code> 美学典范</strong></p>
56
+ <p> constmapObj&#x3D; {<br>_id:”id”,<br>created_at:”createdAt”,<br>updated_at:”updatedAt”<br> };<br> JSON.parse(<br>JSON.stringify(todayILearn).replace(<br> &#x2F;_id|created_at|updated_at&#x2F;gi,<br> matched&#x3D;&gt; mapObj[matched])<br> )<br> &#x2F;&#x2F; { &#x2F;&#x2F; id: 1,&#x2F;&#x2F; content: ‘今天学习 JSON.stringify(),我很开心!’,&#x2F;&#x2F; createdAt: ‘Mon Nov 25 2019 14:03:55 GMT+0800 (中国标准时间)’,&#x2F;&#x2F; updatedAt: ‘Mon Nov 25 2019 16:03:55 GMT+0800 (中国标准时间)’ &#x2F;&#x2F; }</p>
57
+ </li>
58
+ </ul>
59
+ <p>瞬间感觉非常优雅和舒服,有木有!如果你这样写,你导师给你 review 代码的时候,你导师肯定会夸赞你的😁。</p>
60
+ <p>接下来,正片开始,我们今天将系统的学习或者说是复习一遍 <code>JSON.stringify</code> 的基础知识,让我们在日常开发中更加的游刃有余。</p>
61
+ <hr>
62
+ <p><a target="_blank" rel="noopener" href="https://user-images.githubusercontent.com/44939961/70389976-5a454500-1a01-11ea-81bd-8c12208fbd0e.png"><img src="https://user-images.githubusercontent.com/44939961/70389976-5a454500-1a01-11ea-81bd-8c12208fbd0e.png" alt="image"></a></p>
63
+ <h1 id="温故知新之非常简单的-JSON-stringify-九大特性"><a href="#温故知新之非常简单的-JSON-stringify-九大特性" class="headerlink" title="温故知新之非常简单的 JSON.stringify() 九大特性"></a>温故知新之非常简单的 <code>JSON.stringify()</code> 九大特性</h1><h2 id="JSON-stringify-第一大特性"><a href="#JSON-stringify-第一大特性" class="headerlink" title="JSON.stringify() 第一大特性"></a><code>JSON.stringify() </code>第一大特性</h2><p><strong>对于 <code>undefined</code>、任意的函数以及 <code>symbol</code> 三个特殊的值分别作为对象属性的值、数组元素、单独的值时 <code>JSON.stringify() </code>将返回不同的结果。</strong></p>
64
+ <p>首先,我们来复习一下知识点,看一道非常简单的面试题目:请问下面代码会输出什么?</p>
65
+ <pre><code>constdata= &#123;
66
+ a:&quot;aaa&quot;,
67
+ b:undefined,
68
+ c:Symbol(&quot;dd&quot;),
69
+ fn:function() &#123;
70
+ return true;
71
+ &#125;
72
+ &#125;;
73
+ JSON.stringify(data); // 输出:?// &quot;&#123;&quot;a&quot;:&quot;aaa&quot;&#125;&quot;
74
+ </code></pre>
75
+ <p>很简单这道题目面试官主要考察的知识点是:</p>
76
+ <ul>
77
+ <li><code>undefined</code>、任意的函数以及 <code>symbol</code> 作为对象属性值时 <code>JSON.stringify()</code> 跳过(忽略)对它们进行序列化</li>
78
+ </ul>
79
+ <p><strong>面试官追问</strong>:假设 <code>undefined</code>、任意的函数以及 <code>symbol</code> 值作为数组元素会是怎样呢?</p>
80
+ <pre><code>JSON.stringify([&quot;aaa&quot;, undefined, functionaa() &#123;
81
+ return true
82
+ &#125;, Symbol(&#39;dd&#39;)]) // 输出:?// &quot;[&quot;aaa&quot;,null,null,null]&quot;
83
+ </code></pre>
84
+ <p>知识点是:</p>
85
+ <ul>
86
+ <li><code>undefined</code>、任意的函数以及 <code>symbol</code> 作为数组元素值时,<code>JSON.stringify()</code> 将会将它们序列化为 <code>null</code></li>
87
+ </ul>
88
+ <p>我们再发挥动下脑筋,如果单独序列化这些值会是什么样的结果呢?</p>
89
+ <pre><code>JSON.stringify(functiona ()&#123;console.log(&#39;a&#39;)&#125;)
90
+ // undefinedJSON.stringify(undefined)
91
+ // undefinedJSON.stringify(Symbol(&#39;dd&#39;))
92
+ // undefined
93
+ </code></pre>
94
+ <p>单独转换的结果就是:</p>
95
+ <ul>
96
+ <li><code>undefined</code>、任意的函数以及 <code>symbol</code> 被 <code>JSON.stringify()</code> 作为单独的值进行序列化时都会返回 <code>undefined</code></li>
97
+ </ul>
98
+ <h3 id="JSON-stringify-第一大特性总结"><a href="#JSON-stringify-第一大特性总结" class="headerlink" title="JSON.stringify() 第一大特性总结"></a><code>JSON.stringify()</code> 第一大特性总结</h3><ul>
99
+ <li><p><code>undefined</code>、任意的函数以及 <code>symbol</code> 作为对象属性值时 <code>JSON.stringify()</code> 对跳过(忽略)它们进行序列化</p>
100
+ </li>
101
+ <li><p><code>undefined</code>、任意的函数以及 <code>symbol</code> 作为数组元素值时,<code>JSON.stringify()</code> 将会将它们序列化为 <code>null</code></p>
102
+ </li>
103
+ <li><p><code>undefined</code>、任意的函数以及 <code>symbol</code> 被 <code>JSON.stringify()</code> 作为单独的值进行序列化时,都会返回 <code>undefined</code></p>
104
+ </li>
105
+ </ul>
106
+ <h2 id="JSON-stringify-第二大特性"><a href="#JSON-stringify-第二大特性" class="headerlink" title="JSON.stringify() 第二大特性"></a><code>JSON.stringify()</code> 第二大特性</h2><p>也是在使用过程中必须要非常注意的一个点:</p>
107
+ <ul>
108
+ <li><p>非数组对象的属性不能保证以特定的顺序出现在序列化后的字符串中。</p>
109
+ <p> constdata&#x3D; {<br>a:”aaa”,<br>b:undefined,<br>c:Symbol(“dd”),<br>fn:function() {<br> return true;<br>},<br>d:”ddd”<br> };<br> JSON.stringify(data); &#x2F;&#x2F; 输出:?&#x2F;&#x2F; “{“a”:”aaa”,”d”:”ddd”}”JSON.stringify([“aaa”, undefined, functionaa() {<br> return true<br>}, Symbol(‘dd’),”eee”]) &#x2F;&#x2F; 输出:?&#x2F;&#x2F; “[“aaa”,null,null,null,”eee”]”</p>
110
+ </li>
111
+ </ul>
112
+ <p>正如我们在第一特性所说,<code>JSON.stringify()</code> 序列化时会忽略一些特殊的值,所以不能保证序列化后的字符串还是以特定的顺序出现(数组除外)。</p>
113
+ <h2 id="JSON-stringify-第三大特性"><a href="#JSON-stringify-第三大特性" class="headerlink" title="JSON.stringify() 第三大特性"></a><code>JSON.stringify()</code> 第三大特性</h2><ul>
114
+ <li><p>转换值如果有 <code>toJSON()</code> 函数,该函数返回什么值,序列化结果就是什么值,并且忽略其他属性的值。</p>
115
+ <p> JSON.stringify({<br> say:”hello JSON.stringify”,<br> toJSON:function() {<br> return”today i learn”;<br> }<br>})<br> &#x2F;&#x2F; “today i learn”</p>
116
+ </li>
117
+ </ul>
118
+ <h2 id="JSON-stringify-第四大特性"><a href="#JSON-stringify-第四大特性" class="headerlink" title="JSON.stringify() 第四大特性"></a><code>JSON.stringify() </code>第四大特性</h2><ul>
119
+ <li><p><code>JSON.stringify()</code> 将会正常序列化 <code>Date</code> 的值。</p>
120
+ <p> JSON.stringify({ now:newDate() });<br> &#x2F;&#x2F; “{“now”:”2019-12-08T07:42:11.973Z”}”</p>
121
+ </li>
122
+ </ul>
123
+ <p>实际上 <code>Date</code> 对象自己部署了 <code>toJSON()</code> 方法(同Date.toISOString()),因此 <code>Date</code> 对象会被当做字符串处理。</p>
124
+ <h2 id="JSON-stringify-第五大特性"><a href="#JSON-stringify-第五大特性" class="headerlink" title="JSON.stringify() 第五大特性"></a><code>JSON.stringify()</code> 第五大特性</h2><ul>
125
+ <li><code>NaN</code> 和 <code>Infinity</code> 格式的数值及 <code>null</code> 都会被当做 <code>null</code>。</li>
126
+ </ul>
127
+ <p>直接上代码:</p>
128
+ <pre><code>JSON.stringify(NaN)
129
+ // &quot;null&quot;JSON.stringify(null)
130
+ // &quot;null&quot;JSON.stringify(Infinity)
131
+ // &quot;null&quot;
132
+ </code></pre>
133
+ <h2 id="JSON-stringify-第六大特性"><a href="#JSON-stringify-第六大特性" class="headerlink" title="JSON.stringify() 第六大特性"></a><code>JSON.stringify()</code> 第六大特性</h2><p>关于基本类型的序列化:</p>
134
+ <ul>
135
+ <li><p>布尔值、数字、字符串的包装对象在序列化过程中会自动转换成对应的原始值。</p>
136
+ <p> JSON.stringify([newNumber(1), newString(“false”), newBoolean(false)]);<br> &#x2F;&#x2F; “[1,”false”,false]”</p>
137
+ </li>
138
+ </ul>
139
+ <h2 id="JSON-stringify-第七大特性"><a href="#JSON-stringify-第七大特性" class="headerlink" title="JSON.stringify() 第七大特性"></a><code>JSON.stringify()</code> 第七大特性</h2><p>关于对象属性的是否可枚举:</p>
140
+ <ul>
141
+ <li><p>其他类型的对象,包括 Map&#x2F;Set&#x2F;WeakMap&#x2F;WeakSet,仅会序列化可枚举的属性。</p>
142
+ <p> &#x2F;&#x2F; 不可枚举的属性默认会被忽略:JSON.stringify(<br> Object.create(<br> null,<br> {<br> x: { value:’json’, enumerable:false },<br> y: { value:’stringify’, enumerable:true }<br> }<br> )<br> );<br> &#x2F;&#x2F; “{“y”,”stringify”}”</p>
143
+ </li>
144
+ </ul>
145
+ <h2 id="JSON-stringify-第八大特性"><a href="#JSON-stringify-第八大特性" class="headerlink" title="JSON.stringify() 第八大特性"></a><code>JSON.stringify()</code> 第八大特性</h2><p>我们都知道实现深拷贝最简单粗暴的方式就是序列化:<code>JSON.parse(JSON.stringify())</code>,这个方式实现深拷贝会因为序列化的诸多特性导致诸多的坑点:比如现在我们要说的循环引用问题。</p>
146
+ <pre><code>// 对包含循环引用的对象(对象之间相互引用,形成无限循环)执行此方法,会抛出错误。 constobj= &#123;
147
+ name:&quot;loopObj&quot;
148
+ &#125;;
149
+ constloopObj= &#123;
150
+ obj
151
+ &#125;;
152
+ // 对象之间形成循环引用,形成闭环obj.loopObj= loopObj;
153
+ functiondeepClone(obj) &#123;
154
+ returnJSON.parse(JSON.stringify(obj));
155
+ &#125;
156
+ deepClone(obj)
157
+ /** VM44:9 Uncaught TypeError: Converting circular structure to JSON --&gt; starting at object with constructor &#39;Object&#39; | property &#39;loopObj&#39; -&gt; object with constructor &#39;Object&#39; --- property &#39;obj&#39; closes the circle at JSON.stringify (&lt;anonymous&gt;) at deepClone (&lt;anonymous&gt;:9:26) at &lt;anonymous&gt;:11:13*/
158
+ </code></pre>
159
+ <ul>
160
+ <li>对包含循环引用的对象(对象之间相互引用,形成无限循环)执行此方法,会抛出错误。</li>
161
+ </ul>
162
+ <p>这也就是为什么用序列化去实现深拷贝时,遇到循环引用的对象会抛出错误的原因。</p>
163
+ <h2 id="JSON-stringify-第九大特性"><a href="#JSON-stringify-第九大特性" class="headerlink" title="JSON.stringify() 第九大特性"></a><code>JSON.stringify()</code> 第九大特性</h2><p>最后,关于 <code>symbol</code> 属性还有一点要说的就是:</p>
164
+ <ul>
165
+ <li><p>所有以 <code>symbol</code> 为属性键的属性都会被完全忽略掉,即便 <code>replacer</code> 参数中强制指定包含了它们。</p>
166
+ <p> JSON.stringify({ [Symbol.for(“json”)]:”stringify” }, function(k, v) {<br> if (typeof k &#x3D;&#x3D;&#x3D;”symbol”) {<br> return v;<br> }<br>})<br> &#x2F;&#x2F; undefined</p>
167
+ </li>
168
+ </ul>
169
+ <p>关于 <code>replacer</code> 是什么呢,它是 <code>JSON.stringify()</code> 的第二个参数,我们比较少的会用到,所以很多时候我们会忘记 <code>JSON.stringify()</code> 第二个、第三个参数,场景不多,但是用的好的话会非常的方便,关于 <code>JSON.stringify()</code> 第九大特性的例子中对 <code>replacer</code> 参数不明白的同学先别急,其实很简单,我们马上就会在下面的学习中弄懂。</p>
170
+ <h1 id="枕典席文之-JSON-stringify-第二个参数和第三个参数"><a href="#枕典席文之-JSON-stringify-第二个参数和第三个参数" class="headerlink" title="枕典席文之 JSON.stringify() 第二个参数和第三个参数"></a>枕典席文之 <code>JSON.stringify()</code> 第二个参数和第三个参数</h1><h2 id="强大的第二个参数-replacer"><a href="#强大的第二个参数-replacer" class="headerlink" title="强大的第二个参数 replacer"></a>强大的第二个参数 <code>replacer</code></h2><p><code>replacer</code> 参数有两种形式,可以是一个函数或者一个数组。作为函数时,它有两个参数,键(key)和值(value),函数类似就是数组方法 <code>map</code>、<code>filter</code> 等方法的回调函数,对每一个属性值都会执行一次该函数。如果 <code>replacer</code> 是一个数组,数组的值代表将被序列化成 JSON 字符串的属性名。</p>
171
+ <h3 id="replacer-作为函数时"><a href="#replacer-作为函数时" class="headerlink" title="replacer 作为函数时"></a><code>replacer</code> 作为函数时</h3><h4 id="可以打破九大特性的大多数特性"><a href="#可以打破九大特性的大多数特性" class="headerlink" title="可以打破九大特性的大多数特性"></a>可以打破九大特性的大多数特性</h4><p>第二个参数<code>replacer</code> 非常强大, <code>replacer</code> 作为函数时,我们可以打破九大特性的大多数特性,我们直接来看代码吧。</p>
172
+ <pre><code>constdata= &#123;
173
+ a:&quot;aaa&quot;,
174
+ b:undefined,
175
+ c:Symbol(&quot;dd&quot;),
176
+ fn:function() &#123;
177
+ return true;
178
+ &#125;
179
+ &#125;;
180
+ // 不用 replacer 参数时JSON.stringify(data);
181
+
182
+ // &quot;&#123;&quot;a&quot;:&quot;aaa&quot;&#125;&quot;// 使用 replacer 参数作为函数时JSON.stringify(data, (key, value) =&gt; &#123;
183
+ switch (true) &#123;
184
+ casetypeof value ===&quot;undefined&quot;:
185
+ return&quot;undefined&quot;;
186
+ casetypeof value ===&quot;symbol&quot;:
187
+ returnvalue.toString();
188
+ casetypeof value ===&quot;function&quot;:
189
+ returnvalue.toString();
190
+ default:
191
+ break;
192
+ &#125;
193
+ return value;
194
+ &#125;)
195
+ // &quot;&#123;&quot;a&quot;:&quot;aaa&quot;,&quot;b&quot;:&quot;undefined&quot;,&quot;c&quot;:&quot;Symbol(dd)&quot;,&quot;fn&quot;:&quot;function() &#123;\n return true;\n &#125;&quot;&#125;&quot;
196
+ </code></pre>
197
+ <p>虽然使用 toString() 方法有点耍流氓的意思但是不得不说第二个参数很强大。</p>
198
+ <h4 id="传入-replacer-函数的第一个参数"><a href="#传入-replacer-函数的第一个参数" class="headerlink" title="传入 replacer 函数的第一个参数"></a>传入 <code>replacer</code> 函数的第一个参数</h4><p><strong>需要注意的是,replacer 被传入的函数时,第一个参数不是对象的第一个键值对,而是空字符串作为 key 值,value 值是整个对象的键值对:</strong></p>
199
+ <pre><code>constdata= &#123;
200
+ a:2,
201
+ b:3,
202
+ c:4,
203
+ d:5
204
+ &#125;;
205
+ JSON.stringify(data, (key, value) =&gt; &#123;
206
+ console.log(value);
207
+ return value;
208
+ &#125;)
209
+ // 第一个被传入 replacer 函数的是 &#123;&quot;&quot;:&#123;a: 2, b: 3, c: 4, d: 5&#125; &#125;// &#123;a: 2, b: 3, c: 4, d: 5&#125; // 2// 3// 4// 5
210
+ </code></pre>
211
+ <h4 id="实现-map-函数"><a href="#实现-map-函数" class="headerlink" title="实现 map 函数"></a>实现 <code>map</code> 函数</h4><p>我们还可以用它来手写实现一个对象的类似 map 的函数。</p>
212
+ <pre><code>// 实现一个 map 函数constdata= &#123;
213
+ a:2,
214
+ b:3,
215
+ c:4,
216
+ d:5
217
+ &#125;;
218
+ constobjMap= (obj, fn) =&gt; &#123;
219
+ if (typeof fn !==&quot;function&quot;) &#123;
220
+ thrownewTypeError(`$&#123;fn&#125; is not a function !`);
221
+ &#125;
222
+ returnJSON.parse(JSON.stringify(obj, fn));
223
+ &#125;;
224
+ objMap(data, (key, value) =&gt; &#123;
225
+ if (value %2===0) &#123;
226
+ return value /2;
227
+ &#125;
228
+ return value;
229
+ &#125;);
230
+ // &#123;a: 1, b: 3, c: 2, d: 5&#125;
231
+ </code></pre>
232
+ <h3 id="replacer-作为数组时"><a href="#replacer-作为数组时" class="headerlink" title="replacer 作为数组时"></a><code>replacer</code> 作为数组时</h3><p><code>replacer</code> 作为数组时,结果非常简单,数组的值就代表了将被序列化成 JSON 字符串的属性名。</p>
233
+ <pre><code>constjsonObj= &#123;
234
+ name:&quot;JSON.stringify&quot;,
235
+ params:&quot;obj,replacer,space&quot;
236
+ &#125;;
237
+
238
+ // 只保留 params 属性的值JSON.stringify(jsonObj, [&quot;params&quot;]);
239
+ // &quot;&#123;&quot;params&quot;:&quot;obj,replacer,space&quot;&#125;&quot;
240
+ </code></pre>
241
+ <h2 id="有意思却没啥用的第三个参数-space"><a href="#有意思却没啥用的第三个参数-space" class="headerlink" title="有意思却没啥用的第三个参数 space"></a>有意思却没啥用的第三个参数 <code>space</code></h2><p><code>space</code> 参数用来控制结果字符串里面的间距。首先看一个例子就是到这东西到底是干啥用的:</p>
242
+ <pre><code>consttiedan= &#123;
243
+ name:&quot;弹铁蛋同学&quot;,
244
+ describe:&quot;今天在学 JSON.stringify()&quot;,
245
+ emotion:&quot;like shit&quot;
246
+ &#125;;
247
+ JSON.stringify(tiedan, null, &quot;🐷&quot;);
248
+ // 接下来是输出结果// &quot;&#123;// 🐷&quot;name&quot;: &quot;弹铁蛋同学&quot;,// 🐷&quot;describe&quot;: &quot;今天在学 JSON.stringify()&quot;,// 🐷&quot;emotion&quot;: &quot;like shit&quot;// &#125;&quot;JSON.stringify(tiedan, null, 2);
249
+ // &quot;&#123;// &quot;name&quot;: &quot;弹铁蛋同学&quot;,// &quot;describe&quot;: &quot;今天在学 JSON.stringify()&quot;,// &quot;emotion&quot;: &quot;like shit&quot;// &#125;&quot;
250
+ </code></pre>
251
+ <p>上面代码一眼就能看出第三个参数的作用了,花里胡哨的,其实这个参数还是比较鸡肋的,除了好看没啥特别的用处。我们用 <code>\t</code>、 <code>\n</code> 等缩进能让输出更加格式化,更适于观看。</p>
252
+ <ul>
253
+ <li><p>如果是一个数字, 则在字符串化时每一级别会比上一级别缩进多这个数字值的空格(最多10个空格);</p>
254
+ </li>
255
+ <li><p>如果是一个字符串,则每一级别会比上一级别多缩进该字符串(或该字符串的前10个字符)。</p>
256
+ </li>
257
+ </ul>
258
+ <h1 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h1><h3 id="JSON-stringify-九大特性:"><a href="#JSON-stringify-九大特性:" class="headerlink" title="JSON.stringify() 九大特性:"></a><code>JSON.stringify()</code> 九大特性:</h3><p><strong>一、对于 <code>undefined</code>、任意的函数以及 <code>symbol</code> 三个特殊的值分别作为对象属性的值、数组元素、单独的值时的不同返回结果。</strong></p>
259
+ <ul>
260
+ <li><p><code>undefined</code>、任意的函数以及 <code>symbol</code> 作为对象属性值时 <code>JSON.stringify()</code> 对跳过(忽略)它们进行序列化</p>
261
+ </li>
262
+ <li><p><code>undefined</code>、任意的函数以及 <code>symbol</code> 作为数组元素值时,<code>JSON.stringify()</code> 将会将它们序列化为 <code>null</code></p>
263
+ </li>
264
+ <li><p><code>undefined</code>、任意的函数以及 <code>symbol</code> 被 <code>JSON.stringify()</code> 作为单独的值进行序列化时都会返回 <code>undefined</code></p>
265
+ </li>
266
+ </ul>
267
+ <p>二、<strong>非数组对象的属性不能保证以特定的顺序出现在序列化后的字符串中。</strong></p>
268
+ <p>三、<strong>转换值如果有 <code>toJSON()</code> 函数,该函数返回什么值,序列化结果就是什么值,并且忽略其他属性的值。</strong></p>
269
+ <p>四、**<code>JSON.stringify()</code> 将会正常序列化 <code>Date</code> 的值。**</p>
270
+ <p>五、**<code>NaN</code> 和 <code>Infinity</code> 格式的数值及 <code>null</code> 都会被当做 <code>null</code>。**</p>
271
+ <p>六、<strong>布尔值、数字、字符串的包装对象在序列化过程中会自动转换成对应的原始值。</strong></p>
272
+ <p>七、<strong>其他类型的对象,包括 Map&#x2F;Set&#x2F;WeakMap&#x2F;WeakSet,仅会序列化可枚举的属性。</strong></p>
273
+ <p>八、<strong>对包含循环引用的对象(对象之间相互引用,形成无限循环)执行此方法,会抛出错误。</strong></p>
274
+ <p>九、<strong>所有以 <code>symbol</code> 为属性键的属性都会被完全忽略掉,即便 <code>replacer</code> 参数中强制指定包含了它们。</strong></p>
275
+ <h3 id="JSON-stringify-第二个参数和第三个参数"><a href="#JSON-stringify-第二个参数和第三个参数" class="headerlink" title="JSON.stringify() 第二个参数和第三个参数"></a><code>JSON.stringify()</code> 第二个参数和第三个参数</h3><h4 id="强大的第二个参数:"><a href="#强大的第二个参数:" class="headerlink" title="强大的第二个参数:"></a>强大的第二个参数:</h4><ul>
276
+ <li>作为函数时,它有两个参数,键(key)和值(value),函数类似就是数组方法 <code>map</code>、<code>filter</code> 等方法的回调函数,对每一个属性值都会执行一次该函数(期间我们还简单实现过一个 <code>map</code> 函数)。</li>
277
+ <li>如果 <code>replacer</code> 是一个数组,数组的值代表将被序列化成 JSON 字符串的属性名。</li>
278
+ </ul>
279
+ <h4 id="华丽的第三个参数:"><a href="#华丽的第三个参数:" class="headerlink" title="华丽的第三个参数:"></a>华丽的第三个参数:</h4><ul>
280
+ <li><p>如果是一个数字, 则在字符串化时每一级别会比上一级别缩进多这个数字值的空格(最多10个空格)。</p>
281
+ </li>
282
+ <li><p>如果是一个字符串,则每一级别会比上一级别多缩进该字符串(或该字符串的前10个字符)。</p>
283
+ </li>
284
+ </ul>
285
+ <h4 id="注意:"><a href="#注意:" class="headerlink" title="注意:"></a>注意:</h4><p>第一个例子的方案三,有小伙伴提示说这个方案会有风险,确实是这样的(<strong>可能会把对象的值给替换掉</strong>)。大家慎用吧,大部分情况下这样使用是 ok 的。小伙伴们提供的第四种方案还是很不错的:</p>
286
+ <pre><code>consttodayILearn= &#123;
287
+ _id:1,
288
+ content:&#39;今天学习 JSON.stringify(),我很开心!&#39;,
289
+ created_at:&#39;Mon Nov 25 2019 14:03:55 GMT+0800 (中国标准时间)&#39;,
290
+ updated_at:&#39;Mon Nov 25 2019 16:03:55 GMT+0800 (中国标准时间)&#39;
291
+ &#125;
292
+ constmapObj= &#123;
293
+ _id:&quot;id&quot;,
294
+ created_at:&quot;createdAt&quot;,
295
+ updated_at:&quot;updatedAt&quot;
296
+ &#125;;
297
+ Object.fromEntries(Object.entries(todayILearn).map(([k, v]) =&gt; [mapObj[k]||k, v]))
298
+ // &#123; // id: 1,// content: &#39;今天学习 JSON.stringify(),我很开心!&#39;,// createdAt: &#39;Mon Nov 25 2019 14:03:55 GMT+0800 (中国标准时间)&#39;,// updatedAt: &#39;Mon Nov 25 2019 16:03:55 GMT+0800 (中国标准时间)&#39; // &#125;
299
+ </code></pre>
300
+ <h2 id="推荐阅读"><a href="#推荐阅读" class="headerlink" title="推荐阅读"></a>推荐阅读</h2><p><a target="_blank" rel="noopener" href="https://github.com/NieZhuZhu/Blog/issues/2">面试官连环追问:数组拍平(扁平化) flat 方法实现</a></p>
301
+ </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/59095.html">https://xuehuayu.cn/article/59095.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/57965.html">React SSR 详解 + 2个项目实战</a><a class="next" href="/article/20056.html">webpack打包之后js文件引用顺序错乱,vendor顺序错误</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
302
+ const serverURL = origin.includes('cainiaoblog') ? 'https://cmts.cainiaoblog.cn' : 'https://cmts.xuehuayu.cn'
303
+ const locale = {
304
+ placeholder: '请正确填写昵称和邮箱,方便接收回复通知~',
305
+ sofa: '沙发空缺中,还不快抢~',
306
+ };
307
+ Waline.init({
308
+ el: '#vcomment',
309
+ serverURL: serverURL,
310
+ pageSize: '20',
311
+ visitor: true, // 阅读量统计
312
+ requiredMeta: ['nick', 'mail'],
313
+ emoji: [
314
+ 'https://cdn.jsdelivr.net/gh/walinejs/emojis@1.0.0/weibo',
315
+ 'https://cdn.jsdelivr.net/gh/walinejs/emojis@1.0.0/qq',
316
+ 'https://cdn.jsdelivr.net/gh/walinejs/emojis@1.0.0/tw-emoji',
317
+ ],
318
+ locale,
319
+ pageview: true
320
+ })
321
+ </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() {
322
+ var val = $(this).val()
323
+ 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>'
324
+ 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>'
325
+ 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>'
326
+
327
+ if (val === 'self') {
328
+ $('#search').html(self)
329
+ var search_path = 'search.xml';
330
+ if (search_path.length == 0) {
331
+ search_path = 'search.xml';
332
+ }
333
+ var path = 'https://cdn.staticaly.com/gh/npljy/npljy.github.io/main/' + search_path;
334
+ searchFunc(path, 'local-search-input', 'local-search-result');
335
+ } else if (val === 'baidu') {
336
+ $('#search').html(baidu)
337
+ } else if (val === 'google') {
338
+ $('#search').html(google)
339
+ }
340
+ })</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(){
341
+ var cnb =window.location.origin.indexOf('cainiaoblog') !==-1
342
+ if (cnb) {
343
+ var gxba =document.getElementById('gxba')
344
+ var gaba =document.getElementById('gaba')
345
+ var gabaLink =document.getElementById('gaba-link')
346
+ gxba.innerText ='京ICP备20007647号-1'
347
+ gaba.innerText ='京公网安备 11010802031254号'
348
+ gabaLink.setAttribute('href','http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=11010802031254')
349
+ }
350
+ })()</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>