{"componentChunkName":"component---src-templates-blog-post-js","path":"/hand-painted-deep-copy/","result":{"data":{"markdownRemark":{"html":"<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">function</span> <span class=\"token function\">clone</span><span class=\"token punctuation\">(</span>target<span class=\"token punctuation\">,</span> map <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">WeakMap</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">!</span><span class=\"token function\">isObject</span><span class=\"token punctuation\">(</span>target<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> target\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token keyword\">const</span> type <span class=\"token operator\">=</span> <span class=\"token function\">getType</span><span class=\"token punctuation\">(</span>target<span class=\"token punctuation\">)</span>\n\n  <span class=\"token keyword\">let</span> cloneTarget\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>deepTag<span class=\"token punctuation\">.</span><span class=\"token function\">includes</span><span class=\"token punctuation\">(</span>type<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    cloneTarget <span class=\"token operator\">=</span> <span class=\"token function\">getInit</span><span class=\"token punctuation\">(</span>target<span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token function\">cloneOtherType</span><span class=\"token punctuation\">(</span>target<span class=\"token punctuation\">,</span> type<span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token comment\">// 克隆set类型</span>\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>type <span class=\"token operator\">==</span> setTag<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    target<span class=\"token punctuation\">.</span><span class=\"token function\">forEach</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">value</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n      cloneTarget<span class=\"token punctuation\">.</span><span class=\"token function\">add</span><span class=\"token punctuation\">(</span><span class=\"token function\">clone</span><span class=\"token punctuation\">(</span>value<span class=\"token punctuation\">,</span> map<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">return</span> cloneTarget\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token comment\">// 克隆map类型</span>\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>type <span class=\"token operator\">==</span> mapTag<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    target<span class=\"token punctuation\">.</span><span class=\"token function\">forEach</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">value<span class=\"token punctuation\">,</span> key</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n      cloneTarget<span class=\"token punctuation\">.</span><span class=\"token function\">set</span><span class=\"token punctuation\">(</span>key<span class=\"token punctuation\">,</span> <span class=\"token function\">clone</span><span class=\"token punctuation\">(</span>value<span class=\"token punctuation\">,</span> map<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">return</span> cloneTarget\n  <span class=\"token punctuation\">}</span>\n  \n  <span class=\"token keyword\">const</span> keys <span class=\"token operator\">=</span> type <span class=\"token operator\">===</span> arrayTag <span class=\"token operator\">?</span> <span class=\"token keyword\">undefined</span> <span class=\"token operator\">:</span> Object<span class=\"token punctuation\">.</span><span class=\"token function\">keys</span><span class=\"token punctuation\">(</span>target<span class=\"token punctuation\">)</span>\n  <span class=\"token function\">forEach</span><span class=\"token punctuation\">(</span>keys <span class=\"token operator\">||</span> target<span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">value<span class=\"token punctuation\">,</span> key</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>keys<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      key <span class=\"token operator\">=</span> value\n    <span class=\"token punctuation\">}</span>\n    cloneTarget<span class=\"token punctuation\">[</span>key<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token function\">clone</span><span class=\"token punctuation\">(</span>target<span class=\"token punctuation\">[</span>key<span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> map<span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n  <span class=\"token keyword\">return</span> cloneTarget\n<span class=\"token punctuation\">}</span></code></pre></div>","timeToRead":1,"frontmatter":{"title":"手画深拷贝","date":"July 12, 2019","spoiler":null},"fields":{"slug":"/hand-painted-deep-copy/"}}},"pageContext":{"slug":"/hand-painted-deep-copy/","previous":{"fields":{"slug":"/learn-about-the-event-loop-browser/"},"frontmatter":{"title":"理解事件循环-浏览器"}},"next":{"fields":{"slug":"/for-position-absolute-to-take-effect-the-parent-element-must-be-relative/"},"frontmatter":{"title":"让 position:absolute 生效,父元素必须为 relative ？"}}}},"staticQueryHashes":["3649515864","63159454"]}