{"componentChunkName":"component---src-templates-post-js","path":"/javascript-function-part-4-4-generator-high-order-function-and-handy-syntax/","result":{"data":{"markdownRemark":{"html":"<p><em>This tutorial is a part of the <a href=\"/learn-everything-about-javascript-in-one-course/\">Learn everything about Javascript in one course</a>.</em></p>\n<!-- `youtube:https://www.youtube.com/watch?v=tBdMdNLjtbU` -->\n<h2 id=\"generator-function-function-can-be-paused-and-continued\" style=\"position:relative;\"><a href=\"#generator-function-function-can-be-paused-and-continued\" aria-label=\"generator function function can be paused and continued 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>Generator function, function can be paused and continued</h2>\n<p>Generator function:</p>\n<ul>\n<li>is defined like normal function with an additional <code class=\"language-text\">*</code> (<code class=\"language-text\">function*</code>).</li>\n<li>can be paused and continued up to the next <code class=\"language-text\">yield</code> key word.</li>\n<li><code class=\"language-text\">yield</code> keyword can return a value (like return but does not finish the function).</li>\n<li>when invoked will return a Generator object (is used to control the pause or continue).</li>\n</ul>\n<div class=\"filename\">generator_function.js</div>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token comment\">// Generator function, function can be paused and continued</span>\n\n<span class=\"token keyword\">function</span><span class=\"token operator\">*</span> <span class=\"token function\">createGenerator</span><span class=\"token punctuation\">(</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 string\">'run to yield 1'</span><span class=\"token punctuation\">)</span>\n  <span class=\"token keyword\">yield</span> <span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">name</span><span class=\"token operator\">:</span> <span class=\"token string\">'Bruce'</span> <span class=\"token punctuation\">}</span> <span class=\"token comment\">// 1st pausable point</span>\n  <span class=\"token keyword\">yield</span> <span class=\"token comment\">// 2nd pausable point</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">'run to yield 3'</span><span class=\"token punctuation\">)</span>\n  <span class=\"token keyword\">yield</span> <span class=\"token number\">3</span> <span class=\"token comment\">// 3rd pausable point</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">'finish'</span><span class=\"token punctuation\">)</span>\n  <span class=\"token keyword\">return</span> <span class=\"token string\">'final'</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// Generator object</span>\n<span class=\"token keyword\">const</span> generator <span class=\"token operator\">=</span> <span class=\"token function\">createGenerator</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token comment\">// invoking Generator function will return a Generator object</span>\n\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>generator<span class=\"token punctuation\">.</span><span class=\"token function\">next</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token comment\">// function is paused at the 1st `yield`</span>\n<span class=\"token comment\">// run to yield 1</span>\n<span class=\"token comment\">// { value: { name: 'Bruce' }, done: false }</span>\n\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>generator<span class=\"token punctuation\">.</span><span class=\"token function\">next</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n<span class=\"token comment\">// { value: undefined, done: false }, the 2nd `yield` does not return anything</span>\n\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>generator<span class=\"token punctuation\">.</span><span class=\"token function\">next</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token comment\">// { value: 3, done: false }</span>\n\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>generator<span class=\"token punctuation\">.</span><span class=\"token function\">next</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n<span class=\"token comment\">// finish</span>\n<span class=\"token comment\">// { value: 'final', done: true }</span>\n\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>generator<span class=\"token punctuation\">.</span><span class=\"token function\">next</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token comment\">// { value: undefined, done: true }</span></code></pre></div>\n<h2 id=\"generator-object-object-to-control-to-pause-and-continue-generator-function\" style=\"position:relative;\"><a href=\"#generator-object-object-to-control-to-pause-and-continue-generator-function\" aria-label=\"generator object object to control to pause and continue generator function 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>Generator object, object to control to pause and continue Generator function</h2>\n<table>\n<thead>\n<tr>\n<th>Method</th>\n<th>Return</th>\n<th>Example</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code class=\"language-text\">generator.next()</code></td>\n<td>an object with <code class=\"language-text\">value</code>, <code class=\"language-text\">done</code> key:<br>- value: yielded by the yield expression. <br> - done: boolean, <code class=\"language-text\">true</code> if function finishes.</td>\n<td><code class=\"language-text\">{ value: { name: 'Bruce' }, done: false }</code></td>\n</tr>\n<tr>\n<td><code class=\"language-text\">generator.return(val)</code></td>\n<td>the <code class=\"language-text\">val</code> and finish the function</td>\n<td><code class=\"language-text\">{ value: val, done: true }</code></td>\n</tr>\n<tr>\n<td><code class=\"language-text\">generator.throw(new Error('your message'))</code></td>\n<td>throw exception within the function and finish the function. This will crash the program.</td>\n<td><code class=\"language-text\">Error: your message</code></td>\n</tr>\n</tbody>\n</table>\n<div class=\"filename\">gen_object_return.js</div>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token comment\">// Generator function, function can be paused and continued</span>\n\n<span class=\"token keyword\">function</span><span class=\"token operator\">*</span> <span class=\"token function\">createGenerator</span><span class=\"token punctuation\">(</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 string\">'run to yield 1'</span><span class=\"token punctuation\">)</span>\n  <span class=\"token keyword\">yield</span> <span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">name</span><span class=\"token operator\">:</span> <span class=\"token string\">'Bruce'</span> <span class=\"token punctuation\">}</span> <span class=\"token comment\">// 1st pausable point</span>\n  <span class=\"token keyword\">yield</span> <span class=\"token comment\">// 2nd pausable point</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">'run to yield 3'</span><span class=\"token punctuation\">)</span>\n  <span class=\"token keyword\">yield</span> <span class=\"token number\">3</span> <span class=\"token comment\">// 3rd pausable point</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">'finish'</span><span class=\"token punctuation\">)</span>\n  <span class=\"token keyword\">return</span> <span class=\"token string\">'final'</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// Generator object</span>\n<span class=\"token keyword\">const</span> generator <span class=\"token operator\">=</span> <span class=\"token function\">createGenerator</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token comment\">// invoking Generator function will return a Generator object</span>\n\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>generator<span class=\"token punctuation\">.</span><span class=\"token function\">next</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token comment\">// function is paused at the 1st `yield`</span>\n<span class=\"token comment\">// run to yield 1</span>\n<span class=\"token comment\">// { value: { name: 'Bruce' }, done: false }</span>\n\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>generator<span class=\"token punctuation\">.</span><span class=\"token function\">return</span><span class=\"token punctuation\">(</span><span class=\"token string\">'lala'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n<span class=\"token comment\">// { value: 'lala', done: true }, the return method return the passed in value and finish the function</span>\n\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>generator<span class=\"token punctuation\">.</span><span class=\"token function\">next</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token comment\">// { value: undefined, done: true }</span></code></pre></div>\n<div class=\"filename\">gen_object_throw.js</div>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token comment\">// Generator function, function can be paused and continued</span>\n\n<span class=\"token keyword\">function</span><span class=\"token operator\">*</span> <span class=\"token function\">createGenerator</span><span class=\"token punctuation\">(</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 string\">'run to yield 1'</span><span class=\"token punctuation\">)</span>\n  <span class=\"token keyword\">yield</span> <span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">name</span><span class=\"token operator\">:</span> <span class=\"token string\">'Bruce'</span> <span class=\"token punctuation\">}</span> <span class=\"token comment\">// 1st pausable point</span>\n  <span class=\"token keyword\">yield</span> <span class=\"token comment\">// 2nd pausable point</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">'run to yield 3'</span><span class=\"token punctuation\">)</span>\n  <span class=\"token keyword\">yield</span> <span class=\"token number\">3</span> <span class=\"token comment\">// 3rd pausable point</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">'finish'</span><span class=\"token punctuation\">)</span>\n  <span class=\"token keyword\">return</span> <span class=\"token string\">'final'</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// Generator object</span>\n<span class=\"token keyword\">const</span> generator <span class=\"token operator\">=</span> <span class=\"token function\">createGenerator</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token comment\">// invoking Generator function will return a Generator object</span>\n\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>generator<span class=\"token punctuation\">.</span><span class=\"token function\">next</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token comment\">// function is paused at the 1st `yield`</span>\n<span class=\"token comment\">// run to yield 1</span>\n<span class=\"token comment\">// { value: { name: 'Bruce' }, done: false }</span>\n\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>generator<span class=\"token punctuation\">.</span><span class=\"token function\">throw</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">new</span> <span class=\"token class-name\">Error</span><span class=\"token punctuation\">(</span><span class=\"token string\">'your message'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token comment\">// Error: your message</span></code></pre></div>\n<h2 id=\"high-order-function\" style=\"position:relative;\"><a href=\"#high-order-function\" aria-label=\"high order function 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>High-order function</h2>\n<p>is function that either:</p>\n<ul>\n<li>accepts other function as an argument.</li>\n<li>returns a function.</li>\n</ul>\n<p>Some examples are: function that accepts <a href=\"/javascript-function-part-3-4-synchronous-and-asynchronous/#callback-function-call-me-when-you-are-done\">callback</a>, <a href=\"/javascript-function-part-2-4-closure/#javascript-closure-example-2-memoization\">memoization function</a>, ... It's nothing new to us but the name <em>\"high-order function\"</em> is worth mentioned here because a lot of documents and blogs refer to this name.</p>\n<h2 id=\"the-arguments-object-in-function-holds-all-of-its-arguments\" style=\"position:relative;\"><a href=\"#the-arguments-object-in-function-holds-all-of-its-arguments\" aria-label=\"the arguments object in function holds all of its 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>The \"arguments\" object in function holds all of its arguments</h2>\n<p><code class=\"language-text\">arguments</code> object within a function:</p>\n<ul>\n<li>available to use within the function.</li>\n<li>contains all arguments passed into that function.</li>\n<li>is an array-like object (have limited methods and properties of array).</li>\n</ul>\n<div class=\"filename\">argument_object.js</div>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token comment\">// The \"arguments\" object in function holds all of its arguments</span>\n\n<span class=\"token keyword\">function</span> <span class=\"token function\">printAllArguments</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">a<span class=\"token punctuation\">,</span> b<span class=\"token punctuation\">,</span> c<span class=\"token punctuation\">,</span> d</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> <span class=\"token comment\">// (i)</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><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span> <span class=\"token comment\">// (ii)</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><span class=\"token number\">1</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span> <span class=\"token comment\">// (iii)</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><span class=\"token number\">2</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span> <span class=\"token comment\">// (iv)</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>length<span class=\"token punctuation\">)</span> <span class=\"token comment\">// (v)</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>a<span class=\"token punctuation\">,</span>b<span class=\"token punctuation\">,</span>c<span class=\"token punctuation\">)</span> <span class=\"token comment\">// (vi)</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token function\">printAllArguments</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 string\">'d'</span><span class=\"token punctuation\">)</span>\n<span class=\"token comment\">// [Arguments] { '0': 1, '1': 2, '2': 3, '3': 'd' }, (i)</span>\n<span class=\"token comment\">// 1, (ii)</span>\n<span class=\"token comment\">// 2, (ii)</span>\n<span class=\"token comment\">// 3, (iv)</span>\n<span class=\"token comment\">// 4, (v)</span>\n<span class=\"token comment\">// 1 2 3, (vi)</span></code></pre></div>\n<h2 id=\"spread-syntax-code-classlanguage-textcode-spead-given-value-into-list\" style=\"position:relative;\"><a href=\"#spread-syntax-code-classlanguage-textcode-spead-given-value-into-list\" aria-label=\"spread syntax code classlanguage textcode spead given value into list 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>Spread syntax <code class=\"language-text\">...</code>, spead given value into list</h2>\n<p>Spread syntax <code class=\"language-text\">...</code> turns <code class=\"language-text\">array</code>, <code class=\"language-text\">string</code>, <code class=\"language-text\">object</code> => list of <code class=\"language-text\">arguments</code>.</p>\n<div class=\"filename\">spread_syntax.js</div>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token comment\">// Handy syntax: spread syntax ..., spead given value into list</span>\n\n<span class=\"token comment\">// spread array to list of arguments: ...array</span>\n<span class=\"token keyword\">const</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 string\">'d'</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 comment\">// [ 1, 2, 3, 'd' ]</span>\n\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token operator\">...</span>arr<span class=\"token punctuation\">)</span> <span class=\"token comment\">// spread syntax</span>\n<span class=\"token comment\">// 1 2 3 d</span>\n<span class=\"token comment\">// equals to: console.log(arr[0], arr[1], arr[2], arr[3])</span>\n<span class=\"token comment\">// hence \"spread\"</span>\n\n<span class=\"token keyword\">const</span> arr2 <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token operator\">...</span>arr<span class=\"token punctuation\">,</span> <span class=\"token string\">'a'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'b'</span><span class=\"token punctuation\">]</span>\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>arr2<span class=\"token punctuation\">)</span> <span class=\"token comment\">// [ 1, 2, 3, 'd', 'a', 'b' ]</span>\n\n<span class=\"token keyword\">function</span> <span class=\"token function\">print</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">a<span class=\"token punctuation\">,</span> b<span class=\"token punctuation\">,</span> c<span class=\"token punctuation\">,</span> d</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>d<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token function\">print</span><span class=\"token punctuation\">(</span><span class=\"token operator\">...</span>arr<span class=\"token punctuation\">)</span> <span class=\"token comment\">// d</span>\n\n\n<span class=\"token comment\">// spread string, ...string</span>\n<span class=\"token keyword\">const</span> str <span class=\"token operator\">=</span> <span class=\"token string\">'abc'</span>\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token operator\">...</span>str<span class=\"token punctuation\">)</span> <span class=\"token comment\">// a b c</span>\n<span class=\"token comment\">// equals to: console.log(str[0], str[1], str[2])</span>\n\n\n<span class=\"token comment\">// spread object, ...object</span>\n<span class=\"token keyword\">const</span> obj <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token literal-property property\">a</span><span class=\"token operator\">:</span> <span class=\"token string\">'b'</span><span class=\"token punctuation\">,</span>\n  <span class=\"token literal-property property\">c</span><span class=\"token operator\">:</span> <span class=\"token number\">1</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token keyword\">const</span> obj2 <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token operator\">...</span>obj<span class=\"token punctuation\">,</span> <span class=\"token comment\">// spread syntax</span>\n  <span class=\"token literal-property property\">d</span><span class=\"token operator\">:</span> <span class=\"token number\">2</span>\n<span class=\"token punctuation\">}</span>\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>obj2<span class=\"token punctuation\">)</span> <span class=\"token comment\">// { a: 'b', c: 1, d: 2 }</span></code></pre></div>\n<h2 id=\"destructuring-assignment-syntax-to-unpack-values-into-distinct-variables\" style=\"position:relative;\"><a href=\"#destructuring-assignment-syntax-to-unpack-values-into-distinct-variables\" aria-label=\"destructuring assignment syntax to unpack values into distinct variables 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>Destructuring assignment syntax to unpack values into distinct variables</h2>\n<p>Values to destructure can be <code class=\"language-text\">arrays</code> or <code class=\"language-text\">object properties</code>. Destructuring also called <em>\"treeshaking\"</em>. We do variable assignment at the same time.</p>\n<div class=\"filename\">destructuring.js</div>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token comment\">// Destructuring assignment syntax to unpack values into distinct variables</span>\n\n<span class=\"token comment\">// unpack and assign from array</span>\n<span class=\"token keyword\">const</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 string\">'a'</span><span class=\"token punctuation\">]</span>\n<span class=\"token keyword\">const</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">,</span>val1<span class=\"token punctuation\">,</span><span class=\"token punctuation\">,</span> val3<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> arr <span class=\"token comment\">// destructuring</span>\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>val1<span class=\"token punctuation\">)</span> <span class=\"token comment\">// 2</span>\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>val3<span class=\"token punctuation\">)</span> <span class=\"token comment\">// a</span>\n\n<span class=\"token comment\">// unpack and assign from object properties</span>\n<span class=\"token keyword\">const</span> obj <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token literal-property property\">a</span><span class=\"token operator\">:</span> <span class=\"token string\">'b'</span><span class=\"token punctuation\">,</span>\n  <span class=\"token string-property property\">'x-y'</span><span class=\"token operator\">:</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span>\n  <span class=\"token literal-property property\">c</span><span class=\"token operator\">:</span> <span class=\"token string\">'d'</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token keyword\">const</span> <span class=\"token punctuation\">{</span> a<span class=\"token punctuation\">,</span> c <span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> obj <span class=\"token comment\">// destructuring and assign variable the same names with object key</span>\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>a<span class=\"token punctuation\">)</span> <span class=\"token comment\">// b</span>\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>c<span class=\"token punctuation\">)</span> <span class=\"token comment\">// d</span>\n\n<span class=\"token keyword\">const</span> <span class=\"token punctuation\">{</span> \n  <span class=\"token literal-property property\">a</span><span class=\"token operator\">:</span>val5<span class=\"token punctuation\">,</span>\n  <span class=\"token literal-property property\">c</span><span class=\"token operator\">:</span> val6<span class=\"token punctuation\">,</span>\n  <span class=\"token string-property property\">'x-y'</span><span class=\"token operator\">:</span> xy<span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> obj <span class=\"token comment\">// destructuring and assign variable the DIFFERENT names with object key</span>\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>val5<span class=\"token punctuation\">)</span> <span class=\"token comment\">// b</span>\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>val6<span class=\"token punctuation\">)</span> <span class=\"token comment\">// d</span>\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>xy<span class=\"token punctuation\">)</span> <span class=\"token comment\">// 1</span></code></pre></div>\n<h2 id=\"set-default-argument-value-for-a-function\" style=\"position:relative;\"><a href=\"#set-default-argument-value-for-a-function\" aria-label=\"set default argument value for a function 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>Set default argument value for a function</h2>\n<p>When an argument is missing, the default value is used. When argument is present, default value is ignored.</p>\n<div class=\"filename\">default_value.js</div>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token comment\">// Set default argument value for function</span>\n\n<span class=\"token comment\">// in this function, the default values for a is 1,</span>\n<span class=\"token comment\">// default b is false</span>\n<span class=\"token comment\">// default c is 'abc'</span>\n<span class=\"token keyword\">function</span> <span class=\"token function\">print</span><span class=\"token punctuation\">(</span>a <span class=\"token operator\">=</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span> b <span class=\"token operator\">=</span> <span class=\"token boolean\">false</span><span class=\"token punctuation\">,</span> c <span class=\"token operator\">=</span> <span class=\"token string\">'abc'</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>a<span class=\"token punctuation\">)</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>b<span class=\"token punctuation\">)</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>c<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token function\">print</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token comment\">// no argument present will use default values</span>\n<span class=\"token comment\">// 1</span>\n<span class=\"token comment\">// false</span>\n<span class=\"token comment\">// abc</span>\n\n<span class=\"token function\">print</span><span class=\"token punctuation\">(</span><span class=\"token number\">2</span><span class=\"token punctuation\">,</span><span class=\"token number\">2</span><span class=\"token punctuation\">,</span><span class=\"token number\">2</span><span class=\"token punctuation\">)</span> <span class=\"token comment\">// no default value used</span>\n<span class=\"token comment\">// 2</span>\n<span class=\"token comment\">// 2</span>\n<span class=\"token comment\">// 2</span></code></pre></div>\n<h2 id=\"destructuring-and-default-value-for-function-argument\" style=\"position:relative;\"><a href=\"#destructuring-and-default-value-for-function-argument\" aria-label=\"destructuring and default value for function argument 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>Destructuring and default value for function argument</h2>\n<p>It's very common that destructuring and default value are used at the same time where we define a function. Here is an example to help you get familiar with this pattern.</p>\n<div class=\"filename\">destructuring_default.js</div>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token comment\">// Set default argument value for function</span>\n\n<span class=\"token comment\">// in this function, the argument passed in is an object, we then:</span>\n<span class=\"token comment\">// 1. destructure it</span>\n<span class=\"token comment\">// 1. give destructured input default values</span>\n<span class=\"token keyword\">function</span> <span class=\"token function\">print</span><span class=\"token punctuation\">(</span><span class=\"token parameter\"><span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">a</span><span class=\"token operator\">:</span> val1 <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> val2 <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> <span class=\"token literal-property property\">c</span><span class=\"token operator\">:</span> val3 <span class=\"token operator\">=</span> <span class=\"token boolean\">false</span> <span class=\"token punctuation\">}</span></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>val1<span class=\"token punctuation\">)</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>val2<span class=\"token punctuation\">)</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>val3<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token function\">print</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\">// no argument present will use default values</span>\n<span class=\"token comment\">// 1</span>\n<span class=\"token comment\">// {}</span>\n<span class=\"token comment\">// false</span>\n\n<span class=\"token function\">print</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">a</span><span class=\"token operator\">:</span> <span class=\"token number\">3</span><span class=\"token punctuation\">,</span> <span class=\"token literal-property property\">b</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">d</span><span class=\"token operator\">:</span> <span class=\"token string\">'f'</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> <span class=\"token literal-property property\">c</span><span class=\"token operator\">:</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span> <span class=\"token comment\">// no default value used</span>\n<span class=\"token comment\">// 3</span>\n<span class=\"token comment\">// { d: 'f' }</span>\n<span class=\"token comment\">// true</span></code></pre></div>\n<h2 id=\"summary\" style=\"position:relative;\"><a href=\"#summary\" aria-label=\"summary 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>Summary</h2>\n<ul>\n<li><code class=\"language-text\">Generator function</code> is function which can be paused and continued.</li>\n<li><code class=\"language-text\">High-order function</code> is function that either accepts other function as an argument and/or returns a function.</li>\n<li><code class=\"language-text\">Spread</code>, <code class=\"language-text\">destructuring assignment</code> and <code class=\"language-text\">default value</code> syntax are widely used for shorthand.</li>\n</ul>","timeToRead":6,"excerpt":"This tutorial is a part of the Learn everything about Javascript in one course. Generator function, function can be paused and continued…","frontmatter":{"title":"Javascript function part 4/4: generator, high-order function and handy syntax","thumbnail":{"childImageSharp":{"fixed":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsTAAALEwEAmpwYAAADFklEQVQ4y4VVSU8UQRTugaMHLlz8DaIwyBZkHWPEGeieAY0HJUSuxsTEhIuJB8ETRMJBXBITFK8evAoXY2I0hGCCgwONrDrAALOwKXRTz/dVd016gIROXup1V9VXX31vaU3zPKkZXUuZhvJ9bPmpGSM/M2v4tmbDGnznm+7DmrSpyz3HHgnkTmxEg/DztVMeF9iz38gFVGPaNPJc/wxbO9sQ2wjbKNswWydbgcPQ8OWCsp8yc8B8rn+DbdGOtxGtthFG5R+utBHPxdk6sDZjhnMISaobUyEvsy5s+rsYwUbLYzbG5LRu7c6HGfw65nu8TLN6Ks3ADGC8QACAg0Hbv6QvGEhszxlibyFM/B3gNq1J0E4vhqYi5mq26DKTYImoLpYmmgUfwIzDtDDeLCY/BcVaVMeh9g4z5bUJtsIsloddO3TihdZmTKfDeES8HQzQ5UApbTH4y6cNVF9XSmXlJfSoq0bsL4dpc1o/cFnezbJEbrkvQxCdc8vaiOlCrETEq/5Gqqry0+y3EJ0rukC9j+to/adO0c9B2nKksECCx/eulnkaktYFHFEMAWjHI/R6oJGqq/2UmNLpzu1KKq8oof4n9bQy2SK1TbI0B79bATihgqOhAlzAUfc0m68saL2V3r0IUAWDZFhD6Pi8r4Eqq0ro1s0KQpCg4/6yBPyeBfRceVisOgyZkYA9fHCJamv9tM4Mx0ev0e6CQX3ddVR0vlgGi6NuW38k4AcPYDYonWDImyyOJF29clEU+4vpzbMArf5ooWBTGdXU+KUEg70NYnfeAEsVlPueoGTTpgAVsMdpw+xsMIp9CYmdeee6c2PNNPaxScx8DYk9TiFcd3sOo57kfWe9KZhlyZMduDYS999S2MYVoRUSm4GRKoqZrBpKSHb3JIbpSKel3ZJRdcygPbgGTseVVNkhogDCN8y5YAPHSs9b2Bkzonx0lASAoes+pwZMNghHs6RidrRbndS+lKaFqAAkLfIMqYFoIgBKs6Pty9MPDe1IXzu9wZpGToNNx1pO7tqq86pfAMoJTJR5fwGpE34B/wEgbi1Y5n1kcAAAAABJRU5ErkJggg==","width":150,"height":150,"src":"/static/5e267e2ee412a23e797106ee564145a0/4148e/js.png","srcSet":"/static/5e267e2ee412a23e797106ee564145a0/4148e/js.png 1x,\n/static/5e267e2ee412a23e797106ee564145a0/de03e/js.png 1.5x"}}},"slug":"javascript-function-part-4-4-generator-high-order-function-and-handy-syntax","date":"2020-03-20T00:00:00.000Z","categories":["Javascript","Frontend","Backend"],"tags":["javascript","fundamentals"],"template":"post"},"fields":{"slug":"/javascript-function-part-4-4-generator-high-order-function-and-handy-syntax/","date":"2020-03-20T00:00:00.000Z"}}},"pageContext":{"slug":"/javascript-function-part-4-4-generator-high-order-function-and-handy-syntax/"}},"staticQueryHashes":[]}