{
    "componentChunkName": "component---src-templates-post-template-jsx",
    "path": "/dau-ba-cham-trong-javascript/",
    "result": {"data":{"markdownRemark":{"html":"<p>Rất nhiều hàm trong JavaScript hỗ trợ truyền vào <strong>số lượng tham số không giới hạn</strong>, ví dụ:</p>\n<ul>\n<li><code>Math.max(arg1, arg2, ..., argN)</code>: trả về giá trị lớn nhất của các tham số truyền vào.</li>\n<li><code>Object.assign(dest, src1, ..., srcN)</code>: <a href=\"/copy-object-trong-javascript/\">copy các thuộc tính</a> từ object <code>src1...N</code> vào <code>dest</code>.</li>\n<li>...</li>\n</ul>\n<p>Để làm được điều đó, bạn có thể sử dụng <strong>dấu ba chấm trong JavaScript</strong>.</p>\n<h2 id=\"tham-số-còn-lại-của-hàm-args\" style=\"position:relative;\"><a href=\"#tham-s%E1%BB%91-c%C3%B2n-l%E1%BA%A1i-c%E1%BB%A7a-h%C3%A0m-args\" aria-label=\"tham số còn lại của hàm args 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>Tham số còn lại của hàm <code>...args</code></h2>\n<p>Trong JavaScript, một hàm có thể được gọi với <strong>số lượng tham số truyền vào tùy ý</strong>, bất kể hàm đó được định nghĩa như thế nào, ví dụ:</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token comment\">// hàm tính tổng hai số</span>\n<span class=\"token keyword\">function</span> <span class=\"token function\">sum</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">a<span class=\"token punctuation\">,</span> b</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> a <span class=\"token operator\">+</span> b<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// gọi hàm và truyền vào số lượng tham số lớn hơn định nghĩa</span>\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token function\">sum</span><span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token number\">3</span><span class=\"token punctuation\">,</span> <span class=\"token number\">4</span><span class=\"token punctuation\">,</span> <span class=\"token number\">5</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// 3</span></code></pre></div>\n<p>Hàm <code>sum</code> được định nghĩa gồm hai tham số <code>a</code> và <code>b</code>. Khi gọi hàm, mình đã <strong>truyền vào số lượng tham số nhiều hơn</strong> và không có lỗi xảy ra, mặc dù kết quả vẫn là tổng hai số đầu tiên.</p>\n<p>Các tham số còn lại của hàm <strong>có thể gom lại thành một mảng</strong> bằng cách sử dụng <strong>dấu ba chấm trong JavaScript</strong>, theo sau bởi <strong>tên của một mảng</strong> chứa các tham số còn lại này.</p>\n<p>Ví dụ sau gom hết các tham số vào mảng <code>args</code>:</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token comment\">// hàm tính tổng tất cả các tham số truyền vào</span>\n<span class=\"token keyword\">function</span> <span class=\"token function\">sumAll</span><span class=\"token punctuation\">(</span><span class=\"token parameter\"><span class=\"token operator\">...</span>args</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">let</span> sum <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token comment\">// duyệt mảng để tính tổng</span>\n  <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">let</span> arg <span class=\"token keyword\">of</span> args<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    sum <span class=\"token operator\">+=</span> arg<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token keyword\">return</span> sum<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token function\">sumAll</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 punctuation\">;</span> <span class=\"token comment\">// 1</span>\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token function\">sumAll</span><span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// 3</span>\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token function\">sumAll</span><span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token number\">3</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// 6</span></code></pre></div>\n<p>Ngoài ra, bạn cũng có thể lấy <strong>một vài tham số đầu tiên</strong> thông qua biến. Các tham số còn lại cho vào mảng.</p>\n<p>Ví dụ sau lấy hai tham số đầu tiên cho vào biến, các tham số còn lại cho vào mảng:</p>\n<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\">showName</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">firstName<span class=\"token punctuation\">,</span> lastName<span class=\"token punctuation\">,</span> <span class=\"token operator\">...</span>titles</span><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><span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>firstName<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\"> </span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>lastName<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// Julius Caesar</span>\n\n  <span class=\"token comment\">// các biến còn lại được đưa vào mảng</span>\n  <span class=\"token comment\">// ví dụ mảng titles = [\"Consul\", \"Imperator\"]</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>titles<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\">// Consul</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>titles<span class=\"token punctuation\">[</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 comment\">// Imperator</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>titles<span class=\"token punctuation\">.</span>length<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// 2</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token function\">showName</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Julius\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"Caesar\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"Consul\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"Imperator\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<blockquote>\n<p><strong>Chú ý:</strong> cú pháp dấu ba chấm trong JavaScript để lấy các tham số còn lại của hàm phải đặt ở <strong>cuối danh sách các tham số</strong>.</p>\n</blockquote>\n<p>Ví dụ sau sử dụng cú pháp dấu ba chấm ở giữa nên bị lỗi:</p>\n<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\">func</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">arg1<span class=\"token punctuation\">,</span> <span class=\"token operator\">...</span>rest<span class=\"token punctuation\">,</span> arg2</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">//</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// Uncaught SyntaxError: Rest parameter must be last formal parameter</span></code></pre></div>\n<h2 id=\"đối-tượng-arguments\" style=\"position:relative;\"><a href=\"#%C4%91%E1%BB%91i-t%C6%B0%E1%BB%A3ng-arguments\" aria-label=\"đối tượng arguments 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>Đối tượng <code>arguments</code></h2>\n<p>Trong hàm có một đối tượng đặc biệt là <code>arguments</code>. Đây là đối tượng kiểu <strong>array-like</strong> và <strong>iterable</strong> chứa tất cả các tham số của hàm xác định bởi chỉ số, ví dụ:</p>\n<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\">sumAll</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">let</span> i <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span> i <span class=\"token operator\">&lt;</span> arguments<span class=\"token punctuation\">.</span>length<span class=\"token punctuation\">;</span> i<span class=\"token operator\">++</span><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>arguments<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token comment\">// có thể dùng for...of</span>\n  <span class=\"token comment\">// for (let arg of arguments) {</span>\n  <span class=\"token comment\">//   console.log(arg);</span>\n  <span class=\"token comment\">// }</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token function\">sumAll</span><span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token number\">3</span><span class=\"token punctuation\">,</span> <span class=\"token number\">4</span><span class=\"token punctuation\">,</span> <span class=\"token number\">5</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">/*\n1\n2\n3\n4\n5\n*/</span></code></pre></div>\n<p>Khi cú pháp dấu ba chấm trong JavaScript chưa xuất hiện thì <code>arguments</code> là cách được sử dụng để lấy tất cả tham số truyền vào hàm.</p>\n<p>Tuy nhiên, cách sử dụng <code>arguments</code> có nhược điểm là:</p>\n<ul>\n<li><code>arguments</code> là <strong>array-like</strong> nên bạn không thể sử dụng các phương thức của mảng như <code>arguments.map(...)</code>.</li>\n<li><code>arguments</code> luôn chứa tất cả các tham số của hàm. Bạn không thể chỉ lưu một số tham số như cú pháp dấu ba chấm được.</li>\n<li><a href=\"/arrow-function-la-gi-arrow-function-trong-js/\">Arrow function</a> không có đối tượng <code>arguments</code>.</li>\n</ul>\n<h2 id=\"cú-pháp-spread\" style=\"position:relative;\"><a href=\"#c%C3%BA-ph%C3%A1p-spread\" aria-label=\"cú pháp spread 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ú pháp spread</h2>\n<p>Bên trên bạn đã biết cách sử dụng cú pháp dấu ba chấm để lấy một mảng các tham số còn lại trong hàm. Tuy nhiên, nhiều khi bạn cần phải làm <strong>ngược lại</strong>.</p>\n<p>Ví dụ khi sử dụng hàm <a href=\"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/max\">Math.max</a> để trả về giá trị lớn nhất trong các tham số truyền vào:</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\">console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>Math<span class=\"token punctuation\">.</span><span class=\"token function\">max</span><span class=\"token punctuation\">(</span><span class=\"token number\">4</span><span class=\"token punctuation\">,</span> <span class=\"token number\">7</span><span class=\"token punctuation\">,</span> <span class=\"token number\">5</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// 7</span></code></pre></div>\n<p>Giả sử, bạn có một mảng <code>[4, 7, 5]</code>. Làm sao để gọi phương thức <code>Math.max</code> với mảng trên?</p>\n<p>Bạn không thể truyền thẳng một mảng vào hàm vì <code>Math.max</code> không nhận tham số là mảng:</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">let</span> arr <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token number\">4</span><span class=\"token punctuation\">,</span> <span class=\"token number\">7</span><span class=\"token punctuation\">,</span> <span class=\"token number\">5</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>Math<span class=\"token punctuation\">.</span><span class=\"token function\">max</span><span class=\"token punctuation\">(</span>arr<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// NaN</span></code></pre></div>\n<p>Dĩ nhiên, bạn có thể lấy từng phần tử của mảng để truyền vào hàm:</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">let</span> arr <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token number\">4</span><span class=\"token punctuation\">,</span> <span class=\"token number\">7</span><span class=\"token punctuation\">,</span> <span class=\"token number\">5</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>Math<span class=\"token punctuation\">.</span><span class=\"token function\">max</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> arr<span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> arr<span class=\"token punctuation\">[</span><span class=\"token number\">2</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\">// 7</span></code></pre></div>\n<p>Nhưng vấn đề ở đây là bạn <strong>không biết trước số lượng các phần tử của mảng</strong>. Nên cách làm trên là không hợp lý.</p>\n<p>Để giải quyết vấn đề này, bạn có thể sử dụng <strong>cú pháp spread</strong>.</p>\n<h3 id=\"cú-pháp-spread-là-gì\" style=\"position:relative;\"><a href=\"#c%C3%BA-ph%C3%A1p-spread-l%C3%A0-g%C3%AC\" aria-label=\"cú pháp spread 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>Cú pháp spread là gì?</h3>\n<p>Cú pháp spread cũng sử dụng ba dấu chấm giống như cú pháp lấy các tham số còn lại của hàm như trên, nhưng cách thực hiện ngược lại.</p>\n<p>Khi biến <code>arr</code> được sử dụng trong lời gọi hàm, mảng <code>arr</code> được phân tách ra thành danh sách các tham số hàm.</p>\n<p>Ví dụ với hàm <code>Math.max</code> trên:</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">let</span> arr <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token number\">4</span><span class=\"token punctuation\">,</span> <span class=\"token number\">7</span><span class=\"token punctuation\">,</span> <span class=\"token number\">5</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>Math<span class=\"token punctuation\">.</span><span class=\"token function\">max</span><span class=\"token punctuation\">(</span><span class=\"token operator\">...</span>arr<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// 7</span>\n<span class=\"token comment\">// vì mảng [4, 7, 5] được tách ra thành danh sách các tham số là 4, 7, 5</span></code></pre></div>\n<p>Bạn có thể truyền nhiều <a href=\"/iterable-la-gi-iterable-trong-javascript/\">iterable object</a> vào hàm với cú pháp spread:</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">let</span> arr1 <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token number\">3</span><span class=\"token punctuation\">,</span> <span class=\"token number\">5</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">let</span> arr2 <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token number\">4</span><span class=\"token punctuation\">,</span> <span class=\"token number\">6</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>Math<span class=\"token punctuation\">.</span><span class=\"token function\">max</span><span class=\"token punctuation\">(</span><span class=\"token operator\">...</span>arr1<span class=\"token punctuation\">,</span> <span class=\"token operator\">...</span>arr2<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// 6</span>\n<span class=\"token comment\">// cả hai mảng arr1, arr2 được trải ra và ghép lại thành dạng</span>\n<span class=\"token comment\">// Math.max(3, 5, 1, 4, 6, 2)</span></code></pre></div>\n<p>Bạn cũng có thể <strong>kết hợp cú pháp spread với việc truyền tham số thông thường</strong>:</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">let</span> arr1 <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token number\">3</span><span class=\"token punctuation\">,</span> <span class=\"token number\">5</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">let</span> arr2 <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token number\">4</span><span class=\"token punctuation\">,</span> <span class=\"token number\">6</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>Math<span class=\"token punctuation\">.</span><span class=\"token function\">max</span><span class=\"token punctuation\">(</span><span class=\"token number\">5</span><span class=\"token punctuation\">,</span> <span class=\"token operator\">...</span>arr1<span class=\"token punctuation\">,</span> <span class=\"token number\">10</span><span class=\"token punctuation\">,</span> <span class=\"token operator\">...</span>arr2<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// 10</span>\n\n<span class=\"token comment\">// tương đương với:</span>\n<span class=\"token comment\">// Math.max(5, 3, 5, 1, 10, 4, 6, 2)</span></code></pre></div>\n<blockquote>\n<p>💡 Với bài toán <strong>tách mảng thành các tham số để truyền vào hàm</strong>, bạn có thể sử dụng phương thức <a href=\"/phan-biet-call-apply-va-bind-trong-javascript/\"><code>apply</code></a> như sau:</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">let</span> arr <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token number\">4</span><span class=\"token punctuation\">,</span> <span class=\"token number\">7</span><span class=\"token punctuation\">,</span> <span class=\"token number\">5</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>Math<span class=\"token punctuation\">.</span><span class=\"token function\">max</span><span class=\"token punctuation\">.</span><span class=\"token function\">apply</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">null</span><span class=\"token punctuation\">,</span> arr<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// 7</span></code></pre></div>\n<p>Trước khi cú pháp spread xuất hiện thì đây là cách đơn giản nhất để giải quyết bài toán này.</p>\n</blockquote>\n<h3 id=\"ứng-dụng-cú-pháp-spread-để-ghép-mảng\" style=\"position:relative;\"><a href=\"#%E1%BB%A9ng-d%E1%BB%A5ng-c%C3%BA-ph%C3%A1p-spread-%C4%91%E1%BB%83-gh%C3%A9p-m%E1%BA%A3ng\" aria-label=\"ứng dụng cú pháp spread để ghép mảng 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ú pháp spread để ghép mảng</h3>\n<p>Cú pháp spread có thể dùng để ghép mảng, 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> arr1 <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token number\">3</span><span class=\"token punctuation\">,</span> <span class=\"token number\">5</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">let</span> arr2 <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token number\">4</span><span class=\"token punctuation\">,</span> <span class=\"token number\">6</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">let</span> arr <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token operator\">...</span>arr1<span class=\"token punctuation\">,</span> <span class=\"token operator\">...</span>arr2<span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n\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 punctuation\">;</span> <span class=\"token comment\">// (6) [3, 5, 1, 4, 6, 2]</span></code></pre></div>\n<p>Trong các ví dụ trên, mình dùng mảng với cú pháp spread. Thực chất, bạn có thể sử dụng <strong>bất kỳ iterable object</strong> nào.</p>\n<p>Ví dụ sử dụng cú pháp spread để biến string thành mảng các ký tự:</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">let</span> str <span class=\"token operator\">=</span> <span class=\"token string\">\"Hello\"</span><span class=\"token punctuation\">;</span>\n\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span><span class=\"token operator\">...</span>str<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// (5) ['H', 'e', 'l', 'l', 'o']</span></code></pre></div>\n<blockquote>\n<p>Cú pháp spread <strong>sử dụng iterator</strong> để lấy các phần tử, giống như cú pháp <code>for...of</code>.</p>\n</blockquote>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">let</span> str <span class=\"token operator\">=</span> <span class=\"token string\">\"Hello\"</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">let</span> ch <span class=\"token keyword\">of</span> str<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>ch<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// H, e, l, l, o</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Với string, <code>for...of</code> trả về mảng các ký tự và <code>...str</code> trở thành chuỗi <code>'H', 'e', 'l', 'l', 'o'</code>. Sau đó, danh sách các kí tự này được truyền vào <code>[]</code> để tạo mảng mới <code>[...str]</code>.</p>\n<p>Với bài toán này, bạn có thể dùng <code>Array.from(str)</code> cũng cho kết quả tương tự, vì <code>Array.from()</code> chuyển đối tượng iterable thành mảng.</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">let</span> str <span class=\"token operator\">=</span> <span class=\"token string\">\"Hello\"</span><span class=\"token punctuation\">;</span>\n\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>Array<span class=\"token punctuation\">.</span><span class=\"token function\">from</span><span class=\"token punctuation\">(</span>str<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// (5) ['H', 'e', 'l', 'l', 'o']</span></code></pre></div>\n<p>Tuy nhiên, <code>Array.from</code> và cú pháp spread có sự khác nhau là:</p>\n<ul>\n<li><code>Array.from</code> áp dụng được cho cả <strong>đối tượng array-like và iterable object</strong>.</li>\n<li>Cú pháp spread chỉ dùng được với <strong>iterable object</strong>.</li>\n</ul>\n<h2 id=\"copy-mảng-và-object\" style=\"position:relative;\"><a href=\"#copy-m%E1%BA%A3ng-v%C3%A0-object\" aria-label=\"copy mảng và 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>Copy mảng và object</h2>\n<p>Trong bài viết <a href=\"/copy-object-trong-javascript/\">copy object trong JavaScript</a>, mình đã đề cập tới cách sử dụng <code>Object.assign()</code> để copy object.</p>\n<p>Ngoài ra, bạn cũng có thể dùng cú pháp spread để copy object và mảng.</p>\n<p>Ví dụ về copy mảng với cú pháp spread:</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">let</span> arr <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token number\">3</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">let</span> arrCopy <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token operator\">...</span>arr<span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n<span class=\"token comment\">// cú pháp spread tách mảng thành danh sách các tham số</span>\n<span class=\"token comment\">// rồi truyền vào mảng mới</span>\n\n<span class=\"token comment\">// kiểm tra lại nội dung của hai array trên</span>\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token constant\">JSON</span><span class=\"token punctuation\">.</span><span class=\"token function\">stringify</span><span class=\"token punctuation\">(</span>arr<span class=\"token punctuation\">)</span> <span class=\"token operator\">===</span> <span class=\"token constant\">JSON</span><span class=\"token punctuation\">.</span><span class=\"token function\">stringify</span><span class=\"token punctuation\">(</span>arrCopy<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// true</span>\n\n<span class=\"token comment\">// so sánh bằng thông qua tham chiếu</span>\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>arr <span class=\"token operator\">===</span> arrCopy<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// false - không cùng tham chiếu</span>\n\n<span class=\"token comment\">// thay đổi mảng arr, nhưng mảng arrCopy không thay đổi</span>\narr<span class=\"token punctuation\">.</span><span class=\"token function\">push</span><span class=\"token punctuation\">(</span><span class=\"token number\">4</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</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 punctuation\">;</span> <span class=\"token comment\">// (4) [1, 2, 3, 4]</span>\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>arrCopy<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// (3) [1, 2, 3]</span></code></pre></div>\n<p>Ví dụ dùng cú pháp spread trong JavaScript để copy object:</p>\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\">a</span><span class=\"token operator\">:</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token literal-property property\">b</span><span class=\"token operator\">:</span> <span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token literal-property property\">c</span><span class=\"token operator\">:</span> <span class=\"token number\">3</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">let</span> objCopy <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span> <span class=\"token operator\">...</span>obj <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n<span class=\"token comment\">// cú pháp spread tách đối tượng thành danh sách key-value</span>\n<span class=\"token comment\">// rồi truyền vào object mới</span>\n\n<span class=\"token comment\">// kiểm tra nội dung hai obj</span>\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token constant\">JSON</span><span class=\"token punctuation\">.</span><span class=\"token function\">stringify</span><span class=\"token punctuation\">(</span>obj<span class=\"token punctuation\">)</span> <span class=\"token operator\">===</span> <span class=\"token constant\">JSON</span><span class=\"token punctuation\">.</span><span class=\"token function\">stringify</span><span class=\"token punctuation\">(</span>objCopy<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// true</span>\n\n<span class=\"token comment\">// so sánh qua tham chiếu</span>\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>obj <span class=\"token operator\">===</span> objCopy<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// false - vì không cùng tham chiếu</span>\n\n<span class=\"token comment\">// sửa đối tượng obj, nhưng đối tượng objCopy không thay đổi</span>\nobj<span class=\"token punctuation\">.</span>d <span class=\"token operator\">=</span> <span class=\"token number\">4</span><span class=\"token punctuation\">;</span>\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token constant\">JSON</span><span class=\"token punctuation\">.</span><span class=\"token function\">stringify</span><span class=\"token punctuation\">(</span>obj<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// {\"a\":1,\"b\":2,\"c\":3,\"d\":4}</span>\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token constant\">JSON</span><span class=\"token punctuation\">.</span><span class=\"token function\">stringify</span><span class=\"token punctuation\">(</span>objCopy<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// {\"a\":1,\"b\":2,\"c\":3}</span></code></pre></div>\n<p>Rõ ràng, cách sử dụng cú pháp spread <strong>ngắn gọn hơn</strong> việc sử dụng <code>Object.assign</code> như sau:</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token comment\">// copy object</span>\n<span class=\"token keyword\">let</span> objCopy <span class=\"token operator\">=</span> Object<span class=\"token punctuation\">.</span><span class=\"token function\">assign</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> obj<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// copy mảng</span>\n<span class=\"token keyword\">let</span> arrCopy <span class=\"token operator\">=</span> Object<span class=\"token punctuation\">.</span><span class=\"token function\">assign</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> arr<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<h2 id=\"phân-biệt-2-loại-cú-pháp-dấu-ba-chấm\" style=\"position:relative;\"><a href=\"#ph%C3%A2n-bi%E1%BB%87t-2-lo%E1%BA%A1i-c%C3%BA-ph%C3%A1p-d%E1%BA%A5u-ba-ch%E1%BA%A5m\" aria-label=\"phân biệt 2 loại cú pháp dấu ba chấm 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>Phân biệt 2 loại cú pháp dấu ba chấm</h2>\n<p>Như mình đã trình bày ở trên, cú pháp dấu ba chấm có thể dùng để:</p>\n<ul>\n<li>Lấy danh sách các tham số còn lại trong hàm</li>\n<li>Hoặc là cú pháp spread để tách mảng thành danh sách các tham số.</li>\n</ul>\n<p>Cách phân biệt hai loại cú pháp trên là:</p>\n<p>► Cú pháp lấy danh sách các tham số còn lại trong hàm</p>\n<p>Dấu <code>...</code> được sử dụng ở <strong>định nghĩa hàm</strong> và luôn đặt cuối trong danh sách các tham số.</p>\n<div class=\"gatsby-highlight has-highlighted-lines\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token comment\">// định nghĩa hàm</span>\n<span class=\"gatsby-highlight-code-line\"><span class=\"token keyword\">function</span> <span class=\"token function\">fn1</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">arg1<span class=\"token punctuation\">,</span> arg2<span class=\"token punctuation\">,</span> <span class=\"token operator\">...</span>args</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span></span>  <span class=\"token comment\">//</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// gọi hàm</span>\n<span class=\"token function\">fn1</span><span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token number\">3</span><span class=\"token punctuation\">,</span> <span class=\"token number\">4</span><span class=\"token punctuation\">,</span> <span class=\"token number\">5</span><span class=\"token punctuation\">,</span> <span class=\"token number\">6</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>► Cú pháp spread</p>\n<p>Dấu <code>...</code> được sử dụng ở <strong>lời gọi hàm</strong> (hoặc trong mảng, object) và có thể đặt ở bất kỳ đâu trong danh sách các tham số:</p>\n<div class=\"gatsby-highlight has-highlighted-lines\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token comment\">// định nghĩa hàm</span>\n<span class=\"token keyword\">function</span> <span class=\"token function\">fn1</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">arg1<span class=\"token punctuation\">,</span> arg2<span class=\"token punctuation\">,</span> arg3<span class=\"token punctuation\">,</span> arg4</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">//</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// gọi hàm</span>\n<span class=\"token keyword\">let</span> arr <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token number\">3</span><span class=\"token punctuation\">,</span> <span class=\"token number\">4</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n<span class=\"gatsby-highlight-code-line\"><span class=\"token function\">fn1</span><span class=\"token punctuation\">(</span><span class=\"token operator\">...</span>arr<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></span></code></pre></div>\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>Cú pháp ba chấm trong JavaScript có thể là cú pháp để lấy tham số còn lại trong hàm hoặc cú pháp spread.</p>\n<p>Cách đơn giản để phân biệt hai loại trên là:</p>\n<ul>\n<li><strong>Cú pháp để lấy tham số còn lại trong hàm</strong>: dấu ba chấm <code>...</code> được dùng ở định nghĩa hàm và luôn đặt ở cuối danh sách tham số.</li>\n<li><strong>Cú pháp spread</strong>: dấu ba chấm <code>...</code> được dùng ở lời gọi hàm (hoặc trong mảng, object) và có thể đặt ở bất kỳ đâu trong danh sách các tham số.</li>\n</ul>\n<p>Ứng dụng:</p>\n<ul>\n<li><strong>Cú pháp để lấy tham số còn lại trong hàm</strong>: được dùng để xây dựng hàm cho phép truyền vào số lượng tham số tùy ý.</li>\n<li><strong>Cú pháp spread</strong>: được dùng để tách mảng thành danh sách các tham số truyền vào hàm hoặc ghép/copy mảng, ghép/copy object.</li>\n</ul>","timeToRead":10,"excerpt":"Rất nhiều hàm trong JavaScript hỗ trợ truyền vào số lượng tham số không giới hạn, ví dụ: Math.max(arg1, arg2, ..., argN): trả về giá trị lớn…","frontmatter":{"directory":"JavaScript","title":"Dấu ba chấm trong JavaScript","date":"2017-06-13T20:30:00Z","tags":["Hàm"],"description":"Cú pháp dấu ba chấm trong JavaScript được sử dụng trong rất nhiều hàm, cho phép truyền tham số vào hàm không giới hạn số lượng hoặc cú pháp spread.","keywords":"dấu ba chấm trong JavaScript","cover":{"childImageSharp":{"gatsbyImageData":{"layout":"fixed","backgroundColor":"#283838","images":{"fallback":{"src":"/static/af7085ca0b293e63fcccdea23ef5bb47/bc51f/dau-ba-cham-trong-javascript.png","srcSet":"/static/af7085ca0b293e63fcccdea23ef5bb47/bc51f/dau-ba-cham-trong-javascript.png 660w","sizes":"660px"},"sources":[{"srcSet":"/static/af7085ca0b293e63fcccdea23ef5bb47/2b2b5/dau-ba-cham-trong-javascript.webp 660w","type":"image/webp","sizes":"660px"}]},"width":660,"height":400}}},"update":"2021-12-23T07:15:00Z"},"fields":{"slug":"/dau-ba-cham-trong-javascript/","date":"2017-06-13T20:30:00.000Z"}},"sameSeries":{"totalCount":10,"edges":[{"node":{"fields":{"slug":"/ham-de-quy-trong-javascript/","date":"2017-06-12T20:30:00.000Z"},"excerpt":"Hàm đệ quy trong JavaScript chính là một hàm tự gọi lại chính nó. Ví dụ sau in ra Hello world! n lần sử dụng hàm đệ quy: Kết quả: Đây chỉ là…","timeToRead":9,"frontmatter":{"title":"Hàm đệ quy trong JavaScript","shortTitle":null,"tags":["Hàm"],"cover":{"childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#283838","images":{"fallback":{"src":"/static/c816b29939558d0d7cf4f3124704475b/bc51f/ham-de-quy-trong-javascript.png","srcSet":"/static/c816b29939558d0d7cf4f3124704475b/41200/ham-de-quy-trong-javascript.png 165w,\n/static/c816b29939558d0d7cf4f3124704475b/f979a/ham-de-quy-trong-javascript.png 330w,\n/static/c816b29939558d0d7cf4f3124704475b/bc51f/ham-de-quy-trong-javascript.png 660w","sizes":"(min-width: 660px) 660px, 100vw"},"sources":[{"srcSet":"/static/c816b29939558d0d7cf4f3124704475b/322ad/ham-de-quy-trong-javascript.webp 165w,\n/static/c816b29939558d0d7cf4f3124704475b/de3b3/ham-de-quy-trong-javascript.webp 330w,\n/static/c816b29939558d0d7cf4f3124704475b/2b2b5/ham-de-quy-trong-javascript.webp 660w","type":"image/webp","sizes":"(min-width: 660px) 660px, 100vw"}]},"width":660,"height":400}}},"date":"2017-06-12T20:30:00Z","update":"2021-12-22T20:30:00Z","series":"JavaScript: Kiến thức nâng cao về hàm"}}},{"node":{"fields":{"slug":"/dau-ba-cham-trong-javascript/","date":"2017-06-13T20:30:00.000Z"},"excerpt":"Rất nhiều hàm trong JavaScript hỗ trợ truyền vào số lượng tham số không giới hạn, ví dụ: Math.max(arg1, arg2, ..., argN): trả về giá trị lớn…","timeToRead":10,"frontmatter":{"title":"Dấu ba chấm trong JavaScript","shortTitle":null,"tags":["Hàm"],"cover":{"childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#283838","images":{"fallback":{"src":"/static/af7085ca0b293e63fcccdea23ef5bb47/bc51f/dau-ba-cham-trong-javascript.png","srcSet":"/static/af7085ca0b293e63fcccdea23ef5bb47/41200/dau-ba-cham-trong-javascript.png 165w,\n/static/af7085ca0b293e63fcccdea23ef5bb47/f979a/dau-ba-cham-trong-javascript.png 330w,\n/static/af7085ca0b293e63fcccdea23ef5bb47/bc51f/dau-ba-cham-trong-javascript.png 660w","sizes":"(min-width: 660px) 660px, 100vw"},"sources":[{"srcSet":"/static/af7085ca0b293e63fcccdea23ef5bb47/322ad/dau-ba-cham-trong-javascript.webp 165w,\n/static/af7085ca0b293e63fcccdea23ef5bb47/de3b3/dau-ba-cham-trong-javascript.webp 330w,\n/static/af7085ca0b293e63fcccdea23ef5bb47/2b2b5/dau-ba-cham-trong-javascript.webp 660w","type":"image/webp","sizes":"(min-width: 660px) 660px, 100vw"}]},"width":660,"height":400}}},"date":"2017-06-13T20:30:00Z","update":"2021-12-23T07:15:00Z","series":"JavaScript: Kiến thức nâng cao về hàm"}}},{"node":{"fields":{"slug":"/tim-hieu-javascript-closures/","date":"2017-06-14T06:35:17.000Z"},"excerpt":"Closure trong JS là một trong những khái niệm quan trọng. Việc nắm chắc JavaScript closure là gì và cách sử dụng closure trong JavaScript…","timeToRead":9,"frontmatter":{"title":"Closure là gì? Tìm hiểu closure trong JS","shortTitle":null,"tags":["Hàm"],"cover":{"childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#283838","images":{"fallback":{"src":"/static/9b2f7c91c5fbcdf69e1e1a33952e7418/bc51f/tim-hieu-javascript-closures.png","srcSet":"/static/9b2f7c91c5fbcdf69e1e1a33952e7418/41200/tim-hieu-javascript-closures.png 165w,\n/static/9b2f7c91c5fbcdf69e1e1a33952e7418/f979a/tim-hieu-javascript-closures.png 330w,\n/static/9b2f7c91c5fbcdf69e1e1a33952e7418/bc51f/tim-hieu-javascript-closures.png 660w","sizes":"(min-width: 660px) 660px, 100vw"},"sources":[{"srcSet":"/static/9b2f7c91c5fbcdf69e1e1a33952e7418/322ad/tim-hieu-javascript-closures.webp 165w,\n/static/9b2f7c91c5fbcdf69e1e1a33952e7418/de3b3/tim-hieu-javascript-closures.webp 330w,\n/static/9b2f7c91c5fbcdf69e1e1a33952e7418/2b2b5/tim-hieu-javascript-closures.webp 660w","type":"image/webp","sizes":"(min-width: 660px) 660px, 100vw"}]},"width":660,"height":400}}},"date":"2017-06-14T06:35:17Z","update":"2021-12-25T07:00:00Z","series":"JavaScript: Kiến thức nâng cao về hàm"}}},{"node":{"fields":{"slug":"/var-trong-javascript-va-cach-su-dung-iife/","date":"2017-06-15T06:20:00.000Z"},"excerpt":"Var trong JavaScript là một cách cũ để khai báo biến. Và bạn không nên sử dụng var nữa, mà thay vào đó là sử dụng let hoặc const. Tuy nhiên…","timeToRead":6,"frontmatter":{"title":"Var trong JavaScript và cách sử dụng IIFE","shortTitle":"Var trong JavaScript và sử dụng IIFE","tags":["Hàm","Biến"],"cover":{"childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#283838","images":{"fallback":{"src":"/static/191efc837cd96aa4891ae1eb3975bfc4/bc51f/var-trong-javascript-va-cach-su-dung-iife.png","srcSet":"/static/191efc837cd96aa4891ae1eb3975bfc4/41200/var-trong-javascript-va-cach-su-dung-iife.png 165w,\n/static/191efc837cd96aa4891ae1eb3975bfc4/f979a/var-trong-javascript-va-cach-su-dung-iife.png 330w,\n/static/191efc837cd96aa4891ae1eb3975bfc4/bc51f/var-trong-javascript-va-cach-su-dung-iife.png 660w","sizes":"(min-width: 660px) 660px, 100vw"},"sources":[{"srcSet":"/static/191efc837cd96aa4891ae1eb3975bfc4/322ad/var-trong-javascript-va-cach-su-dung-iife.webp 165w,\n/static/191efc837cd96aa4891ae1eb3975bfc4/de3b3/var-trong-javascript-va-cach-su-dung-iife.webp 330w,\n/static/191efc837cd96aa4891ae1eb3975bfc4/2b2b5/var-trong-javascript-va-cach-su-dung-iife.webp 660w","type":"image/webp","sizes":"(min-width: 660px) 660px, 100vw"}]},"width":660,"height":400}}},"date":"2017-06-15T06:20:00Z","update":"2021-12-27T20:00:00Z","series":"JavaScript: Kiến thức nâng cao về hàm"}}},{"node":{"fields":{"slug":"/doi-tuong-global-trong-javascript/","date":"2017-06-16T06:20:00.000Z"},"excerpt":"Bài viết này giúp bạn tìm hiểu về đối tượng global trong JavaScript. Qua đây, bạn biết khi nào nên sử dụng đối tượng global. Đối tượng…","timeToRead":4,"frontmatter":{"title":"Đối tượng global trong JavaScript","shortTitle":null,"tags":["Hàm","Object"],"cover":{"childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#283838","images":{"fallback":{"src":"/static/1c2321a3e8f980abcde1bfc0e4ade5f6/bc51f/doi-tuong-global-trong-javascript.png","srcSet":"/static/1c2321a3e8f980abcde1bfc0e4ade5f6/41200/doi-tuong-global-trong-javascript.png 165w,\n/static/1c2321a3e8f980abcde1bfc0e4ade5f6/f979a/doi-tuong-global-trong-javascript.png 330w,\n/static/1c2321a3e8f980abcde1bfc0e4ade5f6/bc51f/doi-tuong-global-trong-javascript.png 660w","sizes":"(min-width: 660px) 660px, 100vw"},"sources":[{"srcSet":"/static/1c2321a3e8f980abcde1bfc0e4ade5f6/322ad/doi-tuong-global-trong-javascript.webp 165w,\n/static/1c2321a3e8f980abcde1bfc0e4ade5f6/de3b3/doi-tuong-global-trong-javascript.webp 330w,\n/static/1c2321a3e8f980abcde1bfc0e4ade5f6/2b2b5/doi-tuong-global-trong-javascript.webp 660w","type":"image/webp","sizes":"(min-width: 660px) 660px, 100vw"}]},"width":660,"height":400}}},"date":"2017-06-16T06:20:00Z","update":"2021-12-27T21:15:00Z","series":"JavaScript: Kiến thức nâng cao về hàm"}}},{"node":{"fields":{"slug":"/function-object-trong-javascript/","date":"2017-06-17T06:20:00.000Z"},"excerpt":"Function trong JavaScript cũng là một loại object. Vì vậy, bạn có thể thêm/xóa thuộc tính vào function hoặc truyền qua hàm khác bởi tham…","timeToRead":9,"frontmatter":{"title":"Function object trong JavaScript","shortTitle":null,"tags":["Hàm","Object"],"cover":{"childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#283838","images":{"fallback":{"src":"/static/400488f0f0a74e1e67ccbbdc6c5c33f0/bc51f/function-object-trong-javascript.png","srcSet":"/static/400488f0f0a74e1e67ccbbdc6c5c33f0/41200/function-object-trong-javascript.png 165w,\n/static/400488f0f0a74e1e67ccbbdc6c5c33f0/f979a/function-object-trong-javascript.png 330w,\n/static/400488f0f0a74e1e67ccbbdc6c5c33f0/bc51f/function-object-trong-javascript.png 660w","sizes":"(min-width: 660px) 660px, 100vw"},"sources":[{"srcSet":"/static/400488f0f0a74e1e67ccbbdc6c5c33f0/322ad/function-object-trong-javascript.webp 165w,\n/static/400488f0f0a74e1e67ccbbdc6c5c33f0/de3b3/function-object-trong-javascript.webp 330w,\n/static/400488f0f0a74e1e67ccbbdc6c5c33f0/2b2b5/function-object-trong-javascript.webp 660w","type":"image/webp","sizes":"(min-width: 660px) 660px, 100vw"}]},"width":660,"height":400}}},"date":"2017-06-17T06:20:00Z","update":"2021-12-28T20:00:00Z","series":"JavaScript: Kiến thức nâng cao về hàm"}}},{"node":{"fields":{"slug":"/cu-phap-new-function-trong-javascript/","date":"2017-06-18T06:20:00.000Z"},"excerpt":"Cú pháp new Function trong JavaScript là một cách khác để định nghĩa hàm. Cách này ít khi được sử dụng, nhưng đôi khi lại rất hữu ích. Cú…","timeToRead":4,"frontmatter":{"title":"Cú pháp new Function trong JavaScript","shortTitle":null,"tags":["Hàm"],"cover":{"childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#283838","images":{"fallback":{"src":"/static/b6d65cda6609acf9edf70a006747b3d8/bc51f/cu-phap-new-function-trong-javascript.png","srcSet":"/static/b6d65cda6609acf9edf70a006747b3d8/41200/cu-phap-new-function-trong-javascript.png 165w,\n/static/b6d65cda6609acf9edf70a006747b3d8/f979a/cu-phap-new-function-trong-javascript.png 330w,\n/static/b6d65cda6609acf9edf70a006747b3d8/bc51f/cu-phap-new-function-trong-javascript.png 660w","sizes":"(min-width: 660px) 660px, 100vw"},"sources":[{"srcSet":"/static/b6d65cda6609acf9edf70a006747b3d8/322ad/cu-phap-new-function-trong-javascript.webp 165w,\n/static/b6d65cda6609acf9edf70a006747b3d8/de3b3/cu-phap-new-function-trong-javascript.webp 330w,\n/static/b6d65cda6609acf9edf70a006747b3d8/2b2b5/cu-phap-new-function-trong-javascript.webp 660w","type":"image/webp","sizes":"(min-width: 660px) 660px, 100vw"}]},"width":660,"height":400}}},"date":"2017-06-18T06:20:00Z","update":"2021-12-29T20:00:00Z","series":"JavaScript: Kiến thức nâng cao về hàm"}}},{"node":{"fields":{"slug":"/ham-settimeout-trong-javascript/","date":"2017-06-19T06:20:00.000Z"},"excerpt":"Đôi khi bạn cần phải thực hiện hành động sau một khoảng thời gian nhất định. Để thực hiện điều này, bạn có thể sử dụng phương thức…","timeToRead":10,"frontmatter":{"title":"Hàm setTimeout trong JavaScript","shortTitle":null,"tags":["Hàm"],"cover":{"childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#283838","images":{"fallback":{"src":"/static/108ab4f763fc851f2f9f529c413bb9fc/bc51f/ham-settimeout-trong-javascript.png","srcSet":"/static/108ab4f763fc851f2f9f529c413bb9fc/41200/ham-settimeout-trong-javascript.png 165w,\n/static/108ab4f763fc851f2f9f529c413bb9fc/f979a/ham-settimeout-trong-javascript.png 330w,\n/static/108ab4f763fc851f2f9f529c413bb9fc/bc51f/ham-settimeout-trong-javascript.png 660w","sizes":"(min-width: 660px) 660px, 100vw"},"sources":[{"srcSet":"/static/108ab4f763fc851f2f9f529c413bb9fc/322ad/ham-settimeout-trong-javascript.webp 165w,\n/static/108ab4f763fc851f2f9f529c413bb9fc/de3b3/ham-settimeout-trong-javascript.webp 330w,\n/static/108ab4f763fc851f2f9f529c413bb9fc/2b2b5/ham-settimeout-trong-javascript.webp 660w","type":"image/webp","sizes":"(min-width: 660px) 660px, 100vw"}]},"width":660,"height":400}}},"date":"2017-06-19T06:20:00Z","update":"2021-12-29T21:30:00Z","series":"JavaScript: Kiến thức nâng cao về hàm"}}},{"node":{"fields":{"slug":"/decorator-forwarding-ham-trong-javascript/","date":"2017-06-20T06:20:00.000Z"},"excerpt":"JavaScript giúp bạn xử lý hàm rất linh động. Bạn có thể truyền hàm vào hàm khác qua tham số hoặc sử dụng hàm như object. Và sau đây, mình sẽ…","timeToRead":12,"frontmatter":{"title":"Kỹ thuật decorator, forwarding của hàm trong JavaScript","shortTitle":"Decorator, forwarding của hàm trong JS","tags":["Hàm"],"cover":{"childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#283838","images":{"fallback":{"src":"/static/83596cfd0923fbf2c11629e3f3b70183/bc51f/decorator-forwarding-ham-trong-javascript.png","srcSet":"/static/83596cfd0923fbf2c11629e3f3b70183/41200/decorator-forwarding-ham-trong-javascript.png 165w,\n/static/83596cfd0923fbf2c11629e3f3b70183/f979a/decorator-forwarding-ham-trong-javascript.png 330w,\n/static/83596cfd0923fbf2c11629e3f3b70183/bc51f/decorator-forwarding-ham-trong-javascript.png 660w","sizes":"(min-width: 660px) 660px, 100vw"},"sources":[{"srcSet":"/static/83596cfd0923fbf2c11629e3f3b70183/322ad/decorator-forwarding-ham-trong-javascript.webp 165w,\n/static/83596cfd0923fbf2c11629e3f3b70183/de3b3/decorator-forwarding-ham-trong-javascript.webp 330w,\n/static/83596cfd0923fbf2c11629e3f3b70183/2b2b5/decorator-forwarding-ham-trong-javascript.webp 660w","type":"image/webp","sizes":"(min-width: 660px) 660px, 100vw"}]},"width":660,"height":400}}},"date":"2017-06-20T06:20:00Z","update":"2022-01-02T08:30:00Z","series":"JavaScript: Kiến thức nâng cao về hàm"}}},{"node":{"fields":{"slug":"/function-binding-trong-javascript/","date":"2017-06-21T06:20:00.000Z"},"excerpt":"Khi sử dụng phương thức của object làm hàm callback, ví dụ sử dụng với hàm setTimeout, thường xảy ra vấn đề là: \"mất giá trị this\". Sau đây…","timeToRead":8,"frontmatter":{"title":"Function binding trong JavaScript","shortTitle":null,"tags":["Hàm"],"cover":{"childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#283838","images":{"fallback":{"src":"/static/d71e212eaf1b1d572add09899f83a21d/bc51f/function-binding-trong-javascript.png","srcSet":"/static/d71e212eaf1b1d572add09899f83a21d/41200/function-binding-trong-javascript.png 165w,\n/static/d71e212eaf1b1d572add09899f83a21d/f979a/function-binding-trong-javascript.png 330w,\n/static/d71e212eaf1b1d572add09899f83a21d/bc51f/function-binding-trong-javascript.png 660w","sizes":"(min-width: 660px) 660px, 100vw"},"sources":[{"srcSet":"/static/d71e212eaf1b1d572add09899f83a21d/322ad/function-binding-trong-javascript.webp 165w,\n/static/d71e212eaf1b1d572add09899f83a21d/de3b3/function-binding-trong-javascript.webp 330w,\n/static/d71e212eaf1b1d572add09899f83a21d/2b2b5/function-binding-trong-javascript.webp 660w","type":"image/webp","sizes":"(min-width: 660px) 660px, 100vw"}]},"width":660,"height":400}}},"date":"2017-06-21T06:20:00Z","update":"2022-01-02T14:30:00Z","series":"JavaScript: Kiến thức nâng cao về hàm"}}}]}},"pageContext":{"slug":"/dau-ba-cham-trong-javascript/","series":"JavaScript: Kiến thức nâng cao về hàm","nextTitle":"Hàm đệ quy trong JavaScript","nextSlug":"/ham-de-quy-trong-javascript/","prevTitle":"Closure là gì? Tìm hiểu closure trong JS","prevSlug":"/tim-hieu-javascript-closures/","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": []}