{"componentChunkName":"component---src-templates-tags-js","path":"/tags/ES6/","result":{"data":{"allMarkdownRemark":{"totalCount":3,"edges":[{"node":{"id":"c3b9a071-ca6c-5ec3-a3f4-cf19e0df7a17","html":"<p>Well for a long time I wanted to write a blog post about migrating Angular 1.x to 2, however, before doing so I thought it is really helpful to write about some prerequisites of that.</p>\n<!--more-->\n<p>This is the third article in ES6 new features series.</p>\n<p><a href=\"/2016/07/06/es6-new-features-part-i/\">Part I</a></p>\n<p><a href=\"/2016/07/07/es6-new-features-part-ii/\">Part II</a></p>\n<h3 id=\"9-classes-in-es6\" style=\"position:relative;\"><a href=\"#9-classes-in-es6\" aria-label=\"9 classes in es6 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>9. Classes in ES6</h3>\n<p>In many ways, they are a sham. Javascript classes don’t really exist other than for cosmetic reasons. They are syntactic sugar over existing Javascript prototypical inheritance. The reason for this was to ensure backwards compatibility, classes merely give you a cleaner way to organise your code.</p>\n<p>If you love object-oriented programming (OOP), then you’ll love this feature. In ES5 there wan not a <em>class</em> keyword.</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"3196002849615409000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied to clipboard ✅\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`class myClass {\r\n  constructor(name = 'default', age = 80) {\r\n    this.name = name\r\n    this.age = age\r\n  }\r\n\r\n  sayName() {\r\n    alert(this.name)\r\n  }\r\n\r\n  sayAge() {\r\n    alert(this.age)\r\n  }\r\n}\r\n\r\nconst myInstance = new myClass()\r\nmyInstance.sayName()`, `3196002849615409000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                Copy<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-javascript line-numbers\"><code class=\"language-javascript\"><span class=\"token keyword\">class</span> <span class=\"token class-name\">myClass</span> <span class=\"token punctuation\">{</span>\r\n  <span class=\"token function\">constructor</span><span class=\"token punctuation\">(</span>name <span class=\"token operator\">=</span> <span class=\"token string\">'default'</span><span class=\"token punctuation\">,</span> age <span class=\"token operator\">=</span> <span class=\"token number\">80</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\r\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>name <span class=\"token operator\">=</span> name\r\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>age <span class=\"token operator\">=</span> age\r\n  <span class=\"token punctuation\">}</span>\r\n\r\n  <span class=\"token function\">sayName</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\r\n    <span class=\"token function\">alert</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>name<span class=\"token punctuation\">)</span>\r\n  <span class=\"token punctuation\">}</span>\r\n\r\n  <span class=\"token function\">sayAge</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\r\n    <span class=\"token function\">alert</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>age<span class=\"token punctuation\">)</span>\r\n  <span class=\"token punctuation\">}</span>\r\n<span class=\"token punctuation\">}</span>\r\n\r\n<span class=\"token keyword\">const</span> myInstance <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">myClass</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\r\nmyInstance<span class=\"token punctuation\">.</span><span class=\"token function\">sayName</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>Notice that I’m using default parameter values for name and age. Also, method names don’t need to have the word <code class=\"language-text\">function</code> or the colon (<code class=\"language-text\">:</code>) anymore.</p>\n<p>When it comes to inheritance it is very similar to OOP programming languages such as C# or any other one. The basic inheritance can be implemented as follow:</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"29084582445396513000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied to clipboard ✅\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`class childClass extends myClass {\r\n  constructor(name, age) {\r\n    super(name, age)\r\n  }\r\n\r\n  // Override the someClass method above\r\n  sayName() {\r\n    // This will call someClass.sayName() triggering the old alert\r\n    // Which will just display our name\r\n    super.sayName()\r\n\r\n    // This will trigger the new alert which has labels and our age\r\n    alert('Name:' + this.name + ' Age:' + this.age)\r\n  }\r\n}\r\n\r\nconst myChild = new childClass('dwayne', 27)\r\nmyChild.sayName()`, `29084582445396513000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                Copy<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-javascript line-numbers\"><code class=\"language-javascript\"><span class=\"token keyword\">class</span> <span class=\"token class-name\">childClass</span> <span class=\"token keyword\">extends</span> <span class=\"token class-name\">myClass</span> <span class=\"token punctuation\">{</span>\r\n  <span class=\"token function\">constructor</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">name<span class=\"token punctuation\">,</span> age</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\r\n    <span class=\"token keyword\">super</span><span class=\"token punctuation\">(</span>name<span class=\"token punctuation\">,</span> age<span class=\"token punctuation\">)</span>\r\n  <span class=\"token punctuation\">}</span>\r\n\r\n  <span class=\"token comment\">// Override the someClass method above</span>\r\n  <span class=\"token function\">sayName</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\r\n    <span class=\"token comment\">// This will call someClass.sayName() triggering the old alert</span>\r\n    <span class=\"token comment\">// Which will just display our name</span>\r\n    <span class=\"token keyword\">super</span><span class=\"token punctuation\">.</span><span class=\"token function\">sayName</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\r\n\r\n    <span class=\"token comment\">// This will trigger the new alert which has labels and our age</span>\r\n    <span class=\"token function\">alert</span><span class=\"token punctuation\">(</span><span class=\"token string\">'Name:'</span> <span class=\"token operator\">+</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>name <span class=\"token operator\">+</span> <span class=\"token string\">' Age:'</span> <span class=\"token operator\">+</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>age<span class=\"token punctuation\">)</span>\r\n  <span class=\"token punctuation\">}</span>\r\n<span class=\"token punctuation\">}</span>\r\n\r\n<span class=\"token keyword\">const</span> myChild <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">childClass</span><span class=\"token punctuation\">(</span><span class=\"token string\">'dwayne'</span><span class=\"token punctuation\">,</span> <span class=\"token number\">27</span><span class=\"token punctuation\">)</span>\r\nmyChild<span class=\"token punctuation\">.</span><span class=\"token function\">sayName</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>Notice that to call the parent constructor, effortlessly invoke <code class=\"language-text\">super()</code> with expected parameters. Isn’t it amazing?</p>\n<h3 id=\"10-modules-in-es6\" style=\"position:relative;\"><a href=\"#10-modules-in-es6\" aria-label=\"10 modules in es6 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>10. Modules in ES6</h3>\n<p>As you might now, there were no native modules support in JavaScript before ES6. People came up with AMD, RequireJS, CommonJS and other workarounds. Now there are modules with <code class=\"language-text\">import</code> and <code class=\"language-text\">export</code> operands.</p>\n<p>The ES6 module standard has two parts:</p>\n<ul>\n<li>Declarative syntax (for importing and exporting)</li>\n<li>Programmatic loader API: to configure how modules are loaded and to conditionally load modules</li>\n</ul>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"62836335716950155000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied to clipboard ✅\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`export const myName = 'Yaser'\r\n\r\nexport function getCreditCardNumber() {\r\n  //Not implemented yet, you can leave yours\r\n  //in the comments for the moment 😉\r\n}`, `62836335716950155000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                Copy<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-javascript line-numbers\"><code class=\"language-javascript\"><span class=\"token keyword\">export</span> <span class=\"token keyword\">const</span> myName <span class=\"token operator\">=</span> <span class=\"token string\">'Yaser'</span>\r\n\r\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">function</span> <span class=\"token function\">getCreditCardNumber</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\r\n  <span class=\"token comment\">//Not implemented yet, you can leave yours</span>\r\n  <span class=\"token comment\">//in the comments for the moment 😉</span>\r\n<span class=\"token punctuation\">}</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>In other modules, we use <code class=\"language-text\">import {myName} from 'my-module'</code>syntax. For example:</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"64267233674568370000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied to clipboard ✅\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`import { myName, getCreditCardNumber } from 'module'\r\n\r\nconsole.log(myName) // Yaser`, `64267233674568370000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                Copy<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-javascript line-numbers\"><code class=\"language-javascript\"><span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> myName<span class=\"token punctuation\">,</span> getCreditCardNumber <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'module'</span>\r\n\r\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>myName<span class=\"token punctuation\">)</span> <span class=\"token comment\">// Yaser</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span></span></pre></div>\n<p>Or we can import everything as a variable in other modules and use it as an object literal:</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"50069660156420290000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied to clipboard ✅\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`import * as myData from 'module'\r\n\r\nconsole.log(myData.myName) // Yaser`, `50069660156420290000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                Copy<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-javascript line-numbers\"><code class=\"language-javascript\"><span class=\"token keyword\">import</span> <span class=\"token operator\">*</span> <span class=\"token keyword\">as</span> myData <span class=\"token keyword\">from</span> <span class=\"token string\">'module'</span>\r\n\r\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>myData<span class=\"token punctuation\">.</span>myName<span class=\"token punctuation\">)</span> <span class=\"token comment\">// Yaser</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span></span></pre></div>\n<p>Modules that only export single values are very popular in the <code class=\"language-text\">Node.js</code> community. But they are also common in front-end development where you often have constructors/classes for models, with one model per module. An ECMAScript 6 module can pick a <em>default export</em>, the most important exported value. Default exports are especially easy to import.</p>\n<p>The following ES6 module “is” a single function:</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"18127978349323782000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied to clipboard ✅\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`//------ myFunc.js ------\r\nexport default function () { ... };\r\n\r\n//------ main1.js ------\r\nimport myFunc from 'myFunc';\r\n\r\nmyFunc();`, `18127978349323782000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                Copy<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-javascript line-numbers\"><code class=\"language-javascript\"><span class=\"token comment\">//------ myFunc.js ------</span>\r\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> <span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span> <span class=\"token operator\">...</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\r\n\r\n<span class=\"token comment\">//------ main1.js ------</span>\r\n<span class=\"token keyword\">import</span> myFunc <span class=\"token keyword\">from</span> <span class=\"token string\">'myFunc'</span><span class=\"token punctuation\">;</span>\r\n\r\n<span class=\"token function\">myFunc</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>An ES6 module whose default export is a class looks as follows:</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"25488363905907300000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied to clipboard ✅\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`//------ MyClass.js ------\r\nexport default class { ... };\r\n\r\n//------ main2.js ------\r\nimport MyClass from 'MyClass';\r\nlet instance = new MyClass();`, `25488363905907300000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                Copy<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-javascript line-numbers\"><code class=\"language-javascript\"><span class=\"token comment\">//------ MyClass.js ------</span>\r\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> <span class=\"token keyword\">class</span> <span class=\"token punctuation\">{</span> <span class=\"token operator\">...</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\r\n\r\n<span class=\"token comment\">//------ main2.js ------</span>\r\n<span class=\"token keyword\">import</span> MyClass <span class=\"token keyword\">from</span> <span class=\"token string\">'MyClass'</span><span class=\"token punctuation\">;</span>\r\n<span class=\"token keyword\">let</span> instance <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">MyClass</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>And finally having both default and named exports together will look like something like the following code. I used some underscore metadata to show how it can be used and simplify everything.</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"40545785841179580000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied to clipboard ✅\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`//------ underscore.js ------\r\nexport default function (obj) {\r\n    ...\r\n};\r\nexport function each(obj, iterator, context) {\r\n    ...\r\n}\r\nexport { each as forEach };\r\n\r\n//------ main.js ------\r\nimport _, { each } from 'underscore';`, `40545785841179580000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                Copy<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-javascript line-numbers\"><code class=\"language-javascript\"><span class=\"token comment\">//------ underscore.js ------</span>\r\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> <span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">obj</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\r\n    <span class=\"token operator\">...</span>\r\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\r\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">function</span> <span class=\"token function\">each</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">obj<span class=\"token punctuation\">,</span> iterator<span class=\"token punctuation\">,</span> context</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\r\n    <span class=\"token operator\">...</span>\r\n<span class=\"token punctuation\">}</span>\r\n<span class=\"token keyword\">export</span> <span class=\"token punctuation\">{</span> each <span class=\"token keyword\">as</span> forEach <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\r\n\r\n<span class=\"token comment\">//------ main.js ------</span>\r\n<span class=\"token keyword\">import</span> _<span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span> each <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'underscore'</span><span class=\"token punctuation\">;</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<h3 id=\"11-how-to-use-it\" style=\"position:relative;\"><a href=\"#11-how-to-use-it\" aria-label=\"11 how to use it 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>11. How to use it</h3>\n<p>Well ES6 is not currently supported by all browsers and also those who does support it only have implemented part of it, so you need a safe way to utilise its power.</p>\n<p>Here there are a couple of options but apparently best of which is Babel (which is a compiler). You can run it as a standalone tool or use with your build system. There are Babel <a href=\"http://babeljs.io/docs/setup\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">plugins</a> for Grunt, Gulp and webpack (again my favourite).</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 768px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/7661763e0327bc0424519492e721976e/e5715/babel.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n    <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 59.25925925925925%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAYAAABiDJ37AAAACXBIWXMAAAsTAAALEwEAmpwYAAABcElEQVR42qWQ3UoCURDHzwOV66prQu6XF6HrEgSSeNNLdN0L9Ajdd5cSEXRVWURYQmR033olIoor+MF++G/n2LHuQh34MWfmzPzPzGH1qoWzUxU353k81mycHGs4qmTwdGmjXi3iobagcW1znq9s3F1YUW2Urwos3Ec5qmM7mQRsK41iXsF+UUF+LwU5EUcyRchIEYrMzwIRc68svIApaRnlkoHKoYlKOYfSgY6sugtVyyKRlBGTtiBJ25Div8SiOCa8OP/cMd1QUSiYMHIkpEPTdZimBiNC07Mrw9pfn/h4u0XjpYlm85XTar3DaTtwnBVoL2Bh6GMw6MF1R/A9D2EYYj6fY11jnkeCA4xGkaDvc8EgCPh5FaiHelkQBd1ulwuOx2NMJhNMp9Mls9mMe8oTVEOxqCWoxou24xOScqfTQb/fXzbTyuuuzQVd112+JKYi/pp45L/HuCBNRyvQX2xqXLDX62E4HPIp6WM3EfwGnjwH2lnKMS8AAAAASUVORK5CYII='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"babel\"\n        title=\"\"\n        src=\"/static/7661763e0327bc0424519492e721976e/e5715/babel.png\"\n        srcset=\"/static/7661763e0327bc0424519492e721976e/01bf6/babel.png 270w,\n/static/7661763e0327bc0424519492e721976e/07484/babel.png 540w,\n/static/7661763e0327bc0424519492e721976e/e5715/babel.png 768w\"\n        sizes=\"(max-width: 768px) 100vw, 768px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n        decoding=\"async\"\n      />\n  </a>\n    </span></p>","timeToRead":3,"frontmatter":{"title":"ES6 new features (Part III)","unformattedDate":"2016-07-11T00:00:00.000Z","date":"Jul 11, 2016","path":"/es6-new-features-part-iii/","author":"Yaser Adel Mehraban","tags":["class","ES6","module"],"thumbnail":{"childImageSharp":{"gatsbyImageData":{"layout":"constrained","placeholder":{"fallback":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsTAAALEwEAmpwYAAAEUUlEQVR42n1UC1BUZRTeQFiB5bkQyEOX177kIUKurgoFZIaBGUUSUDwCQaRhMkUbciwQRkeDkKlhBUZDHiFmk8NMOmklTvIm2aJ4qcW6GOpkubjt7r3367/LYy4++me++e+955zv/8655z883uwC8BSBJeedTyAmiCR4kSCWIIxA+KQY7mINFrNOERrtnypVffN4QWGxKT1zO1JSM5D2Vg6y83YxJeVVd76/1HWB+GUT2M/GWPC4p8zuiwgOHamsoRQKBTYoBczuNCvUvG+HhhIBc7LUninL5+ONjXysCvNhkpLfRsflzhES8/xs/EKlev305+lZ+VDIeFRfo6sJI1IKvwczzPVgYDIUt36UwjASBNxYTt+/IjIdKrCkRN6OOFbXQLiQsUApeUgp2vsRNil4JowFMRiWg+qTQN9DSjgkxanDnkh7yQEYlMDYKwF9VQJMhGD4rBfl62mJppYvdYRjxby6Hy53nVdGLMPdbn8Kahn+JUT0AAkmpBiVoSDZGWUFrsCwDCbyzdRPDusKJGpD0NHgZlqvVGBCo62dU2d3uEI1nhpPFIzLabOCgRmAKNF3i9HdtAwMUcr8JDFjzs76YlhCJ8S4ov5E28AcodOBg9UTmVvsgDFC2Dfr3Cc2k013iWHsF+MB+9w5827oFZuJWbUYkdGpCY74uLJ2lHDZmAupqmtWJ24QAr9JaNaJURPHX6QAq0gtBaWeqSf9M/kxrJ3s7IEUSR2/iunNrMLjbf3zNezsudoSpQzEre+WUri2HMdLliBUwse6MBvUFLtj++tOkPtZo7Hc00yWsskBo2f9iAA5Ji/6UFFKCXr61Ce5vbgt8dVkNJXbU7gTiv25rhB5WaFitzvaq73hIVyErJcdceO8P2o+9IDQ0RI3LwaAtBUaygTUa0mpbOtkcQmXVn964m581GLgdjBTmk8Il1ih9B03/EPSOveZDyLDbZES54DnnrHFlmgB4tbZsT3JxK0nWRxrnCIcXjxuM96797cqKjIK6jPupoqiGRV5JNX9ea54JcYeyhU2iF5li41r7bA62AZpm51xoU5oio19AQaDoYrlaG1tteRx7rC8tr75fqzCGte+8WdqPvBAUYYL2o96o+2IF/ZmuUDzrT8GvhCh4r2nMdkRyKwOscWp0+23SayIe43n7yHZS5K2ZmJfrpUR0yuxLckJO7Y6oThHiIOFbshJdMQBskMfjswEnjEvv4itXeEjd5kzIPharfZSUHA46vYJTLpuOdRtIgyd8YX6tC9GvvaDrlOGPW9amJ6NiYdB/6BtgTLu4qQe0NPbf90/IBCqPdZG3AyiaW2oeUBgTEq9m8QzrlkbDY1Gc4X4Oj+RcMbQOpe6eHBwaCgmNgHRERb0JzttUJrHx0rZYjotfQempqbOER+XR2bh40nnlQp1Ot3Ryqrav9KzCpCduxONLV/9Qb7vIrD+X2WPI+UQkzGDNewkJxA8bH94/QeYyzHWiE3wRQAAAABJRU5ErkJggg=="},"backgroundColor":"transparent","images":{"fallback":{"src":"/static/843eb0f0e2f739a8cf7490c23e695ace/be182/es6.png","srcSet":"/static/843eb0f0e2f739a8cf7490c23e695ace/be182/es6.png 150w","sizes":"(min-width: 150px) 150px, 100vw"},"sources":[{"srcSet":"/static/843eb0f0e2f739a8cf7490c23e695ace/5d458/es6.webp 150w","type":"image/webp","sizes":"(min-width: 150px) 150px, 100vw"}]},"width":150,"height":150}}}}}},{"node":{"id":"baa8dd42-9c77-5258-9240-0f8f4fca0701","html":"<p>Well for a long time I wanted to write a blog post about migrating Angular 1.x to 2, however, before doing so I thought it is really helpful to write about some prerequisites of that.</p>\n<!--more-->\n<p>This is the second article in ES6 new features series.</p>\n<p><a href=\"/2016/07/06/es6-new-features-part-i/\">Part I</a></p>\n<p><a href=\"/2016/07/11/es6-new-features-part-iii/\">Part III</a></p>\n<h3 id=\"6-arrow-functions-in-es6\" style=\"position:relative;\"><a href=\"#6-arrow-functions-in-es6\" aria-label=\"6 arrow functions in es6 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>6. Arrow Functions in ES6</h3>\n<p>Do you remember the fat functions of CoffeeScript? Now we have them in ES6. An arrow function expression has a shorter syntax compared to function expressions and lexically binds the this value (does not bind its own this, arguments, super, or new.target).</p>\n<p>Arrow functions are always anonymous. The fat arrows are amazing because they would make your <code class=\"language-text\">this</code> behave properly, i.e., <code class=\"language-text\">this</code> will have the same value as in the context of the function—it won’t mutate. The mutation typically happens each time you create a closure.</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"16003165213466120000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied to clipboard ✅\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`var a = ['Hydrogen', 'Helium', 'Lithium', 'Beryl­lium']\r\n\r\nvar a2 = a.map(function(s) {\r\n  return s.length\r\n})\r\n\r\nvar a3 = a.map(s => s.length)`, `16003165213466120000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                Copy<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-javascript line-numbers\"><code class=\"language-javascript\"><span class=\"token keyword\">var</span> a <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token string\">'Hydrogen'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'Helium'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'Lithium'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'Beryl­lium'</span><span class=\"token punctuation\">]</span>\r\n\r\n<span class=\"token keyword\">var</span> a2 <span class=\"token operator\">=</span> a<span class=\"token punctuation\">.</span><span class=\"token function\">map</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">s</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\r\n  <span class=\"token keyword\">return</span> s<span class=\"token punctuation\">.</span>length\r\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\r\n\r\n<span class=\"token keyword\">var</span> a3 <span class=\"token operator\">=</span> a<span class=\"token punctuation\">.</span><span class=\"token function\">map</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">s</span> <span class=\"token operator\">=></span> s<span class=\"token punctuation\">.</span>length<span class=\"token punctuation\">)</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>The parenthesis <code class=\"language-text\">()</code> are optional for single params in an arrow function signature. You need them when you use more than one param.</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"98044621963476930000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied to clipboard ✅\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`var ids = ['56', '5632']\r\nvar messages = ids.map(function(value, index, list) {\r\n  return 'ID of ' + index + ' element is ' + value + ' ' // explicit return\r\n})`, `98044621963476930000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                Copy<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-javascript line-numbers\"><code class=\"language-javascript\"><span class=\"token keyword\">var</span> ids <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token string\">'56'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'5632'</span><span class=\"token punctuation\">]</span>\r\n<span class=\"token keyword\">var</span> messages <span class=\"token operator\">=</span> ids<span class=\"token punctuation\">.</span><span class=\"token function\">map</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">value<span class=\"token punctuation\">,</span> index<span class=\"token punctuation\">,</span> list</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\r\n  <span class=\"token keyword\">return</span> <span class=\"token string\">'ID of '</span> <span class=\"token operator\">+</span> index <span class=\"token operator\">+</span> <span class=\"token string\">' element is '</span> <span class=\"token operator\">+</span> value <span class=\"token operator\">+</span> <span class=\"token string\">' '</span> <span class=\"token comment\">// explicit return</span>\r\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span></span></pre></div>\n<p>And more eloquent version of the code in ES6 with parenthesis around params and implicit return:</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"52802435548369450000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied to clipboard ✅\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`var ids = ['56', '5632']\r\nvar messages = ids.map(\r\n  (value, index, list) => \\`ID of \\${index} element is \\${value} \\`\r\n) // implicit return`, `52802435548369450000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                Copy<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-javascript line-numbers\"><code class=\"language-javascript\"><span class=\"token keyword\">var</span> ids <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token string\">'56'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'5632'</span><span class=\"token punctuation\">]</span>\r\n<span class=\"token keyword\">var</span> messages <span class=\"token operator\">=</span> ids<span class=\"token punctuation\">.</span><span class=\"token function\">map</span><span class=\"token punctuation\">(</span>\r\n  <span class=\"token punctuation\">(</span><span class=\"token parameter\">value<span class=\"token punctuation\">,</span> index<span class=\"token punctuation\">,</span> list</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">ID of </span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>index<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\"> element is </span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>value<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\"> </span><span class=\"token template-punctuation string\">`</span></span>\r\n<span class=\"token punctuation\">)</span> <span class=\"token comment\">// implicit return</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span></span></pre></div>\n<h3 id=\"7-promises-in-es6\" style=\"position:relative;\"><a href=\"#7-promises-in-es6\" aria-label=\"7 promises in es6 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>7. Promises in ES6</h3>\n<p>Promises have been a controversial topic. There were a lot of promise implementations with slightly different syntax. q, bluebird, deferred.js, vow, avow, jquery deferred to name just a few.</p>\n<p>Promises have been around quite a while and are defined by a spec called Promise/A+. ES6 has adopted this spec for its Promise implementation.</p>\n<p>Promises give us a way to handle asynchronous processing in a more synchronous fashion. They represent a value that we can handle at some point in the future. And, better than callbacks here, Promises give us guarantees about that future value, specifically:</p>\n<ol>\n<li>No other registered handlers of that value can change it (<em>the Promise is immutable</em>)</li>\n<li>We are guaranteed to receive the value, regardless of when we register a handler for it, even if it’s already resolved (<em>in contrast to events, which can incur race conditions</em>).</li>\n</ol>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"45059109411490160000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied to clipboard ✅\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`// an immediately resolved promise\r\nvar p2 = Promise.resolve('foo')\r\n\r\n// can get it after the fact, unlike events\r\np2.then(res => console.log(res))\r\n\r\nvar p = new Promise(function(resolve, reject) {\r\n  setTimeout(() => resolve(4), 2000)\r\n})\r\n\r\n// handler can't change promise, just value\r\np.then(res => {\r\n  res += 2\r\n  console.log(res)\r\n})\r\n\r\n// still gets 4\r\np.then(res => console.log(res))`, `45059109411490160000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                Copy<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-javascript line-numbers\"><code class=\"language-javascript\"><span class=\"token comment\">// an immediately resolved promise</span>\r\n<span class=\"token keyword\">var</span> p2 <span class=\"token operator\">=</span> Promise<span class=\"token punctuation\">.</span><span class=\"token function\">resolve</span><span class=\"token punctuation\">(</span><span class=\"token string\">'foo'</span><span class=\"token punctuation\">)</span>\r\n\r\n<span class=\"token comment\">// can get it after the fact, unlike events</span>\r\np2<span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">res</span> <span class=\"token operator\">=></span> console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>res<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\r\n\r\n<span class=\"token keyword\">var</span> p <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Promise</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">resolve<span class=\"token punctuation\">,</span> reject</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\r\n  <span class=\"token function\">setTimeout</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token function\">resolve</span><span class=\"token punctuation\">(</span><span class=\"token number\">4</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2000</span><span class=\"token punctuation\">)</span>\r\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\r\n\r\n<span class=\"token comment\">// handler can't change promise, just value</span>\r\np<span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">res</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\r\n  res <span class=\"token operator\">+=</span> <span class=\"token number\">2</span>\r\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>res<span class=\"token punctuation\">)</span>\r\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\r\n\r\n<span class=\"token comment\">// still gets 4</span>\r\np<span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">res</span> <span class=\"token operator\">=></span> console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>res<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>The standard way to create a Promise is by using the <code class=\"language-text\">new Promise</code> constructor which accepts a handler that is given two functions as parameters. The first handler (<em>typically named</em> <code class=\"language-text\">resolve</code>) is a function to call with the future value when it’s ready; and the second handler (<em>typically named</em> <code class=\"language-text\">reject</code>) is a function to call to reject the Promise if it can’t resolve the future value.</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"65075258299958840000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied to clipboard ✅\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`var p = new Promise(function(resolve, reject) {\r\n   if (/* condition */) {\r\n      resolve(/* value */);  // fulfilled successfully\r\n   }\r\n   else {\r\n      reject(/* reason */);  // error, rejected\r\n   }\r\n});`, `65075258299958840000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                Copy<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-javascript line-numbers\"><code class=\"language-javascript\"><span class=\"token keyword\">var</span> p <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Promise</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">resolve<span class=\"token punctuation\">,</span> reject</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\r\n   <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token comment\">/* condition */</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\r\n      <span class=\"token function\">resolve</span><span class=\"token punctuation\">(</span><span class=\"token comment\">/* value */</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>  <span class=\"token comment\">// fulfilled successfully</span>\r\n   <span class=\"token punctuation\">}</span>\r\n   <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\r\n      <span class=\"token function\">reject</span><span class=\"token punctuation\">(</span><span class=\"token comment\">/* reason */</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>  <span class=\"token comment\">// error, rejected</span>\r\n   <span class=\"token punctuation\">}</span>\r\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>And with ES6 arrow functions:</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"55342785659616390000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied to clipboard ✅\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`var wait1000 = new Promise((resolve, reject) => {\r\n  setTimeout(resolve, 1000)\r\n}).then(() => {\r\n  console.log('Yay!')\r\n})`, `55342785659616390000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                Copy<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-javascript line-numbers\"><code class=\"language-javascript\"><span class=\"token keyword\">var</span> wait1000 <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Promise</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">resolve<span class=\"token punctuation\">,</span> reject</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\r\n  <span class=\"token function\">setTimeout</span><span class=\"token punctuation\">(</span>resolve<span class=\"token punctuation\">,</span> <span class=\"token number\">1000</span><span class=\"token punctuation\">)</span>\r\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\r\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">'Yay!'</span><span class=\"token punctuation\">)</span>\r\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>Now with a slight modification we can revise that to look like this:</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"79848693652363330000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied to clipboard ✅\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`var wait1000 = () =>\r\n  new Promise((resolve, reject) => {\r\n    setTimeout(resolve, 1000)\r\n  })\r\n\r\nwait1000()\r\n  .then(function() {\r\n    console.log('Yay!')\r\n    return wait1000()\r\n  })\r\n  .then(function() {\r\n    console.log('Wheeyee!')\r\n  })`, `79848693652363330000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                Copy<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-javascript line-numbers\"><code class=\"language-javascript\"><span class=\"token keyword\">var</span> <span class=\"token function-variable function\">wait1000</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span>\r\n  <span class=\"token keyword\">new</span> <span class=\"token class-name\">Promise</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">resolve<span class=\"token punctuation\">,</span> reject</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\r\n    <span class=\"token function\">setTimeout</span><span class=\"token punctuation\">(</span>resolve<span class=\"token punctuation\">,</span> <span class=\"token number\">1000</span><span class=\"token punctuation\">)</span>\r\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\r\n\r\n<span class=\"token function\">wait1000</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\r\n  <span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\r\n    console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">'Yay!'</span><span class=\"token punctuation\">)</span>\r\n    <span class=\"token keyword\">return</span> <span class=\"token function\">wait1000</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\r\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\r\n  <span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\r\n    console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">'Wheeyee!'</span><span class=\"token punctuation\">)</span>\r\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<h3 id=\"8-block-scoped-constructs-let-and-const\" style=\"position:relative;\"><a href=\"#8-block-scoped-constructs-let-and-const\" aria-label=\"8 block scoped constructs let and const 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>8. Block-Scoped Constructs Let and Const</h3>\n<p>ES6 provides two new ways of declaring variables: <code class=\"language-text\">let</code> and <code class=\"language-text\">const</code>, which mostly replace the ES5 way of declaring variables, <code class=\"language-text\">var</code>. <code class=\"language-text\">let</code> works similarly to <code class=\"language-text\">var</code>, but the variable it declares is <em>block-scoped</em>, it only exists within the current block.</p>\n<p><code class=\"language-text\">var</code> is <em>function-scoped</em>. In the following code, you can see that the <code class=\"language-text\">let</code>-declared variable <code class=\"language-text\">tmp</code> only exists with the block that starts in line A:</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"10723130158921701000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied to clipboard ✅\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`function order(x, y) {\r\n  if (x > y) {\r\n    // (A)\r\n    let tmp = x\r\n    x = y\r\n    y = tmp\r\n  }\r\n  console.log(tmp === x) // ReferenceError: tmp is not defined\r\n  return [x, y]\r\n}`, `10723130158921701000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                Copy<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-javascript line-numbers\"><code class=\"language-javascript\"><span class=\"token keyword\">function</span> <span class=\"token function\">order</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">x<span class=\"token punctuation\">,</span> y</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\r\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>x <span class=\"token operator\">></span> y<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\r\n    <span class=\"token comment\">// (A)</span>\r\n    <span class=\"token keyword\">let</span> tmp <span class=\"token operator\">=</span> x\r\n    x <span class=\"token operator\">=</span> y\r\n    y <span class=\"token operator\">=</span> tmp\r\n  <span class=\"token punctuation\">}</span>\r\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>tmp <span class=\"token operator\">===</span> x<span class=\"token punctuation\">)</span> <span class=\"token comment\">// ReferenceError: tmp is not defined</span>\r\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">[</span>x<span class=\"token punctuation\">,</span> y<span class=\"token punctuation\">]</span>\r\n<span class=\"token punctuation\">}</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p><code class=\"language-text\">const</code> works like <code class=\"language-text\">let</code>, but the variable you declare must be immediately initialized, with a value that can’t be changed afterwards.</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"24026929335379866000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied to clipboard ✅\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`const foo; // SyntaxError: missing = in const declaration\r\n\r\nconst bar = 123;\r\nbar = 456; // TypeError: \\`bar\\` is read-only`, `24026929335379866000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                Copy<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-javascript line-numbers\"><code class=\"language-javascript\"><span class=\"token keyword\">const</span> foo<span class=\"token punctuation\">;</span> <span class=\"token comment\">// SyntaxError: missing = in const declaration</span>\r\n\r\n<span class=\"token keyword\">const</span> bar <span class=\"token operator\">=</span> <span class=\"token number\">123</span><span class=\"token punctuation\">;</span>\r\nbar <span class=\"token operator\">=</span> <span class=\"token number\">456</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// TypeError: `bar` is read-only</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span></span></pre></div>\n<p>Since <code class=\"language-text\">for-of</code> creates one <em>binding</em> (storage space for a variable) per loop iteration, it is OK to <code class=\"language-text\">const</code>-declare the loop variable:</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"33474951389505446000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied to clipboard ✅\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`for (const x of ['a', 'b']) {\r\n  console.log(x)\r\n}\r\n// Output:\r\n// a\r\n// b`, `33474951389505446000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                Copy<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-javascript line-numbers\"><code class=\"language-javascript\"><span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">const</span> x <span class=\"token keyword\">of</span> <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><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\r\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>x<span class=\"token punctuation\">)</span>\r\n<span class=\"token punctuation\">}</span>\r\n<span class=\"token comment\">// Output:</span>\r\n<span class=\"token comment\">// a</span>\r\n<span class=\"token comment\">// b</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>The following table gives an overview of six ways in which variables can be declared in ES6:</p>\n<table>\n<thead>\n<tr>\n<th align=\"left\"></th>\n<th align=\"left\">Hoisting</th>\n<th align=\"left\">Scope</th>\n<th align=\"left\">Creates global properties</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td align=\"left\"><code class=\"language-text\">var</code></td>\n<td align=\"left\">Declaration</td>\n<td align=\"left\">Function</td>\n<td align=\"left\">Yes</td>\n</tr>\n<tr>\n<td align=\"left\"><code class=\"language-text\">let</code></td>\n<td align=\"left\">Temporal dead zone</td>\n<td align=\"left\">Block</td>\n<td align=\"left\">No</td>\n</tr>\n<tr>\n<td align=\"left\"><code class=\"language-text\">const</code></td>\n<td align=\"left\">Temporal dead zone</td>\n<td align=\"left\">Block</td>\n<td align=\"left\">No</td>\n</tr>\n<tr>\n<td align=\"left\"><code class=\"language-text\">function</code></td>\n<td align=\"left\">Complete</td>\n<td align=\"left\">Block</td>\n<td align=\"left\">Yes</td>\n</tr>\n<tr>\n<td align=\"left\"><code class=\"language-text\">class</code></td>\n<td align=\"left\">No</td>\n<td align=\"left\">Block</td>\n<td align=\"left\">No</td>\n</tr>\n<tr>\n<td align=\"left\"><code class=\"language-text\">import</code></td>\n<td align=\"left\">Complete</td>\n<td align=\"left\">Module-global</td>\n<td align=\"left\">No</td>\n</tr>\n</tbody>\n</table>","timeToRead":3,"frontmatter":{"title":"ES6 new features (Part II)","unformattedDate":"2016-07-07T00:00:00.000Z","date":"Jul 07, 2016","path":"/es6-new-features-part-ii/","author":"Yaser Adel Mehraban","tags":["arrow functions","const","ES6","let","promises"],"thumbnail":{"childImageSharp":{"gatsbyImageData":{"layout":"constrained","placeholder":{"fallback":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsTAAALEwEAmpwYAAAEUUlEQVR42n1UC1BUZRTeQFiB5bkQyEOX177kIUKurgoFZIaBGUUSUDwCQaRhMkUbciwQRkeDkKlhBUZDHiFmk8NMOmklTvIm2aJ4qcW6GOpkubjt7r3367/LYy4++me++e+955zv/8655z883uwC8BSBJeedTyAmiCR4kSCWIIxA+KQY7mINFrNOERrtnypVffN4QWGxKT1zO1JSM5D2Vg6y83YxJeVVd76/1HWB+GUT2M/GWPC4p8zuiwgOHamsoRQKBTYoBczuNCvUvG+HhhIBc7LUninL5+ONjXysCvNhkpLfRsflzhES8/xs/EKlev305+lZ+VDIeFRfo6sJI1IKvwczzPVgYDIUt36UwjASBNxYTt+/IjIdKrCkRN6OOFbXQLiQsUApeUgp2vsRNil4JowFMRiWg+qTQN9DSjgkxanDnkh7yQEYlMDYKwF9VQJMhGD4rBfl62mJppYvdYRjxby6Hy53nVdGLMPdbn8Kahn+JUT0AAkmpBiVoSDZGWUFrsCwDCbyzdRPDusKJGpD0NHgZlqvVGBCo62dU2d3uEI1nhpPFIzLabOCgRmAKNF3i9HdtAwMUcr8JDFjzs76YlhCJ8S4ov5E28AcodOBg9UTmVvsgDFC2Dfr3Cc2k013iWHsF+MB+9w5827oFZuJWbUYkdGpCY74uLJ2lHDZmAupqmtWJ24QAr9JaNaJURPHX6QAq0gtBaWeqSf9M/kxrJ3s7IEUSR2/iunNrMLjbf3zNezsudoSpQzEre+WUri2HMdLliBUwse6MBvUFLtj++tOkPtZo7Hc00yWsskBo2f9iAA5Ji/6UFFKCXr61Ce5vbgt8dVkNJXbU7gTiv25rhB5WaFitzvaq73hIVyErJcdceO8P2o+9IDQ0RI3LwaAtBUaygTUa0mpbOtkcQmXVn964m581GLgdjBTmk8Il1ih9B03/EPSOveZDyLDbZES54DnnrHFlmgB4tbZsT3JxK0nWRxrnCIcXjxuM96797cqKjIK6jPupoqiGRV5JNX9ea54JcYeyhU2iF5li41r7bA62AZpm51xoU5oio19AQaDoYrlaG1tteRx7rC8tr75fqzCGte+8WdqPvBAUYYL2o96o+2IF/ZmuUDzrT8GvhCh4r2nMdkRyKwOscWp0+23SayIe43n7yHZS5K2ZmJfrpUR0yuxLckJO7Y6oThHiIOFbshJdMQBskMfjswEnjEvv4itXeEjd5kzIPharfZSUHA46vYJTLpuOdRtIgyd8YX6tC9GvvaDrlOGPW9amJ6NiYdB/6BtgTLu4qQe0NPbf90/IBCqPdZG3AyiaW2oeUBgTEq9m8QzrlkbDY1Gc4X4Oj+RcMbQOpe6eHBwaCgmNgHRERb0JzttUJrHx0rZYjotfQempqbOER+XR2bh40nnlQp1Ot3Ryqrav9KzCpCduxONLV/9Qb7vIrD+X2WPI+UQkzGDNewkJxA8bH94/QeYyzHWiE3wRQAAAABJRU5ErkJggg=="},"backgroundColor":"transparent","images":{"fallback":{"src":"/static/843eb0f0e2f739a8cf7490c23e695ace/be182/es6.png","srcSet":"/static/843eb0f0e2f739a8cf7490c23e695ace/be182/es6.png 150w","sizes":"(min-width: 150px) 150px, 100vw"},"sources":[{"srcSet":"/static/843eb0f0e2f739a8cf7490c23e695ace/5d458/es6.webp 150w","type":"image/webp","sizes":"(min-width: 150px) 150px, 100vw"}]},"width":150,"height":150}}}}}},{"node":{"id":"ea2f8252-1080-5c85-b6ff-c7b7b6daae5e","html":"<p>Well for a long time I wanted to write a blog post about migrating Angular 1.x to 2, however, before doing so I thought it is really helpful to write about some prerequisites of that.</p>\n<!--more-->\n<p>This is the first article in ES6 new features series.</p>\n<p><a href=\"/2016/07/07/es6-new-features-part-ii/\">Part II</a></p>\n<p><a href=\"/2016/07/11/es6-new-features-part-iii/\">Part III</a></p>\n<p>Number one in the list would be ES6. Which is the topic of today’s post. ES6 (often referred to as “Harmony”) is the upcoming sixth major release of the ECMAScript language specification.</p>\n<p>However, that does not put things in perspective. I prefer to say it is the newest JavaScript implementation, simple as that.</p>\n<p>I just briefly list them here and go through one by one:</p>\n<ol>\n<li>Default Parameters in ES6</li>\n<li>Template Literals in ES6</li>\n<li>Multi-line Strings in ES6</li>\n<li>Destructuring Assignment in ES6</li>\n<li>Enhanced Object Literals in ES6</li>\n<li>Arrow Functions in ES6</li>\n<li>Promises in ES6</li>\n<li>Block-Scoped Constructs Let and Const</li>\n<li>Classes in ES6</li>\n<li>Modules in ES6\r\nAlthough it might look like a short list but they are the most important ones.</li>\n</ol>\n<h3 id=\"1-default-parameters-in-es6\" style=\"position:relative;\"><a href=\"#1-default-parameters-in-es6\" aria-label=\"1 default parameters in es6 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>1. Default Parameters in ES6</h3>\n<p>If you remember previously we had to explicitly specify a value if the coming parameter to a method didn’t have one.</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"6896370952037944000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied to clipboard ✅\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`var bar = function(foo) {\r\n  var temp = foo || 'default value'\r\n}`, `6896370952037944000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                Copy<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-javascript line-numbers\"><code class=\"language-javascript\"><span class=\"token keyword\">var</span> <span class=\"token function-variable function\">bar</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">foo</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\r\n  <span class=\"token keyword\">var</span> temp <span class=\"token operator\">=</span> foo <span class=\"token operator\">||</span> <span class=\"token string\">'default value'</span>\r\n<span class=\"token punctuation\">}</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span></span></pre></div>\n<p>Now it is like one of high level languages such as C#.</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"12313107728909834000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied to clipboard ✅\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`var bar = function(foo = 'default value') {\r\n  //code goes here\r\n}`, `12313107728909834000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                Copy<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-javascript line-numbers\"><code class=\"language-javascript\"><span class=\"token keyword\">var</span> <span class=\"token function-variable function\">bar</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span>foo <span class=\"token operator\">=</span> <span class=\"token string\">'default value'</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\r\n  <span class=\"token comment\">//code goes here</span>\r\n<span class=\"token punctuation\">}</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span></span></pre></div>\n<h3 id=\"2-template-literals-in-es6\" style=\"position:relative;\"><a href=\"#2-template-literals-in-es6\" aria-label=\"2 template literals in es6 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>2. Template Literals in ES6</h3>\n<p>Template literals or interpolation in other languages is a way to output variables in the string. So in ES5 we had to break the string like this:</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"30516627442097066000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied to clipboard ✅\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`var fullname = firstname + ' ' + lastname`, `30516627442097066000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                Copy<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-javascript line-numbers\"><code class=\"language-javascript\"><span class=\"token keyword\">var</span> fullname <span class=\"token operator\">=</span> firstname <span class=\"token operator\">+</span> <span class=\"token string\">' '</span> <span class=\"token operator\">+</span> lastname</code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span></span></pre></div>\n<p>In ES6 though you can use the new syntax ${} which is again like C#:</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"58979210602104690000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied to clipboard ✅\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`var fullname = \\`Your name is \\${firstname} \\${lastname}.\\``, `58979210602104690000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                Copy<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-javascript line-numbers\"><code class=\"language-javascript\"><span class=\"token keyword\">var</span> fullname <span class=\"token operator\">=</span> <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">Your name is </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 string\">.</span><span class=\"token template-punctuation string\">`</span></span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span></span></pre></div>\n<h3 id=\"3-multi-line-strings-in-es6\" style=\"position:relative;\"><a href=\"#3-multi-line-strings-in-es6\" aria-label=\"3 multi line strings in es6 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>3. Multi-line Strings in ES6</h3>\n<p>Previously we had to use + to shape multiple line strings something like this:</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"31525785119296954000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied to clipboard ✅\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`var fourAgreements =\r\n  'You have the right to be you.' + 'You can only be you when you do your best.'`, `31525785119296954000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                Copy<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-javascript line-numbers\"><code class=\"language-javascript\"><span class=\"token keyword\">var</span> fourAgreements <span class=\"token operator\">=</span>\r\n  <span class=\"token string\">'You have the right to be you.'</span> <span class=\"token operator\">+</span> <span class=\"token string\">'You can only be you when you do your best.'</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span></span></pre></div>\n<p>But in ES6 they introduced the multi-line string literal ` which makes life easier:</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"59228531360032145000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied to clipboard ✅\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`var fourAgreements = \\`You have the right to be you.\r\n    You can only be you when you do your best.\\``, `59228531360032145000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                Copy<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-javascript line-numbers\"><code class=\"language-javascript\"><span class=\"token keyword\">var</span> fourAgreements <span class=\"token operator\">=</span> <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">You have the right to be you.\r\n    You can only be you when you do your best.</span><span class=\"token template-punctuation string\">`</span></span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span></span></pre></div>\n<h3 id=\"4-destructuring-assignment-in-es6\" style=\"position:relative;\"><a href=\"#4-destructuring-assignment-in-es6\" aria-label=\"4 destructuring assignment in es6 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>4. Destructuring Assignment in ES6</h3>\n<p>This can be a little confusing as there is some logic behind it. In ES5 when we wanted to extract  some properties from an object we should define them as below:</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"87365282732101090000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied to clipboard ✅\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`var data = \\$('body').data(), // data has properties cat and mouse\r\n  house = data.cat,\r\n  mouse = data.mouse`, `87365282732101090000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                Copy<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-javascript line-numbers\"><code class=\"language-javascript\"><span class=\"token keyword\">var</span> data <span class=\"token operator\">=</span> <span class=\"token function\">$</span><span class=\"token punctuation\">(</span><span class=\"token string\">'body'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">data</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token comment\">// data has properties cat and mouse</span>\r\n  house <span class=\"token operator\">=</span> data<span class=\"token punctuation\">.</span>cat<span class=\"token punctuation\">,</span>\r\n  mouse <span class=\"token operator\">=</span> data<span class=\"token punctuation\">.</span>mouse</code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span></span></pre></div>\n<p>In ES6, we can replace the ES5 code above with these statements:</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"22936087227017940000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied to clipboard ✅\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`var { cat, mouse } = \\$('body').data() // we'll get house and mouse variables`, `22936087227017940000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                Copy<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-javascript line-numbers\"><code class=\"language-javascript\"><span class=\"token keyword\">var</span> <span class=\"token punctuation\">{</span> cat<span class=\"token punctuation\">,</span> mouse <span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> <span class=\"token function\">$</span><span class=\"token punctuation\">(</span><span class=\"token string\">'body'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">data</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token comment\">// we'll get house and mouse variables</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span></span></pre></div>\n<h3 id=\"5-enhanced-object-literals-in-es6\" style=\"position:relative;\"><a href=\"#5-enhanced-object-literals-in-es6\" aria-label=\"5 enhanced object literals in es6 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>5. Enhanced Object Literals in ES6</h3>\n<p>First of all let’s see what is an object literal. An object literal is a list of zero or more pairs of property names and associated values of an object, enclosed in curly braces (<code class=\"language-text\">{}</code>).</p>\n<p>What you can do with object literals now in ES6 is mind blowing! It has started from something like a glorified JSON in ES5 to something like a class in ES6.</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"91537893529839400000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied to clipboard ✅\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`var sales = 'Toyota'\r\n\r\nfunction carTypes(name) {\r\n  if (name === 'Honda') {\r\n    return name\r\n  } else {\r\n    return &quot;Sorry, we don't sell &quot; + name + '.'\r\n  }\r\n}\r\n\r\nvar car = { myCar: 'Saturn', getCar: carTypes('Honda'), special: sales }\r\n\r\nconsole.log(car.myCar) // Saturn\r\nconsole.log(car.getCar) // Honda\r\nconsole.log(car.special) // Toyota`, `91537893529839400000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                Copy<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-javascript line-numbers\"><code class=\"language-javascript\"><span class=\"token keyword\">var</span> sales <span class=\"token operator\">=</span> <span class=\"token string\">'Toyota'</span>\r\n\r\n<span class=\"token keyword\">function</span> <span class=\"token function\">carTypes</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">name</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\r\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>name <span class=\"token operator\">===</span> <span class=\"token string\">'Honda'</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\r\n    <span class=\"token keyword\">return</span> name\r\n  <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\r\n    <span class=\"token keyword\">return</span> <span class=\"token string\">\"Sorry, we don't sell \"</span> <span class=\"token operator\">+</span> name <span class=\"token operator\">+</span> <span class=\"token string\">'.'</span>\r\n  <span class=\"token punctuation\">}</span>\r\n<span class=\"token punctuation\">}</span>\r\n\r\n<span class=\"token keyword\">var</span> car <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">myCar</span><span class=\"token operator\">:</span> <span class=\"token string\">'Saturn'</span><span class=\"token punctuation\">,</span> <span class=\"token literal-property property\">getCar</span><span class=\"token operator\">:</span> <span class=\"token function\">carTypes</span><span class=\"token punctuation\">(</span><span class=\"token string\">'Honda'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token literal-property property\">special</span><span class=\"token operator\">:</span> sales <span class=\"token punctuation\">}</span>\r\n\r\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>car<span class=\"token punctuation\">.</span>myCar<span class=\"token punctuation\">)</span> <span class=\"token comment\">// Saturn</span>\r\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>car<span class=\"token punctuation\">.</span>getCar<span class=\"token punctuation\">)</span> <span class=\"token comment\">// Honda</span>\r\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>car<span class=\"token punctuation\">.</span>special<span class=\"token punctuation\">)</span> <span class=\"token comment\">// Toyota</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>Additionally, you can use a numeric or string literal for the name of a property or nest an object inside another. The following example uses these options.</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"83488440763124120000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied to clipboard ✅\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`var car = { manyCars: { a: 'Saab', b: 'Jeep' }, 7: 'Mazda' }\r\n\r\nconsole.log(car.manyCars.b) // Jeep\r\nconsole.log(car[7]) // Mazda`, `83488440763124120000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                Copy<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-javascript line-numbers\"><code class=\"language-javascript\"><span class=\"token keyword\">var</span> car <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">manyCars</span><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 string\">'Saab'</span><span class=\"token punctuation\">,</span> <span class=\"token literal-property property\">b</span><span class=\"token operator\">:</span> <span class=\"token string\">'Jeep'</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> <span class=\"token number\">7</span><span class=\"token operator\">:</span> <span class=\"token string\">'Mazda'</span> <span class=\"token punctuation\">}</span>\r\n\r\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>car<span class=\"token punctuation\">.</span>manyCars<span class=\"token punctuation\">.</span>b<span class=\"token punctuation\">)</span> <span class=\"token comment\">// Jeep</span>\r\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>car<span class=\"token punctuation\">[</span><span class=\"token number\">7</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span> <span class=\"token comment\">// Mazda</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span></span></pre></div>\n<p>In ES6 Object Literals are extended to support setting the prototype at construction, shorthand for <code class=\"language-text\">foo: foo</code> assignments, defining methods, making super calls, and computing property names with expressions.</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"56085773579430540000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied to clipboard ✅\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`var obj = {\r\n  // __proto__\r\n  __proto__: theProtoObj,\r\n  // Shorthand for ‘handler: handler’\r\n  handler,\r\n  // Methods\r\n  toString() {\r\n    // Super calls\r\n    return 'd ' + super.toString()\r\n  },\r\n  // Computed (dynamic) property names\r\n  ['prop_' + (() => 42)()]: 42,\r\n}`, `56085773579430540000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                Copy<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-javascript line-numbers\"><code class=\"language-javascript\"><span class=\"token keyword\">var</span> obj <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\r\n  <span class=\"token comment\">// __proto__</span>\r\n  <span class=\"token literal-property property\">__proto__</span><span class=\"token operator\">:</span> theProtoObj<span class=\"token punctuation\">,</span>\r\n  <span class=\"token comment\">// Shorthand for ‘handler: handler’</span>\r\n  handler<span class=\"token punctuation\">,</span>\r\n  <span class=\"token comment\">// Methods</span>\r\n  <span class=\"token function\">toString</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\r\n    <span class=\"token comment\">// Super calls</span>\r\n    <span class=\"token keyword\">return</span> <span class=\"token string\">'d '</span> <span class=\"token operator\">+</span> <span class=\"token keyword\">super</span><span class=\"token punctuation\">.</span><span class=\"token function\">toString</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\r\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\r\n  <span class=\"token comment\">// Computed (dynamic) property names</span>\r\n  <span class=\"token punctuation\">[</span><span class=\"token string\">'prop_'</span> <span class=\"token operator\">+</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token number\">42</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">]</span><span class=\"token operator\">:</span> <span class=\"token number\">42</span><span class=\"token punctuation\">,</span>\r\n<span class=\"token punctuation\">}</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>","timeToRead":3,"frontmatter":{"title":"ES6 new features (Part I)","unformattedDate":"2016-07-06T00:00:00.000Z","date":"Jul 06, 2016","path":"/es6-new-features-part-i/","author":"Yaser Adel Mehraban","tags":["ES6","features"],"thumbnail":{"childImageSharp":{"gatsbyImageData":{"layout":"constrained","placeholder":{"fallback":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsTAAALEwEAmpwYAAAEUUlEQVR42n1UC1BUZRTeQFiB5bkQyEOX177kIUKurgoFZIaBGUUSUDwCQaRhMkUbciwQRkeDkKlhBUZDHiFmk8NMOmklTvIm2aJ4qcW6GOpkubjt7r3367/LYy4++me++e+955zv/8655z883uwC8BSBJeedTyAmiCR4kSCWIIxA+KQY7mINFrNOERrtnypVffN4QWGxKT1zO1JSM5D2Vg6y83YxJeVVd76/1HWB+GUT2M/GWPC4p8zuiwgOHamsoRQKBTYoBczuNCvUvG+HhhIBc7LUninL5+ONjXysCvNhkpLfRsflzhES8/xs/EKlev305+lZ+VDIeFRfo6sJI1IKvwczzPVgYDIUt36UwjASBNxYTt+/IjIdKrCkRN6OOFbXQLiQsUApeUgp2vsRNil4JowFMRiWg+qTQN9DSjgkxanDnkh7yQEYlMDYKwF9VQJMhGD4rBfl62mJppYvdYRjxby6Hy53nVdGLMPdbn8Kahn+JUT0AAkmpBiVoSDZGWUFrsCwDCbyzdRPDusKJGpD0NHgZlqvVGBCo62dU2d3uEI1nhpPFIzLabOCgRmAKNF3i9HdtAwMUcr8JDFjzs76YlhCJ8S4ov5E28AcodOBg9UTmVvsgDFC2Dfr3Cc2k013iWHsF+MB+9w5827oFZuJWbUYkdGpCY74uLJ2lHDZmAupqmtWJ24QAr9JaNaJURPHX6QAq0gtBaWeqSf9M/kxrJ3s7IEUSR2/iunNrMLjbf3zNezsudoSpQzEre+WUri2HMdLliBUwse6MBvUFLtj++tOkPtZo7Hc00yWsskBo2f9iAA5Ji/6UFFKCXr61Ce5vbgt8dVkNJXbU7gTiv25rhB5WaFitzvaq73hIVyErJcdceO8P2o+9IDQ0RI3LwaAtBUaygTUa0mpbOtkcQmXVn964m581GLgdjBTmk8Il1ih9B03/EPSOveZDyLDbZES54DnnrHFlmgB4tbZsT3JxK0nWRxrnCIcXjxuM96797cqKjIK6jPupoqiGRV5JNX9ea54JcYeyhU2iF5li41r7bA62AZpm51xoU5oio19AQaDoYrlaG1tteRx7rC8tr75fqzCGte+8WdqPvBAUYYL2o96o+2IF/ZmuUDzrT8GvhCh4r2nMdkRyKwOscWp0+23SayIe43n7yHZS5K2ZmJfrpUR0yuxLckJO7Y6oThHiIOFbshJdMQBskMfjswEnjEvv4itXeEjd5kzIPharfZSUHA46vYJTLpuOdRtIgyd8YX6tC9GvvaDrlOGPW9amJ6NiYdB/6BtgTLu4qQe0NPbf90/IBCqPdZG3AyiaW2oeUBgTEq9m8QzrlkbDY1Gc4X4Oj+RcMbQOpe6eHBwaCgmNgHRERb0JzttUJrHx0rZYjotfQempqbOER+XR2bh40nnlQp1Ot3Ryqrav9KzCpCduxONLV/9Qb7vIrD+X2WPI+UQkzGDNewkJxA8bH94/QeYyzHWiE3wRQAAAABJRU5ErkJggg=="},"backgroundColor":"transparent","images":{"fallback":{"src":"/static/843eb0f0e2f739a8cf7490c23e695ace/be182/es6.png","srcSet":"/static/843eb0f0e2f739a8cf7490c23e695ace/be182/es6.png 150w","sizes":"(min-width: 150px) 150px, 100vw"},"sources":[{"srcSet":"/static/843eb0f0e2f739a8cf7490c23e695ace/5d458/es6.webp 150w","type":"image/webp","sizes":"(min-width: 150px) 150px, 100vw"}]},"width":150,"height":150}}}}}}]}},"pageContext":{"tag":"ES6"}},"staticQueryHashes":[],"slicesMap":{}}