<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Joe Ziemba</title>
    <description>The latest articles on DEV Community by Joe Ziemba (@justmyrealname).</description>
    <link>https://dev.to/justmyrealname</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F688641%2F46c5857c-a5f0-45b0-b6ab-4133f1eb85d8.png</url>
      <title>DEV Community: Joe Ziemba</title>
      <link>https://dev.to/justmyrealname</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/justmyrealname"/>
    <language>en</language>
    <item>
      <title>Organize React Components Better with Barrel Exports</title>
      <dc:creator>Joe Ziemba</dc:creator>
      <pubDate>Tue, 28 Sep 2021 22:45:13 +0000</pubDate>
      <link>https://dev.to/justmyrealname/organize-react-components-better-with-barrel-exports-4fno</link>
      <guid>https://dev.to/justmyrealname/organize-react-components-better-with-barrel-exports-4fno</guid>
      <description>&lt;p&gt;We all know that React imports can get a little... verbose.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;compose&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;recompose/compose&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;Dispatch&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;redux&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;connect&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;react-redux&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;querystring&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;query-string&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;generateMetaInfo&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;shared/generate-meta-info&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Head&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;../../components/head&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;SegmentedControl&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;../../components/Layout/segmentedControl&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;ChannelProfileCard&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;../../components/Layout/entities&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;CommunityAvatar&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;../../components/Layout/avatar&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;ErrorBoundary&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;../../components/error&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;MembersList&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./components/MembersList&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;PostFeed&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./components/PostsFeed&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;SidebarSection&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;../../components/Layout/SidebarSection&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;CommunitySidebar&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;../../components/communitySidebar&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;FeedsContainer&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./style&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;InfoContainer&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;../community/style&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;FullScreenRedirectView&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;../../views/viewHelpers/fullScreenRedirect&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="c1"&gt;// and this isn't even that long...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The node module imports are unavoidable, but we &lt;em&gt;can&lt;/em&gt; clean up our local imports&lt;br&gt;
with a pattern called &lt;strong&gt;barrel exporting&lt;/strong&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  The Barrel Export
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;ChannelProfileCard&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;CommunityAvatar&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;CommunitySidebar&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;ErrorBoundary&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;FeedsContainer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;FullScreenRedirectView&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;Head&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;InfoContainer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;MembersList&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;PostFeed&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;SegmentedControl&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;SidebarSection&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;../../components&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;A lot easier on the eyes, eh?&lt;/p&gt;

&lt;p&gt;Barrel is about more than the aesthetic though. We get better Intellisense and auto-importing for components in editors like VSCode thanks to the named exports, along with more flexibility in organizing our filesystem. We can nest folders as deep as it makes sense without worrying about ballooning import statements.&lt;/p&gt;
&lt;h2&gt;
  
  
  How to set up Barrel Exports
&lt;/h2&gt;

&lt;p&gt;A traditional &lt;code&gt;export&lt;/code&gt;/&lt;code&gt;import&lt;/code&gt; setup for React looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// src/components/SidebarSection/index.js&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;SidebarSection&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="cm"&gt;/* implementation */&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;SidebarSection&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// src/views/Homepage/index.js&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nb"&gt;Error&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;../../components/error&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Row&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;../../components/Layout/blocks/Row&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;SidebarSection&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;../../components/Layout/SidebarSection&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To enable the Barrel pattern, all we need to do 2 things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Change from a default to named exports.&lt;/li&gt;
&lt;li&gt;Add an &lt;code&gt;index.js&lt;/code&gt; in whatever directory you want to be "the Barrel." From this file, we'll re-export all our components in that branch of the filesystem.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// src/components/Layout/SidebarSection/index.js&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;SidebarSection&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="cm"&gt;/* implementation */&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// src/components/index.js&lt;/span&gt;

&lt;span class="c1"&gt;// This is the Barrel!&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nb"&gt;Error&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./Error&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Row&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./Layout/blocks/Row&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;SidebarSection&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./Layout/SidebarSection&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// src/views/Homepage/index.js&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nb"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Row&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;SidebarSection&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;../../components&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And that's it!&lt;/p&gt;

&lt;h3&gt;
  
  
  What's Next
&lt;/h3&gt;

&lt;p&gt;In future posts we'll look at even more improvements we can make to our React code with patterns like dot notation and removing the need to relative imports. Follow me on Twitter &lt;a href="https://twitter.come/justmyrealname"&gt;@justmyrealname&lt;/a&gt; to hear when new articles drop!&lt;/p&gt;

</description>
      <category>react</category>
      <category>javascript</category>
      <category>codequality</category>
      <category>webdev</category>
    </item>
    <item>
      <title>JavaScript from ES6 to Today</title>
      <dc:creator>Joe Ziemba</dc:creator>
      <pubDate>Mon, 20 Sep 2021 22:04:16 +0000</pubDate>
      <link>https://dev.to/justmyrealname/javascript-from-es6-to-today-c42</link>
      <guid>https://dev.to/justmyrealname/javascript-from-es6-to-today-c42</guid>
      <description>&lt;p&gt;ES6 is nearly synonymous with "modern javascript" and rightly so. When it dropped in 2015 as the second-ever major language update (first being ES5 in 2009) ES6 added a &lt;em&gt;huge&lt;/em&gt; list of features that completely changed JS development. But time didn't stop in 2015 and the good folks over at ECMA International have released a new version every year since - that's right, in 2021 we're actually on &lt;strong&gt;ES12&lt;/strong&gt;!&lt;/p&gt;

&lt;p&gt;If you missed the memo on versions 7-11, you're not alone. Thanks to tools like Babel, Webpack and TypeScript that transpile our code to browser-usable versions, we don't really need to pay much attention to the ES versions. But you might be surprised how many language features are newer - or older - than you thought...&lt;/p&gt;

&lt;h2&gt;
  
  
  ES6 / ECMAScript 2015
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Variables
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;let&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;const&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Block-scoping&lt;/li&gt;
&lt;li&gt;Array destructuring &lt;code&gt;let [ a, b ] = sourceArray&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Object destructuring &lt;code&gt;let { a, b } = sourceObject&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Object Literals
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Property shorthand &lt;code&gt;let obj = { a, b }&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Computed property keys &lt;code&gt;let obj = { [a]: "a" }&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Method definition &lt;code&gt;let obj = { myMethod(a) { return a } }; obj.myMethod("a");&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;for...of&lt;/code&gt; loops&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Arrays
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Spread operator &lt;code&gt;[a, b, ...anotherArray]&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.copyWithin()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.entries()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.fill()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.find()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.findIndex()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.keys()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.values()&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Functions
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Arrow declaration &lt;code&gt;() =&amp;gt; {}&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Default params &lt;code&gt;(a, b = true) =&amp;gt; {}&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Rest params &lt;code&gt;(a, b, ...rest) =&amp;gt; {}&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Destructuring params &lt;code&gt;({ a, b }) =&amp;gt; {}&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Generators&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Classes
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;class&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;get&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;set&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;static&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;extends&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;instanceof&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Modules
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;import&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;export&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;default&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Regular Expressions
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;/y&lt;/code&gt; (sticky)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/u&lt;/code&gt; (unicode)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.flags&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.source&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Strings
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Template literals&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.includes()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.startsWith()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.endsWith()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.repeat()&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  New Global Objects / Methods
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Map&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Set&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;WeakMap&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Promise&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Symbol&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;RegExp&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Object&lt;/code&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;.assign()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.entries()&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Array&lt;/code&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;.from()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.of()&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Number&lt;/code&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;.EPSILON&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.MIN_SAFE_INTEGER&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.MAX_SAFE_INTEGER&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.isInteger()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.isSafeInteger()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.isFinite()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.parseFloat()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.parseInt()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.isNaN()&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Math&lt;/code&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;.cbrt()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.log10()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.log2()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.sign()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.trunc()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.hypot()&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's &lt;em&gt;everything&lt;/em&gt; released in ES6. It's &lt;em&gt;a lot&lt;/em&gt;. But if you feel like something's missing from the list, keep going. There's 6 more years of features to go!&lt;/p&gt;

&lt;p&gt;Fun fact: ES6 is now fully supported by browsers, so it no longer needs to be transpiled unless you're unfortunate enough to be supporting Internet Explorer (my condolences)&lt;/p&gt;

&lt;h2&gt;
  
  
  ES7 / ECMAScript 2016
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Exponentiation &lt;code&gt;3 ** 4&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Array.includes()&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  ES8 / ECMAScript 2017
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Asyncronous functions &lt;code&gt;async&lt;/code&gt;/&lt;code&gt;await&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Object destructuring rest assignment &lt;code&gt;let { a, b, ...c } = sourceObject&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Object spread properties &lt;code&gt;{ a: 'a', b: 'b', ...anotherObject }&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Object&lt;/code&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;.entries()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.getOwnPropertyDescriptors()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.values()&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;String&lt;/code&gt; prototypes

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;.padStart()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.padEnd()&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Trailing commas in function parameters&lt;/li&gt;
&lt;li&gt;Shared memory and atomics&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  ES9 / ECMAScript 2018
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Async iteration &lt;code&gt;for-await-of&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Rest and Spread for Object Literals&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Promise.prototype.finally()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Tagged Template Literals&lt;/li&gt;
&lt;li&gt;Regular Expressions

&lt;ul&gt;
&lt;li&gt;named capture groups&lt;/li&gt;
&lt;li&gt;better escapes&lt;/li&gt;
&lt;li&gt;lookbehind assertions&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  ES10 / ECMAScript 2019
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Optional catch binding&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Symbol.prototype.description&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Object.fromEntries()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;String methods &lt;code&gt;.trimStart()&lt;/code&gt; and &lt;code&gt;.trimEnd()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Array methods &lt;code&gt;.flatMap()&lt;/code&gt; and &lt;code&gt;.flat()&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  ES11 / ECMAScript 2020
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Bigint data type&lt;/li&gt;
&lt;li&gt;Optional chaining on objects &lt;code&gt;myObject?.details?.name&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Nullish coalescing operator &lt;code&gt;a ?? b&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;String.prototype.matchAll()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Dynamic imports via &lt;code&gt;import()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Promise.allSettled()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;globalThis&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;import.meta&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Namespace re-exporting: &lt;code&gt;export \* as ns from "mod"&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  ES12 / ECMAScript 2021
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;String.prototype.replaceAll()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Promise.any()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;WeakRefs&lt;/code&gt; &lt;/li&gt;
&lt;li&gt;Logical assignment operators&lt;/li&gt;
&lt;li&gt;Underscores as separators in &lt;code&gt;number&lt;/code&gt; and &lt;code&gt;bigint&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What's next for JS?
&lt;/h2&gt;

&lt;p&gt;JavaScript's yearly release pace doesn't look to be slowing down anytime soon. ES13 is already in the works, slated for release in 2022 with a still-growing list of new additions like &lt;code&gt;.at()&lt;/code&gt; for arrays, &lt;code&gt;Object.hasOwn()&lt;/code&gt;. If you want to stay ahead of the curve, you can follow the progress of proposals for language additions &lt;a href="https://github.com/tc39/proposals"&gt;here on GitHub&lt;/a&gt;. There are some that will come out next year, but many more to keep an eye on for later versions (personally, I'm hoping for the pipe operator soon).&lt;/p&gt;

&lt;p&gt;But until then, sound off in the comments with the JS features you were surprised are older or newer than you though or that you'd never even heard of before! Unless you work with ECMA International, I'm willing to bet there's a few 😄.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>programming</category>
      <category>es6</category>
    </item>
  </channel>
</rss>
