DEV Community

Yanis
Yanis

Posted on • Originally published at strictmode.io

Upcoming ECMAScript features I'm excited about

ECMAScript spec train hasn't slowed down anyhow. There are still tons of great proposals waiting for their time.

Here are several of the upcoming ECMAScript features I'm particularly excited about.

Temporal

The date/time API has always been a weak point of JavaScript. Great libraries like moment.js (already deprecated) emerged to fix this, and they did great.

But now, finally, we got to a point where we can sum up our knowledge and experience and introduce a modern, robust date/time API into JavaScript standard library.

Temporal is a new global object which acts as a module packed with utility functions (like Math). The API is based on immutable objects, and there's excellent support for time zones and non-Gregorian calendars.

Here are some examples.

// parsing a string
const d = Temporal.Instant.from('1969-07-20T20:17Z')

// just plain date
Temporal.PlainDate.from({ year: 2000, month: 8, day: 2 });
// => 2000-08-02

// difference between two points
// in time in different time zones
const { from } = Temporal.ZonedDateTime

from('2020-03-08T11:55:00+08:00[Asia/Hong_Kong]')
  .until(from('2020-03-08T09:50:00-07:00[America/Los_Angeles]'))
  //=> PT12H55M
Enter fullscreen mode Exit fullscreen mode

I recommend skimming through the cookbook to really realize the potential of this great API.

Array grouping

This small proposal adds two group and groupToMap to the Array's prototype.

Both methods are used to group items in an array by certain criteria (the closest relative is lodash's groupBy).

  const users = [
    { name: "Jane" },
    { name: "John" },
    { name: "Tom" }
  ]
  users.group(u => u.name.toLowerCase().charAt(0))
  // {
  // "j": [{name: "Jane"}, {name: "John"],
  // "t": [{ name: "Tom" }]
  // }
Enter fullscreen mode Exit fullscreen mode

The groupToMap works similarly but gives us a Map. It might come in handy when we need non-string keys.

Well, and there are other reasons to prefer Maps.

Array's change-by-copy (Stage 3)

What's wrong with Array's methods like reverse, sort, or splice? Well, nothing, they are all great. The only problem is that they modify the array in place, making it harder to use them in an FP code.

This proposal introduces 4 new non-mutating methods on arrays (and also on typed arrays) which work similarly, but don't modify the source array: toReversed(), toSorted(), toSpliced(), and with().

The last one is used to replace a single element in an array:

['j', 'a', 'n', 'e'].with(2, 'd')
//=> ['j', 'a', 'd', 'e']
Enter fullscreen mode Exit fullscreen mode

Records and Tuples

Records and tuples are new primitive data structures similar to objects and arrays but deeply immutable.

const record = #{ name: "John", surname: "Smith" }
const tuple = #[1, 2, 3]
Enter fullscreen mode Exit fullscreen mode

The syntax highlights the similarities between them and objects/arrays. All you have to do is to prefix it with #.

Records and tuples can only contain other primitive values (including other records/tuples).

This limitation allows them to be deeply immutable.

It allows makes the equality comparison === work for them like for other primitives. If two records/tuples are structurally deeply equal, the === will return true - and this is a big deal.

Introducing such data structures is a great way to improve the JavaScript functional capabilities (as immutability is crucial in the functional paradigm).

But this is quite a big topic, and I will return to it in a dedicated article.

Where to go next

Those were the great JavaScript proposals I can't wait for. Hope you like them too.

More proposals can be found on the official GitHub page.

Top comments (2)

Collapse
 
danwalsh profile image
Dan Walsh

Appreciate the heads up! Temporal looks like itโ€™s going to be super useful ๐Ÿ˜Š

Collapse
 
fkranenburg profile image
Ferry Kranenburg

Nice article, wel explained! I particularly like the new Temporal feature. I always really disliked in having to use third party libraries just to compute something with dates that I could rely on.