{
    "componentChunkName": "component---src-templates-post-template-jsx",
    "path": "/weakmap-trong-javascript/",
    "result": {"data":{"markdownRemark":{"html":"<p>WeakMap trong JavaScript là cũng là <strong>một loại object</strong>. WeakMap có những đặc điểm giống và khác Map như thế nào?</p>\n<p>Sau đây, mình sẽ cùng tìm hiểu về WeakMap trong JavaScript.</p>\n<h2 id=\"weakmap-trong-javascript-là-gì\" style=\"position:relative;\"><a href=\"#weakmap-trong-javascript-l%C3%A0-g%C3%AC\" aria-label=\"weakmap trong javascript là gì permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>WeakMap trong JavaScript là gì?</h2>\n<p><strong>WeakMap trong JavaScript</strong> là một cấu trúc cho phép lưu trữ dữ liệu theo kiểu <strong>key-value</strong> tương tự như <a href=\"/map-trong-javascript-thi-sao/\">Map</a>, <a href=\"/object-la-gi-object-trong-javascript/\">Object</a> với cú pháp khởi tạo là:</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">new</span> <span class=\"token class-name\">WeakMap</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span>iterable<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>Trong đó:</p>\n<ul>\n<li>Tham số <code>iterable</code> là <a href=\"/iterable-la-gi-iterable-trong-javascript/\">iterable object</a> (không bắt buộc) với mỗi phần tử là mảng hai chiều dạng <code>[key, value]</code>.</li>\n<li>Thuộc tính trong WeakMap <code>key</code> <strong>chỉ có thể là object</strong>.</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">let</span> obj <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">x</span><span class=\"token operator\">:</span> <span class=\"token number\">1</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">let</span> weakMap <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>\n\nweakMap<span class=\"token punctuation\">.</span><span class=\"token function\">set</span><span class=\"token punctuation\">(</span>obj<span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// OK - key là object</span>\nweakMap<span class=\"token punctuation\">.</span><span class=\"token function\">set</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"a\"</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// Lỗi: Invalid value used as weak map key - key là string</span></code></pre></div>\n<h2 id=\"các-phương-thức-của-weakmap\" style=\"position:relative;\"><a href=\"#c%C3%A1c-ph%C6%B0%C6%A1ng-th%E1%BB%A9c-c%E1%BB%A7a-weakmap\" aria-label=\"các phương thức của weakmap permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Các phương thức của WeakMap</h2>\n<p>Sau đây là các phương thức của WeakMap trong JavaScript.</p>\n<p>► Phương thức <code>weakMap.set(key, value)</code>:</p>\n<p>Dùng để lưu giá trị <code>value</code> bởi thuộc tính <code>key</code> và trả về chính WeakMap. Trong đó, <code>key</code> phải là một object, ngược lại thì báo lỗi.</p>\n<div class=\"gatsby-highlight has-highlighted-lines\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">let</span> obj1 <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">x</span><span class=\"token operator\">:</span> <span class=\"token number\">1</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">let</span> obj2 <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">x</span><span class=\"token operator\">:</span> <span class=\"token number\">2</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">let</span> weakMap <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>\n<span class=\"gatsby-highlight-code-line\">weakMap<span class=\"token punctuation\">.</span><span class=\"token function\">set</span><span class=\"token punctuation\">(</span>obj1<span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">set</span><span class=\"token punctuation\">(</span>obj2<span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></span></code></pre></div>\n<p>► Phương thức <code>weakMap.get(key)</code>:</p>\n<p>Trả về giá trị của thuộc tính <code>key</code>, nếu <code>key</code> không tồn tại thì trả về <code>undefined</code>.</p>\n<div class=\"gatsby-highlight has-highlighted-lines\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">let</span> obj1 <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">x</span><span class=\"token operator\">:</span> <span class=\"token number\">1</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">let</span> obj2 <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">x</span><span class=\"token operator\">:</span> <span class=\"token number\">2</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">let</span> weakMap <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>\nweakMap<span class=\"token punctuation\">.</span><span class=\"token function\">set</span><span class=\"token punctuation\">(</span>obj1<span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">set</span><span class=\"token punctuation\">(</span>obj2<span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"gatsby-highlight-code-line\">console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>weakMap<span class=\"token punctuation\">.</span><span class=\"token function\">get</span><span class=\"token punctuation\">(</span>obj1<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// 1</span></span><span class=\"gatsby-highlight-code-line\">console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>weakMap<span class=\"token punctuation\">.</span><span class=\"token function\">get</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">x</span><span class=\"token operator\">:</span> <span class=\"token number\">1</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// undefined - vì {x:1} !== {x:1}</span></span></code></pre></div>\n<p>► Phương thức <code>weakMap.delete(key)</code>:</p>\n<p>Xóa thuộc tính <code>key</code> trong WeakMap, và trả về <code>true</code> nếu <code>key</code> tồn tại, ngược lại thì trả về <code>false</code>.</p>\n<div class=\"gatsby-highlight has-highlighted-lines\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">let</span> obj1 <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">x</span><span class=\"token operator\">:</span> <span class=\"token number\">1</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">let</span> obj2 <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">x</span><span class=\"token operator\">:</span> <span class=\"token number\">2</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">let</span> weakMap <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>\nweakMap<span class=\"token punctuation\">.</span><span class=\"token function\">set</span><span class=\"token punctuation\">(</span>obj1<span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">set</span><span class=\"token punctuation\">(</span>obj2<span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"gatsby-highlight-code-line\">console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>weakMap<span class=\"token punctuation\">.</span><span class=\"token function\">delete</span><span class=\"token punctuation\">(</span>obj1<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// true</span></span><span class=\"gatsby-highlight-code-line\">console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>weakMap<span class=\"token punctuation\">.</span><span class=\"token function\">delete</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">x</span><span class=\"token operator\">:</span> <span class=\"token number\">1</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// false - vì {x:1} !== {x:1}</span></span></code></pre></div>\n<p>► Phương thức <code>weakMap.has(key)</code>:</p>\n<p>Trả về <code>true</code> nếu <code>key</code> tồn tại trong WeakMap, ngược lại thì trả về <code>false</code>.</p>\n<div class=\"gatsby-highlight has-highlighted-lines\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">let</span> obj1 <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">x</span><span class=\"token operator\">:</span> <span class=\"token number\">1</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">let</span> obj2 <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">x</span><span class=\"token operator\">:</span> <span class=\"token number\">2</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">let</span> weakMap <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>\nweakMap<span class=\"token punctuation\">.</span><span class=\"token function\">set</span><span class=\"token punctuation\">(</span>obj1<span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">set</span><span class=\"token punctuation\">(</span>obj2<span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"gatsby-highlight-code-line\">console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>weakMap<span class=\"token punctuation\">.</span><span class=\"token function\">has</span><span class=\"token punctuation\">(</span>obj1<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// true</span></span><span class=\"gatsby-highlight-code-line\">console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>weakMap<span class=\"token punctuation\">.</span><span class=\"token function\">has</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">x</span><span class=\"token operator\">:</span> <span class=\"token number\">1</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// false - vì {x:1} !== {x:1}</span></span></code></pre></div>\n<h2 id=\"so-sánh-weakmap-và-map\" style=\"position:relative;\"><a href=\"#so-s%C3%A1nh-weakmap-v%C3%A0-map\" aria-label=\"so sánh weakmap và map permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>So sánh WeakMap và Map</h2>\n<p>Sau đây là một số đặc điểm khác nhau giữa WeakMap và Map.</p>\n<h3 id=\"kiểu-dữ-liệu-của-key\" style=\"position:relative;\"><a href=\"#ki%E1%BB%83u-d%E1%BB%AF-li%E1%BB%87u-c%E1%BB%A7a-key\" aria-label=\"kiểu dữ liệu của key permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Kiểu dữ liệu của key</h3>\n<p>Đối với Map, key có thể thuộc bất kỳ kiểu dữ liệu nào. Nhưng đối với WeakMap thì ngược lại, key chỉ có thể là object.</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">let</span> map <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Map</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">let</span> weakMap <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>\n\nmap<span class=\"token punctuation\">.</span><span class=\"token function\">set</span><span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"one\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// OK</span>\nweakMap<span class=\"token punctuation\">.</span><span class=\"token function\">set</span><span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"one\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// Lỗi - Invalid value used as weak map key</span></code></pre></div>\n<h3 id=\"tính-chất-của-iterable-object\" style=\"position:relative;\"><a href=\"#t%C3%ADnh-ch%E1%BA%A5t-c%E1%BB%A7a-iterable-object\" aria-label=\"tính chất của iterable object permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Tính chất của iterable object</h3>\n<p>Map là iterable object. Do đó, bạn có thể duyệt qua hết tất cả các phần tử trong Map.</p>\n<p>WeakMap không phải là iterable object. Bạn không có cách nào để duyệt hết tất cả các phần tử của WeakMap.</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token comment\">// khởi tạo map</span>\n<span class=\"token keyword\">let</span> map <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Map</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\nmap<span class=\"token punctuation\">.</span><span class=\"token function\">set</span><span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"a\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">set</span><span class=\"token punctuation\">(</span><span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"b\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// duyệt qua các phần tử của map</span>\n<span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">let</span> item <span class=\"token keyword\">of</span> map<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>item<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token comment\">/**\n   * [1, 'a']\n   * [2, 'b']\n   */</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// khởi tạo weakmap</span>\n<span class=\"token keyword\">let</span> obj1 <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">x</span><span class=\"token operator\">:</span> <span class=\"token number\">1</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">let</span> obj2 <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">x</span><span class=\"token operator\">:</span> <span class=\"token number\">2</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">let</span> weakMap <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>\nweakMap<span class=\"token punctuation\">.</span><span class=\"token function\">set</span><span class=\"token punctuation\">(</span>obj1<span class=\"token punctuation\">,</span> <span class=\"token string\">\"a\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">set</span><span class=\"token punctuation\">(</span>obj2<span class=\"token punctuation\">,</span> <span class=\"token string\">\"b\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// duyệt qua các phần tử của weakmap</span>\n<span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">let</span> item <span class=\"token keyword\">of</span> weakMap<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>item<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token comment\">/**\n * Lỗi: weakMap is not iterable\n */</span></code></pre></div>\n<h3 id=\"vấn-đề-garbage-collection\" style=\"position:relative;\"><a href=\"#v%E1%BA%A5n-%C4%91%E1%BB%81-garbage-collection\" aria-label=\"vấn đề garbage collection permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Vấn đề garbage collection</h3>\n<p>Như mình đã đề cập ở bài viết <a href=\"/garbage-collection-trong-javascript/\">garbage collection trong JavaScript</a> thì <a href=\"/javascript-la-gi/#javascript-engine-l%C3%A0-g%C3%AC\">JavaScript engine</a> giữ một giá trị trong bộ nhớ khi giá trị đó \"có thể tiếp cận\".</p>\n<p>Ví dụ về garbage collection:</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">let</span> alex <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">name</span><span class=\"token operator\">:</span> <span class=\"token string\">\"Alex\"</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// object { name: \"Alex\" } có thể được truy cập bởi biến alex</span>\n\n<span class=\"token comment\">// ghi đè giá trị của biến alex</span>\nalex <span class=\"token operator\">=</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// object bị hủy vì không có tham chiếu tới nó</span></code></pre></div>\n<p>Thông thường, thuộc tính của object hoặc phần tử trong mảng,... được coi là \"có thể tiếp cận\" và giữ lại trong bộ nhớ nếu object hoặc mảng chứa chúng vẫn tồn tại.</p>\n<p>Ví dụ, mình đẩy một object vào mảng. Và khi mảng đó vẫn tồn tại thì object trong mảng cũng sẽ tồn tại, mặc dù không còn biến tham chiếu đến object.</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">let</span> alex <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">name</span><span class=\"token operator\">:</span> <span class=\"token string\">\"Alex\"</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// đẩy object vào mảng</span>\n<span class=\"token keyword\">let</span> arr <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span>alex<span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// ghi đè giá trị của biến alex</span>\nalex <span class=\"token operator\">=</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// mặc dù alex bị gán bằng null, nhưng object vẫn tồn tại trong mảng</span>\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>arr<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// {name: \"Alex\"}</span></code></pre></div>\n<p>Tương tự, nếu mình sử dụng <strong>object</strong> làm key cho Map thì khi Map tồn tại, <strong>object</strong> cũng sẽ tồn tại và không bị giải phóng.</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">let</span> alex <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">name</span><span class=\"token operator\">:</span> <span class=\"token string\">\"Alex\"</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// khai báo map và sử dụng biến alex làm key cho map</span>\n<span class=\"token keyword\">let</span> map <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Map</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\nmap<span class=\"token punctuation\">.</span><span class=\"token function\">set</span><span class=\"token punctuation\">(</span>alex<span class=\"token punctuation\">,</span> <span class=\"token string\">\"1\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// ghi đè giá trị của biến alex</span>\nalex <span class=\"token operator\">=</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// mặc dù biến alex bị gán bằng null, nhưng object alex vẫn tồn tại trong map</span>\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>map<span class=\"token punctuation\">.</span>size<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// 1</span>\n<span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">let</span> item <span class=\"token keyword\">of</span> map<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>item<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token comment\">/**\n   * [{name: 'Alex'}, '1']\n   */</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Nhưng với <strong>WeakMap thì khác</strong>, khi không còn biến tham chiếu đến object thì object đó sẽ bị hủy, ví dụ:</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">let</span> alex <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">name</span><span class=\"token operator\">:</span> <span class=\"token string\">\"Alex\"</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// khai báo map và sử dụng biến alex làm key cho weakMap</span>\n<span class=\"token keyword\">let</span> weakMap <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>\nweakMap<span class=\"token punctuation\">.</span><span class=\"token function\">set</span><span class=\"token punctuation\">(</span>alex<span class=\"token punctuation\">,</span> <span class=\"token string\">\"1\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// ghi đè giá trị của biến alex</span>\nalex <span class=\"token operator\">=</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>Sau khi biến <code>alex</code> bị gán bằng <code>null</code>, không còn cách nào có thể truy cập vào phần tử với key là <code>alex</code> trước đó. Vì vậy, object với <code>alex</code> sẽ bị hủy.</p>\n<p>Trên đây là một số điểm khác nhau khi so sánh Map và WeakMap trong JavaScript. Tiếp theo, mình sẽ tìm hiểu một ứng dụng thực tế của WeakMap.</p>\n<h2 id=\"ứng-dụng-của-weakmap-trong-lưu-trữ-dữ-liệu\" style=\"position:relative;\"><a href=\"#%E1%BB%A9ng-d%E1%BB%A5ng-c%E1%BB%A7a-weakmap-trong-l%C6%B0u-tr%E1%BB%AF-d%E1%BB%AF-li%E1%BB%87u\" aria-label=\"ứng dụng của weakmap trong lưu trữ dữ liệu permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Ứng dụng của WeakMap trong lưu trữ dữ liệu</h2>\n<p>Ví dụ bạn muốn lưu thông tin <strong>số lần truy cập</strong> của một đối tượng <code>user</code>. Thông tin này được lưu trữ trong một <strong>map</strong> với key là đối tượng <code>user</code> và giá trị là số lượt truy cập.</p>\n<p>Khi user rời đi, đối tượng <code>user</code> bị giải phóng và mong muốn là <strong>không lưu trữ</strong> thông tin số lần truy cập với đối tượng <code>user</code> nữa.</p>\n<p>Ví dụ module dùng để lưu trữ và xử lý số lượt truy cập nằm trong file thư viện <code>library.js</code>:</p>\n<div class=\"gatsby-code-title gatsby-remark-code-title\">library.js</div>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token comment\">// khai báo Map để lưu trữ thông tin số lượt truy cập</span>\n<span class=\"token keyword\">let</span> visitsCountMap <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Map</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// tăng số lượt truy cập với tham số user</span>\n<span class=\"token keyword\">function</span> <span class=\"token function\">countUser</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">user</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// lấy số lượt truy cập hiện tại</span>\n  <span class=\"token comment\">// nếu user chưa có trong map thì visitsCountMap.get(user) trả về undefined</span>\n  <span class=\"token comment\">// khi đó, giá trị mặc định là 0</span>\n  <span class=\"token keyword\">let</span> count <span class=\"token operator\">=</span> visitsCountMap<span class=\"token punctuation\">.</span><span class=\"token function\">get</span><span class=\"token punctuation\">(</span>user<span class=\"token punctuation\">)</span> <span class=\"token operator\">||</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token comment\">// tăng giá trị count lên 1 đơn vị và lưu lại vào thuộc tính user</span>\n  visitsCountMap<span class=\"token punctuation\">.</span><span class=\"token function\">set</span><span class=\"token punctuation\">(</span>user<span class=\"token punctuation\">,</span> count <span class=\"token operator\">+</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Đoạn code sử dụng:</p>\n<div class=\"gatsby-code-title gatsby-remark-code-title\">main.js</div>\n<div class=\"gatsby-highlight has-highlighted-lines\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">let</span> alex <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">name</span><span class=\"token operator\">:</span> <span class=\"token string\">\"Alex\"</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// Cập nhật số lượt truy cập với biến alex</span>\n<span class=\"gatsby-highlight-code-line\"><span class=\"token function\">countUser</span><span class=\"token punctuation\">(</span>alex<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></span>\n<span class=\"token comment\">// Khi user rời đi, gán biến alex = null</span>\nalex <span class=\"token operator\">=</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>Khi <code>alex</code> gán bằng <code>null</code>, object <code>{ name: \"Alex\" }</code> nên được giải phòng. Nhưng thực tế thì object <code>alex</code> vẫn tồn tại trong map <code>visitsCountMap</code>.</p>\n<p>Để giải phòng bộ nhớ, bạn cần chủ động gọi <code>visitsCountMap.delete(alex)</code> để xóa thuộc tính <code>alex</code> khỏi map, ngược lại object <code>alex</code> vẫn sẽ được giữ lại.</p>\n<p>Tuy nhiên, việc gọi <code>delete</code> là khó khăn vì code xử lý đang nằm trong một file khác. Để tránh việc này, bạn chỉ cần chuyển Map thành WeakMap trong file <code>library.js</code> là xong:</p>\n<div class=\"gatsby-code-title gatsby-remark-code-title\">library.js</div>\n<div class=\"gatsby-highlight has-highlighted-lines\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token comment\">// khai báo WeakMap để lưu trữ thông tin số lượt truy cập</span>\n<span class=\"gatsby-highlight-code-line\"><span class=\"token keyword\">let</span> visitsCountMap <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>\n<span class=\"token comment\">// tăng số lượt truy cập với tham số user</span>\n<span class=\"token keyword\">function</span> <span class=\"token function\">countUser</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">user</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// lấy số lượt truy cập hiện tại</span>\n  <span class=\"token comment\">// nếu user chưa có trong map thì visitsCountMap.get(user) trả về undefined</span>\n  <span class=\"token comment\">// khi đó, giá trị mặc định là 0</span>\n  <span class=\"token keyword\">let</span> count <span class=\"token operator\">=</span> visitsCountMap<span class=\"token punctuation\">.</span><span class=\"token function\">get</span><span class=\"token punctuation\">(</span>user<span class=\"token punctuation\">)</span> <span class=\"token operator\">||</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token comment\">// tăng giá trị count lên 1 đơn vị và lưu lại vào thuộc tính user</span>\n  visitsCountMap<span class=\"token punctuation\">.</span><span class=\"token function\">set</span><span class=\"token punctuation\">(</span>user<span class=\"token punctuation\">,</span> count <span class=\"token operator\">+</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Lúc này, khi biến <code>alex</code> được gán bằng <code>null</code> thì object <code>{ name: \"Alex\" }</code> cũng sẽ bị hủy, vì không có cách nào truy cập đến object đó nữa.</p>\n<h2 id=\"ứng-dụng-của-weakmap-trong-caching\" style=\"position:relative;\"><a href=\"#%E1%BB%A9ng-d%E1%BB%A5ng-c%E1%BB%A7a-weakmap-trong-caching\" aria-label=\"ứng dụng của weakmap trong caching permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Ứng dụng của WeakMap trong caching</h2>\n<p>Ví dụ bạn muốn <strong>lưu kết quả của một lần gọi hàm</strong> để lần sau nếu có gọi lại thì trả về luôn kết quả trước đó.</p>\n<p>Cách sử dụng Map thông thường:</p>\n<div class=\"gatsby-code-title gatsby-remark-code-title\">cache.js</div>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token comment\">// khởi tạo Map để làm cache</span>\n<span class=\"token keyword\">let</span> cache <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Map</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// tính toán và lưu lại kết quả</span>\n<span class=\"token keyword\">function</span> <span class=\"token function\">process</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">obj</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// kiểm tra xem trong cache đã có obj chưa</span>\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">!</span>cache<span class=\"token punctuation\">.</span><span class=\"token function\">has</span><span class=\"token punctuation\">(</span>obj<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// nếu chưa có thì tính toán để ra kết quả</span>\n    <span class=\"token keyword\">let</span> result <span class=\"token operator\">=</span> <span class=\"token comment\">/* tính toán để ra kết quả với obj */</span> obj<span class=\"token punctuation\">;</span>\n\n    <span class=\"token comment\">// lưu lại kết quả vào cache với key là obj và value là result</span>\n    cache<span class=\"token punctuation\">.</span><span class=\"token function\">set</span><span class=\"token punctuation\">(</span>obj<span class=\"token punctuation\">,</span> result<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token comment\">// trả về kết quả ứng với key là obj trong cache</span>\n  <span class=\"token keyword\">return</span> cache<span class=\"token punctuation\">.</span><span class=\"token function\">get</span><span class=\"token punctuation\">(</span>obj<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Sử dụng trong file <code>main.js</code>:</p>\n<div class=\"gatsby-code-title gatsby-remark-code-title\">main.js</div>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token comment\">// objec bất kỳ</span>\n<span class=\"token keyword\">let</span> obj <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// tính toán với obj được kết quả result1</span>\n<span class=\"token keyword\">let</span> result1 <span class=\"token operator\">=</span> <span class=\"token function\">process</span><span class=\"token punctuation\">(</span>obj<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// sau đó ở một đoạn code khác, tính toán với obj để được result2</span>\n<span class=\"token keyword\">let</span> result2 <span class=\"token operator\">=</span> <span class=\"token function\">process</span><span class=\"token punctuation\">(</span>obj<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// khi không dùng obj nữa thì gán obj bằng null</span>\nobj <span class=\"token operator\">=</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// tuy nhiên, kích thước của cache vẫn là 1</span>\n<span class=\"token comment\">// vì object lưu vào cache chưa bị giải phòng</span>\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>cache<span class=\"token punctuation\">.</span>size<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// 1</span></code></pre></div>\n<p>Để giải phóng <code>cache</code>, bạn phải chủ động gọi <code>cache.delete(obj)</code>. Tuy nhiên để đơn giản, bạn chỉ cần chuyển Map thành WeakMap đối với biến <code>cache</code> là xong:</p>\n<div class=\"gatsby-code-title gatsby-remark-code-title\">cache.js</div>\n<div class=\"gatsby-highlight has-highlighted-lines\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token comment\">// khởi tạo WeakMap để làm cache</span>\n<span class=\"gatsby-highlight-code-line\"><span class=\"token keyword\">let</span> cache <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>\n<span class=\"token comment\">// tính toán và lưu lại kết quả</span>\n<span class=\"token keyword\">function</span> <span class=\"token function\">process</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">obj</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// kiểm tra xem trong cache đã có obj chưa</span>\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">!</span>cache<span class=\"token punctuation\">.</span><span class=\"token function\">has</span><span class=\"token punctuation\">(</span>obj<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// nếu chưa có thì tính toán để ra kết quả</span>\n    <span class=\"token keyword\">let</span> result <span class=\"token operator\">=</span> <span class=\"token comment\">/* tính toán để ra kết quả với obj */</span> obj<span class=\"token punctuation\">;</span>\n\n    <span class=\"token comment\">// lưu lại kết quả vào cache với key là obj và value là result</span>\n    cache<span class=\"token punctuation\">.</span><span class=\"token function\">set</span><span class=\"token punctuation\">(</span>obj<span class=\"token punctuation\">,</span> result<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token comment\">// trả về kết quả ứng với key là obj trong cache</span>\n  <span class=\"token keyword\">return</span> cache<span class=\"token punctuation\">.</span><span class=\"token function\">get</span><span class=\"token punctuation\">(</span>obj<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Khi đó, nếu <code>obj</code> bị gán bằng <code>null</code> thì không còn cách nào để truy cập vào object trong <code>cache</code>, nên object đó sẽ bị giải phóng.</p>\n<h2 id=\"tổng-kết\" style=\"position:relative;\"><a href=\"#t%E1%BB%95ng-k%E1%BA%BFt\" aria-label=\"tổng kết permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Tổng kết</h2>\n<p>WeakMap trong JavaScript tương tự như Map, cho phép lưu trữ dữ liệu theo kiểu <code>key-value</code>. Tuy nhiên, WeakMap chỉ chấp nhận object làm key.</p>\n<p>Và khi object bị hủy, object tương ứng trong WeakMap sẽ bị giải phóng vì không còn cách nào để truy cập vào object đó nữa.</p>\n<p>Các phương thức của WeakMap là:</p>\n<ul>\n<li><code>weakMap.set(key, value)</code>: lưu giá trị <code>value</code> vào thuộc tính <code>key</code> và trả về chính WeakMap.</li>\n<li><code>weakMap.get(key)</code>: trả về giá trị của thuộc tính <code>key</code>, nếu <code>key</code> không tồn tại thì trả về <code>undefined</code>.</li>\n<li><code>weakMap.delete(key)</code>: xóa thuộc tính <code>key</code> trong WeakMap, nếu <code>key</code> tồn tại thì trả về <code>true</code>, ngược lại thì trả về <code>false</code>.</li>\n<li><code>weakMap.has(key)</code>: trả về <code>true</code> nếu <code>key</code> tồn tại trong <code>weakMap</code>, ngược lại thì trả về <code>false</code>.</li>\n</ul>\n<p>WeakMap không phải iterable object nên không có cách nào để duyệt hết các phần tử trong WeakMap (như cách dùng <code>for...of</code> với Map).</p>\n<p>Tham khảo:</p>\n<ul>\n<li><a href=\"https://javascript.info/weakmap-weakset\">WeakMap and WeakSet</a></li>\n<li><a href=\"https://www.mattzeunert.com/2017/01/31/weak-maps.html\">Difference between Map and WeakMap in JavaScript</a></li>\n<li><a href=\"http://qnimate.com/difference-between-map-and-weakmap-in-javascript/\">Difference between \"Map\" and \"WeakMap\" in JavaScript</a></li>\n<li><a href=\"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakMap\">WeakMap</a></li>\n</ul>","timeToRead":10,"excerpt":"WeakMap trong JavaScript là cũng là một loại object. WeakMap có những đặc điểm giống và khác Map như thế nào? Sau đây, mình sẽ cùng tìm hiểu…","frontmatter":{"directory":"JavaScript","title":"Weakmap trong JavaScript","date":"2017-06-07T06:30:00Z","tags":["ES6","Kiểu dữ liệu","Map"],"description":"WeakMap trong JavaScript là cũng là một loại object, cho phép lưu trữ dữ liệu dạng key-value. WeakMap có nhiều điểm khác với Map. Sau đây mình sẽ tìm hiểu WeakMap và so sánh nó với Map.","keywords":"weakmap trong javascript","cover":{"childImageSharp":{"gatsbyImageData":{"layout":"fixed","backgroundColor":"#283838","images":{"fallback":{"src":"/static/22ae6ec3cbb6cac950354ce2229b9de1/bc51f/weakmap-trong-javascript.png","srcSet":"/static/22ae6ec3cbb6cac950354ce2229b9de1/bc51f/weakmap-trong-javascript.png 660w","sizes":"660px"},"sources":[{"srcSet":"/static/22ae6ec3cbb6cac950354ce2229b9de1/2b2b5/weakmap-trong-javascript.webp 660w","type":"image/webp","sizes":"660px"}]},"width":660,"height":400}}},"update":"2021-12-13T06:30:00Z"},"fields":{"slug":"/weakmap-trong-javascript/","date":"2017-06-07T06:30:00.000Z"}},"sameSeries":{"totalCount":20,"edges":[{"node":{"fields":{"slug":"/phuong-thuc-cua-kieu-nguyen-thuy/","date":"2017-05-24T08:00:00.000Z"},"excerpt":"JavaScript cho phép bạn sử dụng kiểu nguyên thủy giống như object. Nghĩa là bạn có thể gọi các phương thức của kiểu nguyên thủy giống như…","timeToRead":6,"frontmatter":{"title":"Các phương thức của kiểu nguyên thủy","shortTitle":"Phương thức của kiểu nguyên thủy","tags":["Kiểu dữ liệu","String"],"cover":{"childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#283838","images":{"fallback":{"src":"/static/6f7003b0c80ad09df58db77d12fac986/bc51f/phuong-thuc-kieu-nguyen-thuy.png","srcSet":"/static/6f7003b0c80ad09df58db77d12fac986/41200/phuong-thuc-kieu-nguyen-thuy.png 165w,\n/static/6f7003b0c80ad09df58db77d12fac986/f979a/phuong-thuc-kieu-nguyen-thuy.png 330w,\n/static/6f7003b0c80ad09df58db77d12fac986/bc51f/phuong-thuc-kieu-nguyen-thuy.png 660w","sizes":"(min-width: 660px) 660px, 100vw"},"sources":[{"srcSet":"/static/6f7003b0c80ad09df58db77d12fac986/322ad/phuong-thuc-kieu-nguyen-thuy.webp 165w,\n/static/6f7003b0c80ad09df58db77d12fac986/de3b3/phuong-thuc-kieu-nguyen-thuy.webp 330w,\n/static/6f7003b0c80ad09df58db77d12fac986/2b2b5/phuong-thuc-kieu-nguyen-thuy.webp 660w","type":"image/webp","sizes":"(min-width: 660px) 660px, 100vw"}]},"width":660,"height":400}}},"date":"2017-05-24T08:00:00Z","update":"2021-12-03T08:00:00Z","series":"JavaScript: Các kiểu dữ liệu"}}},{"node":{"fields":{"slug":"/kieu-du-lieu-number-trong-javascript/","date":"2017-05-25T20:00:00.000Z"},"excerpt":"Có hai kiểu dữ liệu liên quan đến number trong JavaScript là: number thông thường và bigInt. Number thông thường được lưu dưới dạng số thực…","timeToRead":18,"frontmatter":{"title":"Kiểu dữ liệu number trong JavaScript","shortTitle":null,"tags":["Kiểu dữ liệu"],"cover":{"childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#283838","images":{"fallback":{"src":"/static/f3848d1783df431e5e170bab2bbc64e0/bc51f/kieu-du-lieu-number-trong-javascript.png","srcSet":"/static/f3848d1783df431e5e170bab2bbc64e0/41200/kieu-du-lieu-number-trong-javascript.png 165w,\n/static/f3848d1783df431e5e170bab2bbc64e0/f979a/kieu-du-lieu-number-trong-javascript.png 330w,\n/static/f3848d1783df431e5e170bab2bbc64e0/bc51f/kieu-du-lieu-number-trong-javascript.png 660w","sizes":"(min-width: 660px) 660px, 100vw"},"sources":[{"srcSet":"/static/f3848d1783df431e5e170bab2bbc64e0/322ad/kieu-du-lieu-number-trong-javascript.webp 165w,\n/static/f3848d1783df431e5e170bab2bbc64e0/de3b3/kieu-du-lieu-number-trong-javascript.webp 330w,\n/static/f3848d1783df431e5e170bab2bbc64e0/2b2b5/kieu-du-lieu-number-trong-javascript.webp 660w","type":"image/webp","sizes":"(min-width: 660px) 660px, 100vw"}]},"width":660,"height":400}}},"date":"2017-05-25T20:00:00Z","update":"2021-12-04T08:00:00Z","series":"JavaScript: Các kiểu dữ liệu"}}},{"node":{"fields":{"slug":"/kieu-du-lieu-string-trong-javascript/","date":"2017-05-26T10:00:00.000Z"},"excerpt":"Kiểu dữ liệu string trong JavaScript dùng để lưu trữ giá trị dạng text. Và không có kiểu dữ liệu đặc biệt nào cho một ký tự. Biểu diễn…","timeToRead":16,"frontmatter":{"title":"Kiểu dữ liệu string trong JavaScript","shortTitle":null,"tags":["Kiểu dữ liệu","String"],"cover":{"childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#283838","images":{"fallback":{"src":"/static/f0d97814de68e84ffe0977b5cb2d08ce/bc51f/kieu-du-lieu-string-trong-javascript.png","srcSet":"/static/f0d97814de68e84ffe0977b5cb2d08ce/41200/kieu-du-lieu-string-trong-javascript.png 165w,\n/static/f0d97814de68e84ffe0977b5cb2d08ce/f979a/kieu-du-lieu-string-trong-javascript.png 330w,\n/static/f0d97814de68e84ffe0977b5cb2d08ce/bc51f/kieu-du-lieu-string-trong-javascript.png 660w","sizes":"(min-width: 660px) 660px, 100vw"},"sources":[{"srcSet":"/static/f0d97814de68e84ffe0977b5cb2d08ce/322ad/kieu-du-lieu-string-trong-javascript.webp 165w,\n/static/f0d97814de68e84ffe0977b5cb2d08ce/de3b3/kieu-du-lieu-string-trong-javascript.webp 330w,\n/static/f0d97814de68e84ffe0977b5cb2d08ce/2b2b5/kieu-du-lieu-string-trong-javascript.webp 660w","type":"image/webp","sizes":"(min-width: 660px) 660px, 100vw"}]},"width":660,"height":400}}},"date":"2017-05-26T10:00:00Z","update":"2021-12-05T11:00:00Z","series":"JavaScript: Các kiểu dữ liệu"}}},{"node":{"fields":{"slug":"/su-dung-es6-template-string-co-gi-hay/","date":"2017-05-27T08:00:00.000Z"},"excerpt":"Có thể bạn thừa biết, phiên bản ES6 của JavaScript đã giới thiệu rất nhiều những tính năng hay hấp dẫn của ngôn ngữ lập trình này. Một trong…","timeToRead":6,"frontmatter":{"title":"Sử dụng ES6 Template String có gì hay?","shortTitle":"ES6 Template String có gì hay?","tags":["ES6","Kiểu dữ liệu","String"],"cover":{"childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#283838","images":{"fallback":{"src":"/static/162d2c3db9d93e4b368346d23b140539/bc51f/su-dung-es6-template-string-co-gi-hay.png","srcSet":"/static/162d2c3db9d93e4b368346d23b140539/41200/su-dung-es6-template-string-co-gi-hay.png 165w,\n/static/162d2c3db9d93e4b368346d23b140539/f979a/su-dung-es6-template-string-co-gi-hay.png 330w,\n/static/162d2c3db9d93e4b368346d23b140539/bc51f/su-dung-es6-template-string-co-gi-hay.png 660w","sizes":"(min-width: 660px) 660px, 100vw"},"sources":[{"srcSet":"/static/162d2c3db9d93e4b368346d23b140539/322ad/su-dung-es6-template-string-co-gi-hay.webp 165w,\n/static/162d2c3db9d93e4b368346d23b140539/de3b3/su-dung-es6-template-string-co-gi-hay.webp 330w,\n/static/162d2c3db9d93e4b368346d23b140539/2b2b5/su-dung-es6-template-string-co-gi-hay.webp 660w","type":"image/webp","sizes":"(min-width: 660px) 660px, 100vw"}]},"width":660,"height":400}}},"date":"2017-05-27T08:00:00Z","update":"2021-12-05T18:00:00Z","series":"JavaScript: Các kiểu dữ liệu"}}},{"node":{"fields":{"slug":"/tagged-template-es6-la-gi/","date":"2017-05-28T16:00:00.000Z"},"excerpt":"Trong bài viết về sử dụng ES6 Template String có gì hay, mình đã giới thiệu với bạn về ES6 Template String là gì, cũng như cách dùng và ứng…","timeToRead":3,"frontmatter":{"title":"Tagged template ES6 là gì?","shortTitle":null,"tags":["ES6","Kiểu dữ liệu","String"],"cover":{"childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#283838","images":{"fallback":{"src":"/static/9e013e4b51e81e09b70b6aafb4c73743/bc51f/tagged-template-es6-la-gi.png","srcSet":"/static/9e013e4b51e81e09b70b6aafb4c73743/41200/tagged-template-es6-la-gi.png 165w,\n/static/9e013e4b51e81e09b70b6aafb4c73743/f979a/tagged-template-es6-la-gi.png 330w,\n/static/9e013e4b51e81e09b70b6aafb4c73743/bc51f/tagged-template-es6-la-gi.png 660w","sizes":"(min-width: 660px) 660px, 100vw"},"sources":[{"srcSet":"/static/9e013e4b51e81e09b70b6aafb4c73743/322ad/tagged-template-es6-la-gi.webp 165w,\n/static/9e013e4b51e81e09b70b6aafb4c73743/de3b3/tagged-template-es6-la-gi.webp 330w,\n/static/9e013e4b51e81e09b70b6aafb4c73743/2b2b5/tagged-template-es6-la-gi.webp 660w","type":"image/webp","sizes":"(min-width: 660px) 660px, 100vw"}]},"width":660,"height":400}}},"date":"2017-05-28T16:00:00Z","update":"2021-12-05T19:00:00Z","series":"JavaScript: Các kiểu dữ liệu"}}},{"node":{"fields":{"slug":"/array-la-gi-array-trong-javascript/","date":"2017-05-29T07:00:00.000Z"},"excerpt":"Array trong JavaScript cũng là một loại object. Nhưng array khác object bình thường ở chỗ là: Array (mảng) được thiết kế để lưu trữ dữ liệu…","timeToRead":15,"frontmatter":{"title":"Array là gì? Array trong JavaScript","shortTitle":null,"tags":["Array","Kiểu dữ liệu"],"cover":{"childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#283838","images":{"fallback":{"src":"/static/a0358209835d4868879da24233ffb0d0/bc51f/array-trong-javascript.png","srcSet":"/static/a0358209835d4868879da24233ffb0d0/41200/array-trong-javascript.png 165w,\n/static/a0358209835d4868879da24233ffb0d0/f979a/array-trong-javascript.png 330w,\n/static/a0358209835d4868879da24233ffb0d0/bc51f/array-trong-javascript.png 660w","sizes":"(min-width: 660px) 660px, 100vw"},"sources":[{"srcSet":"/static/a0358209835d4868879da24233ffb0d0/322ad/array-trong-javascript.webp 165w,\n/static/a0358209835d4868879da24233ffb0d0/de3b3/array-trong-javascript.webp 330w,\n/static/a0358209835d4868879da24233ffb0d0/2b2b5/array-trong-javascript.webp 660w","type":"image/webp","sizes":"(min-width: 660px) 660px, 100vw"}]},"width":660,"height":400}}},"date":"2017-05-29T07:00:00Z","update":"2021-12-06T20:00:00Z","series":"JavaScript: Các kiểu dữ liệu"}}},{"node":{"fields":{"slug":"/phuong-thuc-cua-mang-trong-javascript/","date":"2017-05-29T20:00:00.000Z"},"excerpt":"Có rất nhiều phương thức của mảng trong JavaScript. Nhờ đó, việc xử lý mảng trở nên dễ dàng hơn. Sau đây, mình sẽ tìm hiểu chi tiết về các…","timeToRead":21,"frontmatter":{"title":"Các phương thức của mảng trong JavaScript","shortTitle":"Các phương thức của mảng trong JS","tags":["Array","Kiểu dữ liệu"],"cover":{"childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#283838","images":{"fallback":{"src":"/static/a2bc241a3b75c35a29c62ffa0e900258/bc51f/phuong-thuc-cua-mang-trong-javascript.png","srcSet":"/static/a2bc241a3b75c35a29c62ffa0e900258/41200/phuong-thuc-cua-mang-trong-javascript.png 165w,\n/static/a2bc241a3b75c35a29c62ffa0e900258/f979a/phuong-thuc-cua-mang-trong-javascript.png 330w,\n/static/a2bc241a3b75c35a29c62ffa0e900258/bc51f/phuong-thuc-cua-mang-trong-javascript.png 660w","sizes":"(min-width: 660px) 660px, 100vw"},"sources":[{"srcSet":"/static/a2bc241a3b75c35a29c62ffa0e900258/322ad/phuong-thuc-cua-mang-trong-javascript.webp 165w,\n/static/a2bc241a3b75c35a29c62ffa0e900258/de3b3/phuong-thuc-cua-mang-trong-javascript.webp 330w,\n/static/a2bc241a3b75c35a29c62ffa0e900258/2b2b5/phuong-thuc-cua-mang-trong-javascript.webp 660w","type":"image/webp","sizes":"(min-width: 660px) 660px, 100vw"}]},"width":660,"height":400}}},"date":"2017-05-29T20:00:00Z","update":"2021-12-07T21:00:00Z","series":"JavaScript: Các kiểu dữ liệu"}}},{"node":{"fields":{"slug":"/sap-xep-mang-trong-javascript/","date":"2017-05-30T14:39:44.000Z"},"excerpt":"Bài viết sau đây tập trung tìm hiểu về phương thức sắp xếp mảng trong JavaScript. Và cách triển khai một số thuật toán sắp xếp mảng cơ bản…","timeToRead":10,"frontmatter":{"title":"Sắp xếp mảng trong JavaScript","shortTitle":null,"tags":["Array","Thuật toán","Kiểu dữ liệu"],"cover":{"childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#283838","images":{"fallback":{"src":"/static/5f1b21542959a314df5273809ea98cee/bc51f/sap-xep-mang-trong-javascript.png","srcSet":"/static/5f1b21542959a314df5273809ea98cee/41200/sap-xep-mang-trong-javascript.png 165w,\n/static/5f1b21542959a314df5273809ea98cee/f979a/sap-xep-mang-trong-javascript.png 330w,\n/static/5f1b21542959a314df5273809ea98cee/bc51f/sap-xep-mang-trong-javascript.png 660w","sizes":"(min-width: 660px) 660px, 100vw"},"sources":[{"srcSet":"/static/5f1b21542959a314df5273809ea98cee/322ad/sap-xep-mang-trong-javascript.webp 165w,\n/static/5f1b21542959a314df5273809ea98cee/de3b3/sap-xep-mang-trong-javascript.webp 330w,\n/static/5f1b21542959a314df5273809ea98cee/2b2b5/sap-xep-mang-trong-javascript.webp 660w","type":"image/webp","sizes":"(min-width: 660px) 660px, 100vw"}]},"width":660,"height":400}}},"date":"2017-05-30T14:39:44Z","update":"2021-12-08T21:15:00Z","series":"JavaScript: Các kiểu dữ liệu"}}},{"node":{"fields":{"slug":"/sap-xep-tieng-viet-javascript/","date":"2017-06-01T06:00:00.000Z"},"excerpt":"Sắp xếp là một bài toán không thể thiếu trong lập trình. Tuy nhiên, nhiều bạn vẫn đang gặp khó khăn với việc sắp xếp Tiếng việt trong…","timeToRead":5,"frontmatter":{"title":"Sắp xếp Tiếng Việt trong JavaScript","shortTitle":null,"tags":["Array","Kiểu dữ liệu"],"cover":{"childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#283838","images":{"fallback":{"src":"/static/33f46b4acc19016407db61c10fef59c7/bc51f/sap-xep-tieng-viet-javascript.png","srcSet":"/static/33f46b4acc19016407db61c10fef59c7/41200/sap-xep-tieng-viet-javascript.png 165w,\n/static/33f46b4acc19016407db61c10fef59c7/f979a/sap-xep-tieng-viet-javascript.png 330w,\n/static/33f46b4acc19016407db61c10fef59c7/bc51f/sap-xep-tieng-viet-javascript.png 660w","sizes":"(min-width: 660px) 660px, 100vw"},"sources":[{"srcSet":"/static/33f46b4acc19016407db61c10fef59c7/322ad/sap-xep-tieng-viet-javascript.webp 165w,\n/static/33f46b4acc19016407db61c10fef59c7/de3b3/sap-xep-tieng-viet-javascript.webp 330w,\n/static/33f46b4acc19016407db61c10fef59c7/2b2b5/sap-xep-tieng-viet-javascript.webp 660w","type":"image/webp","sizes":"(min-width: 660px) 660px, 100vw"}]},"width":660,"height":400}}},"date":"2017-06-01T06:00:00Z","update":"2021-12-08T21:45:00Z","series":"JavaScript: Các kiểu dữ liệu"}}},{"node":{"fields":{"slug":"/javascript-foreach-la-cai-quai-gi/","date":"2017-06-02T09:49:44.000Z"},"excerpt":"Trong JavaScript, để duyệt array thì forEach là một hàm rất hay. Vậy hàm forEach trong JavaScript cụ thể là như thế nào? Cách sử dụng…","timeToRead":15,"frontmatter":{"title":"JavaScript forEach là cái quái gì?","shortTitle":null,"tags":["Array","Kiểu dữ liệu"],"cover":{"childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#283838","images":{"fallback":{"src":"/static/fbd86134dc21a69bea6f4a7fb109c87f/bc51f/javascript-foreach-la-cai-quai-gi.png","srcSet":"/static/fbd86134dc21a69bea6f4a7fb109c87f/41200/javascript-foreach-la-cai-quai-gi.png 165w,\n/static/fbd86134dc21a69bea6f4a7fb109c87f/f979a/javascript-foreach-la-cai-quai-gi.png 330w,\n/static/fbd86134dc21a69bea6f4a7fb109c87f/bc51f/javascript-foreach-la-cai-quai-gi.png 660w","sizes":"(min-width: 660px) 660px, 100vw"},"sources":[{"srcSet":"/static/fbd86134dc21a69bea6f4a7fb109c87f/322ad/javascript-foreach-la-cai-quai-gi.webp 165w,\n/static/fbd86134dc21a69bea6f4a7fb109c87f/de3b3/javascript-foreach-la-cai-quai-gi.webp 330w,\n/static/fbd86134dc21a69bea6f4a7fb109c87f/2b2b5/javascript-foreach-la-cai-quai-gi.webp 660w","type":"image/webp","sizes":"(min-width: 660px) 660px, 100vw"}]},"width":660,"height":400}}},"date":"2017-06-02T09:49:44Z","update":"2021-12-09T08:00:00Z","series":"JavaScript: Các kiểu dữ liệu"}}},{"node":{"fields":{"slug":"/iterable-la-gi-iterable-trong-javascript/","date":"2017-06-03T09:49:44.000Z"},"excerpt":"Iterable trong JavaScript là một khái niệm liên quan đến array. Một object gọi là iterable nếu object đó sử dụng được với vòng lặp for...of…","timeToRead":6,"frontmatter":{"title":"Iterable là gì? Iterable trong JavaScript","shortTitle":null,"tags":["Array","Object","Kiểu dữ liệu"],"cover":{"childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#283838","images":{"fallback":{"src":"/static/a3d74392f47b3f5f00f04815ce206f8a/bc51f/iterable-la-gi-iterable-trong-javascript.png","srcSet":"/static/a3d74392f47b3f5f00f04815ce206f8a/41200/iterable-la-gi-iterable-trong-javascript.png 165w,\n/static/a3d74392f47b3f5f00f04815ce206f8a/f979a/iterable-la-gi-iterable-trong-javascript.png 330w,\n/static/a3d74392f47b3f5f00f04815ce206f8a/bc51f/iterable-la-gi-iterable-trong-javascript.png 660w","sizes":"(min-width: 660px) 660px, 100vw"},"sources":[{"srcSet":"/static/a3d74392f47b3f5f00f04815ce206f8a/322ad/iterable-la-gi-iterable-trong-javascript.webp 165w,\n/static/a3d74392f47b3f5f00f04815ce206f8a/de3b3/iterable-la-gi-iterable-trong-javascript.webp 330w,\n/static/a3d74392f47b3f5f00f04815ce206f8a/2b2b5/iterable-la-gi-iterable-trong-javascript.webp 660w","type":"image/webp","sizes":"(min-width: 660px) 660px, 100vw"}]},"width":660,"height":400}}},"date":"2017-06-03T09:49:44Z","update":"2021-12-10T08:00:00Z","series":"JavaScript: Các kiểu dữ liệu"}}},{"node":{"fields":{"slug":"/map-trong-javascript-thi-sao/","date":"2017-06-04T22:30:56.000Z"},"excerpt":"Map trong JavaScript là một loại object cho phép lưu trữ dữ liệu theo kiểu key-value. Nghe qua thì Map có vẻ giống với object bình thường…","timeToRead":14,"frontmatter":{"title":"Map trong JavaScript thì sao?","shortTitle":null,"tags":["ES6","Map","Kiểu dữ liệu"],"cover":{"childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#283838","images":{"fallback":{"src":"/static/53858b3ad2194bb753934557f3254592/bc51f/map-trong-javascript-thi-sao.png","srcSet":"/static/53858b3ad2194bb753934557f3254592/41200/map-trong-javascript-thi-sao.png 165w,\n/static/53858b3ad2194bb753934557f3254592/f979a/map-trong-javascript-thi-sao.png 330w,\n/static/53858b3ad2194bb753934557f3254592/bc51f/map-trong-javascript-thi-sao.png 660w","sizes":"(min-width: 660px) 660px, 100vw"},"sources":[{"srcSet":"/static/53858b3ad2194bb753934557f3254592/322ad/map-trong-javascript-thi-sao.webp 165w,\n/static/53858b3ad2194bb753934557f3254592/de3b3/map-trong-javascript-thi-sao.webp 330w,\n/static/53858b3ad2194bb753934557f3254592/2b2b5/map-trong-javascript-thi-sao.webp 660w","type":"image/webp","sizes":"(min-width: 660px) 660px, 100vw"}]},"width":660,"height":400}}},"date":"2017-06-04T22:30:56Z","update":"2021-12-11T22:30:56Z","series":"JavaScript: Các kiểu dữ liệu"}}},{"node":{"fields":{"slug":"/so-sanh-map-voi-object-trong-javascript/","date":"2017-06-05T22:30:00.000Z"},"excerpt":"Có thể bạn đã quen với việc sử dụng Object trong JavaScript. Trong khi đó, Map là một kiểu dữ liệu mới xuất hiện trong ES6. Map có những đặc…","timeToRead":6,"frontmatter":{"title":"So sánh Map với Object trong JavaScript","shortTitle":"So sánh Map với Object trong JS","tags":["ES6","Map","Object","Kiểu dữ liệu"],"cover":{"childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#283838","images":{"fallback":{"src":"/static/9d6f3c8214f0c33cb2be0b799b41daf8/bc51f/so-sanh-map-voi-object-trong-javascript.png","srcSet":"/static/9d6f3c8214f0c33cb2be0b799b41daf8/41200/so-sanh-map-voi-object-trong-javascript.png 165w,\n/static/9d6f3c8214f0c33cb2be0b799b41daf8/f979a/so-sanh-map-voi-object-trong-javascript.png 330w,\n/static/9d6f3c8214f0c33cb2be0b799b41daf8/bc51f/so-sanh-map-voi-object-trong-javascript.png 660w","sizes":"(min-width: 660px) 660px, 100vw"},"sources":[{"srcSet":"/static/9d6f3c8214f0c33cb2be0b799b41daf8/322ad/so-sanh-map-voi-object-trong-javascript.webp 165w,\n/static/9d6f3c8214f0c33cb2be0b799b41daf8/de3b3/so-sanh-map-voi-object-trong-javascript.webp 330w,\n/static/9d6f3c8214f0c33cb2be0b799b41daf8/2b2b5/so-sanh-map-voi-object-trong-javascript.webp 660w","type":"image/webp","sizes":"(min-width: 660px) 660px, 100vw"}]},"width":660,"height":400}}},"date":"2017-06-05T22:30:00Z","update":"2021-12-12T21:00:00Z","series":"JavaScript: Các kiểu dữ liệu"}}},{"node":{"fields":{"slug":"/ban-biet-gi-ve-set-trong-javascript/","date":"2017-06-06T22:30:00.000Z"},"excerpt":"Mình đã tìm hiểu về Map trong JavaScript rồi. Bài viết này mình tiếp tục tìm hiểu về một loại object đặc biệt nữa. Đó là Set trong…","timeToRead":14,"frontmatter":{"title":"Bạn biết gì về Set trong JavaScript?","shortTitle":null,"tags":["ES6","Kiểu dữ liệu","Set"],"cover":{"childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#283838","images":{"fallback":{"src":"/static/138fb41d7e0e7581b69e0cbf9068c974/bc51f/ban-biet-gi-ve-set-trong-javascript.png","srcSet":"/static/138fb41d7e0e7581b69e0cbf9068c974/41200/ban-biet-gi-ve-set-trong-javascript.png 165w,\n/static/138fb41d7e0e7581b69e0cbf9068c974/f979a/ban-biet-gi-ve-set-trong-javascript.png 330w,\n/static/138fb41d7e0e7581b69e0cbf9068c974/bc51f/ban-biet-gi-ve-set-trong-javascript.png 660w","sizes":"(min-width: 660px) 660px, 100vw"},"sources":[{"srcSet":"/static/138fb41d7e0e7581b69e0cbf9068c974/322ad/ban-biet-gi-ve-set-trong-javascript.webp 165w,\n/static/138fb41d7e0e7581b69e0cbf9068c974/de3b3/ban-biet-gi-ve-set-trong-javascript.webp 330w,\n/static/138fb41d7e0e7581b69e0cbf9068c974/2b2b5/ban-biet-gi-ve-set-trong-javascript.webp 660w","type":"image/webp","sizes":"(min-width: 660px) 660px, 100vw"}]},"width":660,"height":400}}},"date":"2017-06-06T22:30:00Z","update":"2021-12-12T21:30:00Z","series":"JavaScript: Các kiểu dữ liệu"}}},{"node":{"fields":{"slug":"/weakmap-trong-javascript/","date":"2017-06-07T06:30:00.000Z"},"excerpt":"WeakMap trong JavaScript là cũng là một loại object. WeakMap có những đặc điểm giống và khác Map như thế nào? Sau đây, mình sẽ cùng tìm hiểu…","timeToRead":10,"frontmatter":{"title":"Weakmap trong JavaScript","shortTitle":null,"tags":["ES6","Kiểu dữ liệu","Map"],"cover":{"childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#283838","images":{"fallback":{"src":"/static/22ae6ec3cbb6cac950354ce2229b9de1/bc51f/weakmap-trong-javascript.png","srcSet":"/static/22ae6ec3cbb6cac950354ce2229b9de1/41200/weakmap-trong-javascript.png 165w,\n/static/22ae6ec3cbb6cac950354ce2229b9de1/f979a/weakmap-trong-javascript.png 330w,\n/static/22ae6ec3cbb6cac950354ce2229b9de1/bc51f/weakmap-trong-javascript.png 660w","sizes":"(min-width: 660px) 660px, 100vw"},"sources":[{"srcSet":"/static/22ae6ec3cbb6cac950354ce2229b9de1/322ad/weakmap-trong-javascript.webp 165w,\n/static/22ae6ec3cbb6cac950354ce2229b9de1/de3b3/weakmap-trong-javascript.webp 330w,\n/static/22ae6ec3cbb6cac950354ce2229b9de1/2b2b5/weakmap-trong-javascript.webp 660w","type":"image/webp","sizes":"(min-width: 660px) 660px, 100vw"}]},"width":660,"height":400}}},"date":"2017-06-07T06:30:00Z","update":"2021-12-13T06:30:00Z","series":"JavaScript: Các kiểu dữ liệu"}}},{"node":{"fields":{"slug":"/weakset-trong-javascript/","date":"2017-06-07T21:30:00.000Z"},"excerpt":"WeakSet trong JavaScript cũng là một loại object đặc biệt, dùng để lưu trữ dữ liệu một cách duy nhất, không trùng lặp - tương tự như Set…","timeToRead":5,"frontmatter":{"title":"Weakset trong JavaScript","shortTitle":null,"tags":["ES6","Kiểu dữ liệu","Set"],"cover":{"childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#283838","images":{"fallback":{"src":"/static/818430289c73464a55d2f3b2935b499f/bc51f/weakset-trong-javascript.png","srcSet":"/static/818430289c73464a55d2f3b2935b499f/41200/weakset-trong-javascript.png 165w,\n/static/818430289c73464a55d2f3b2935b499f/f979a/weakset-trong-javascript.png 330w,\n/static/818430289c73464a55d2f3b2935b499f/bc51f/weakset-trong-javascript.png 660w","sizes":"(min-width: 660px) 660px, 100vw"},"sources":[{"srcSet":"/static/818430289c73464a55d2f3b2935b499f/322ad/weakset-trong-javascript.webp 165w,\n/static/818430289c73464a55d2f3b2935b499f/de3b3/weakset-trong-javascript.webp 330w,\n/static/818430289c73464a55d2f3b2935b499f/2b2b5/weakset-trong-javascript.webp 660w","type":"image/webp","sizes":"(min-width: 660px) 660px, 100vw"}]},"width":660,"height":400}}},"date":"2017-06-07T21:30:00Z","update":"2021-12-14T06:30:00Z","series":"JavaScript: Các kiểu dữ liệu"}}},{"node":{"fields":{"slug":"/destructuring-assignment-trong-javascript/","date":"2017-06-08T03:00:00.000Z"},"excerpt":"Destructuring Assignment trong JavaScript là một cú pháp đặc biệt cho phép bạn lấy ra dữ liệu từ Object hoặc Array và gán chúng vào các biến…","timeToRead":15,"frontmatter":{"title":"Destructuring Assignment trong JavaScript","shortTitle":"Destructuring Assignment trong JS","tags":["ES6","Array","Object","Kiểu dữ liệu","Destructuring Assignment"],"cover":{"childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#283838","images":{"fallback":{"src":"/static/6aa3305fad15043d04e8143ddb1be435/bc51f/destructuring-assignment-trong-javascript.png","srcSet":"/static/6aa3305fad15043d04e8143ddb1be435/41200/destructuring-assignment-trong-javascript.png 165w,\n/static/6aa3305fad15043d04e8143ddb1be435/f979a/destructuring-assignment-trong-javascript.png 330w,\n/static/6aa3305fad15043d04e8143ddb1be435/bc51f/destructuring-assignment-trong-javascript.png 660w","sizes":"(min-width: 660px) 660px, 100vw"},"sources":[{"srcSet":"/static/6aa3305fad15043d04e8143ddb1be435/322ad/destructuring-assignment-trong-javascript.webp 165w,\n/static/6aa3305fad15043d04e8143ddb1be435/de3b3/destructuring-assignment-trong-javascript.webp 330w,\n/static/6aa3305fad15043d04e8143ddb1be435/2b2b5/destructuring-assignment-trong-javascript.webp 660w","type":"image/webp","sizes":"(min-width: 660px) 660px, 100vw"}]},"width":660,"height":400}}},"date":"2017-06-08T03:00:00Z","update":"2021-12-18T06:30:00Z","series":"JavaScript: Các kiểu dữ liệu"}}},{"node":{"fields":{"slug":"/doi-tuong-date-trong-javascript/","date":"2017-06-09T03:00:00.000Z"},"excerpt":"Date trong JavaScript là một đối tượng sẵn có giúp bạn lưu trữ date (ngày, tháng, năm), time (giờ, phút, giây) và quản lý date/time. Ví dụ…","timeToRead":16,"frontmatter":{"title":"Đối tượng Date trong JavaScript","shortTitle":null,"tags":["Kiểu dữ liệu"],"cover":{"childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#283838","images":{"fallback":{"src":"/static/e2efc875438d9d7edb12f7ef8db18fb7/bc51f/date-time-trong-javascript.png","srcSet":"/static/e2efc875438d9d7edb12f7ef8db18fb7/41200/date-time-trong-javascript.png 165w,\n/static/e2efc875438d9d7edb12f7ef8db18fb7/f979a/date-time-trong-javascript.png 330w,\n/static/e2efc875438d9d7edb12f7ef8db18fb7/bc51f/date-time-trong-javascript.png 660w","sizes":"(min-width: 660px) 660px, 100vw"},"sources":[{"srcSet":"/static/e2efc875438d9d7edb12f7ef8db18fb7/322ad/date-time-trong-javascript.webp 165w,\n/static/e2efc875438d9d7edb12f7ef8db18fb7/de3b3/date-time-trong-javascript.webp 330w,\n/static/e2efc875438d9d7edb12f7ef8db18fb7/2b2b5/date-time-trong-javascript.webp 660w","type":"image/webp","sizes":"(min-width: 660px) 660px, 100vw"}]},"width":660,"height":400}}},"date":"2017-06-09T03:00:00Z","update":"2021-12-19T09:30:00Z","series":"JavaScript: Các kiểu dữ liệu"}}},{"node":{"fields":{"slug":"/tim-hieu-ve-json-trong-javascript/","date":"2017-06-10T00:21:47.000Z"},"excerpt":"Giả sử, bạn có một object phức tạp. Và bạn muốn chuyển object thành dạng string để gửi lên server hoặc ghi log ra file. Cách đơn giản là bạn…","timeToRead":12,"frontmatter":{"title":"Tìm hiểu về JSON trong JavaScript","shortTitle":null,"tags":["JSON","Kiểu dữ liệu","Object"],"cover":{"childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#283838","images":{"fallback":{"src":"/static/e1475779d7483d6cc0c63d68af9292f2/bc51f/tim-hieu-ve-json-trong-javascript.png","srcSet":"/static/e1475779d7483d6cc0c63d68af9292f2/41200/tim-hieu-ve-json-trong-javascript.png 165w,\n/static/e1475779d7483d6cc0c63d68af9292f2/f979a/tim-hieu-ve-json-trong-javascript.png 330w,\n/static/e1475779d7483d6cc0c63d68af9292f2/bc51f/tim-hieu-ve-json-trong-javascript.png 660w","sizes":"(min-width: 660px) 660px, 100vw"},"sources":[{"srcSet":"/static/e1475779d7483d6cc0c63d68af9292f2/322ad/tim-hieu-ve-json-trong-javascript.webp 165w,\n/static/e1475779d7483d6cc0c63d68af9292f2/de3b3/tim-hieu-ve-json-trong-javascript.webp 330w,\n/static/e1475779d7483d6cc0c63d68af9292f2/2b2b5/tim-hieu-ve-json-trong-javascript.webp 660w","type":"image/webp","sizes":"(min-width: 660px) 660px, 100vw"}]},"width":660,"height":400}}},"date":"2017-06-10T00:21:47Z","update":"2021-12-19T15:30:00Z","series":"JavaScript: Các kiểu dữ liệu"}}},{"node":{"fields":{"slug":"/ung-dung-cua-reduce-javascript/","date":"2017-06-11T23:00:00.000Z"},"excerpt":"Trước khi bắt đầu, mình muốn bạn hiểu tại sao mình lại viết về phương thức Reduce trong JavaScript mà không phải là một phương thức nào khác…","timeToRead":9,"frontmatter":{"title":"Ứng dụng của Reduce trong JavaScript","shortTitle":null,"tags":["Array","Kiểu dữ liệu"],"cover":{"childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#283838","images":{"fallback":{"src":"/static/ab7dcc534709779cf5cac0ff4440e524/bc51f/ung-dung-cua-reduce-javascript.png","srcSet":"/static/ab7dcc534709779cf5cac0ff4440e524/41200/ung-dung-cua-reduce-javascript.png 165w,\n/static/ab7dcc534709779cf5cac0ff4440e524/f979a/ung-dung-cua-reduce-javascript.png 330w,\n/static/ab7dcc534709779cf5cac0ff4440e524/bc51f/ung-dung-cua-reduce-javascript.png 660w","sizes":"(min-width: 660px) 660px, 100vw"},"sources":[{"srcSet":"/static/ab7dcc534709779cf5cac0ff4440e524/322ad/ung-dung-cua-reduce-javascript.webp 165w,\n/static/ab7dcc534709779cf5cac0ff4440e524/de3b3/ung-dung-cua-reduce-javascript.webp 330w,\n/static/ab7dcc534709779cf5cac0ff4440e524/2b2b5/ung-dung-cua-reduce-javascript.webp 660w","type":"image/webp","sizes":"(min-width: 660px) 660px, 100vw"}]},"width":660,"height":400}}},"date":"2017-06-11T23:00:00Z","update":"2021-12-19T18:00:00Z","series":"JavaScript: Các kiểu dữ liệu"}}}]}},"pageContext":{"slug":"/weakmap-trong-javascript/","series":"JavaScript: Các kiểu dữ liệu","nextTitle":"Bạn biết gì về Set trong JavaScript?","nextSlug":"/ban-biet-gi-ve-set-trong-javascript/","prevTitle":"Weakset trong JavaScript","prevSlug":"/weakset-trong-javascript/","latestEdges":[{"node":{"fields":{"slug":"/cach-chon-cms-cho-trang-web/"},"frontmatter":{"directory":"Bài viết được tài trợ","template":"post","title":"Làm thế nào để chọn CMS phù hợp cho trang web của bạn?","shortTitle":"Cách chọn CMS cho trang web","tags":["Wordpress","CMS"],"date":"2022-06-27T20:30:00Z","update":"2022-06-27T20:30:00Z"}}},{"node":{"fields":{"slug":"/async-await-la-gi-async-await-trong-javascript/"},"frontmatter":{"directory":"JavaScript","template":"post","title":"Async/await là gì? Async/await trong JavaScript","shortTitle":"Async/await là gì? Async/await trong JS","tags":["Async - Await","Promise"],"date":"2017-07-16T06:00:00Z","update":"2022-05-11T21:45:00Z"}}},{"node":{"fields":{"slug":"/microtasks-la-gi-microtasks-trong-javascript/"},"frontmatter":{"directory":"JavaScript","template":"post","title":"Microtasks là gì? Microtasks trong JavaScript","shortTitle":"Microtasks là gì? Microtasks trong JS","tags":["Callback","Promise"],"date":"2017-07-15T06:00:00Z","update":"2022-05-11T21:00:00Z"}}},{"node":{"fields":{"slug":"/chuyen-callback-thanh-promise-trong-javascript/"},"frontmatter":{"directory":"JavaScript","template":"post","title":"Chuyển callback thành promise trong JavaScript","shortTitle":"Chuyển callback thành promise trong JS","tags":["Callback","Promise"],"date":"2017-07-14T06:00:00Z","update":"2022-05-11T20:00:00Z"}}},{"node":{"fields":{"slug":"/promise-api-trong-javascript/"},"frontmatter":{"directory":"JavaScript","template":"post","title":"Các promise API trong JavaScript","shortTitle":null,"tags":["Promise"],"date":"2017-07-13T06:00:00Z","update":"2022-05-08T21:00:00Z"}}},{"node":{"fields":{"slug":"/xu-ly-loi-voi-promise-trong-javascript/"},"frontmatter":{"directory":"JavaScript","template":"post","title":"Xử lý lỗi với promise trong JavaScript","shortTitle":null,"tags":["Promise"],"date":"2017-07-12T06:00:26Z","update":"2022-05-08T20:00:00Z"}}},{"node":{"fields":{"slug":"/chuoi-promise-trong-javascript/"},"frontmatter":{"directory":"JavaScript","template":"post","title":"Chuỗi promise trong JavaScript","shortTitle":null,"tags":["Promise"],"date":"2017-07-10T16:24:00Z","update":"2022-05-08T16:24:00Z"}}},{"node":{"fields":{"slug":"/promise-la-gi-promise-trong-javascript/"},"frontmatter":{"directory":"JavaScript","template":"post","title":"Promise là gì? Promise trong JavaScript","shortTitle":null,"tags":["Promise"],"date":"2017-07-09T13:45:00Z","update":"2022-05-08T13:45:48Z"}}},{"node":{"fields":{"slug":"/callback-la-gi-callback-trong-javascript/"},"frontmatter":{"directory":"JavaScript","template":"post","title":"Callback là gì? Callback trong JavaScript","shortTitle":null,"tags":["Callback","Hàm"],"date":"2017-07-08T10:40:00Z","update":"2022-05-08T10:40:48Z"}}},{"node":{"fields":{"slug":"/tuy-bien-mo-rong-doi-tuong-error/"},"frontmatter":{"directory":"JavaScript","template":"post","title":"Tùy biến và mở rộng đối tượng Error trong JavaScript","shortTitle":"Tùy biến và mở rộng đối tượng Error trong JS","tags":["Error"],"date":"2017-07-06T08:00:00Z","update":"2022-05-08T08:24:00Z"}}}],"latestEdgesTitle":"Bài viết mới cập nhật"}},
    "staticQueryHashes": []}