Back to Blog
tutorials Featured

10 Modern JavaScript Features That Make Coding a Joy

Discover the latest JavaScript features that are making developers lives easier and code more elegant.

By JS Monster Team

JavaScript keeps evolving, and each year brings new features that make our code cleaner, more expressive, and more fun to write. Let’s explore the modern JavaScript features that are turning developers into happy monsters!

1. Optional Chaining (?.)

No more endless null checks! Optional chaining lets you safely access nested properties.

// Before 😫
if (user && user.address && user.address.street) {
  console.log(user.address.street);
}

// After 😎
console.log(user?.address?.street);

2. Nullish Coalescing (??)

Finally, a way to handle null/undefined without the falsy value confusion.

// Problematic with || operator
const count = 0;
const displayCount = count || 10; // Returns 10 (wrong!)

// Perfect with ??
const displayCount = count ?? 10; // Returns 0 (correct!)

3. Array Methods That Spark Joy

at() Method

Access arrays from the end without length calculations:

const monsters = ['👹', '👺', '👻', '👽'];
console.log(monsters.at(-1)); // '👽'

flatMap()

Map and flatten in one go:

const sentences = ['Hello world', 'JS rocks'];
const words = sentences.flatMap((s) => s.split(' '));
// ['Hello', 'world', 'JS', 'rocks']

4. Destructuring with Default Values

Extract and provide fallbacks elegantly:

const { name = 'Anonymous Monster', power = 100 } = monster;

5. Template Literals for Everything

Multi-line strings and expressions without concatenation hell:

const monster = {
  name: 'JS Beast',
  level: 9000,
};

const bio = `
  Meet ${monster.name}!
  Power Level: ${monster.level > 9000 ? 'OVER 9000!' : monster.level}
`;

6. Spread Operator Magic

Clone, merge, and transform with ease:

// Merge objects
const fullMonster = { ...baseMonster, ...upgrades };

// Clone arrays
const monsterArmy = [...originalMonsters];

// Convert NodeList to Array
const elements = [...document.querySelectorAll('.monster')];

7. Dynamic Import()

Load modules on demand for better performance:

button.addEventListener('click', async () => {
  const { startBattle } = await import('./battle-system.js');
  startBattle();
});

8. Private Class Fields

Real privacy in JavaScript classes:

class Monster {
  #secretPower = 1000;

  unleash() {
    return this.#secretPower * 2;
  }
}

9. Promise.allSettled()

Handle multiple promises without fail-fast behavior:

const results = await Promise.allSettled([
  fetchMonster('golden-gremlin'),
  fetchMonster('furry-fighter'),
  fetchMonster('world-chomper'),
]);

results.forEach((result) => {
  if (result.status === 'fulfilled') {
    console.log('Monster loaded:', result.value);
  }
});

10. Logical Assignment Operators

Combine logic and assignment in one expression:

// Assign if null/undefined
monster.power ??= 100;

// Assign if truthy
monster.isAwake &&= checkActivity();

// Assign if falsy
monster.energy ||= recharge();

The Future is Bright (and Yellow)

These features aren’t just syntactic sugar - they represent JavaScript’s evolution into a more expressive, safer, and more enjoyable language. Each feature reduces boilerplate, prevents bugs, and makes our code more readable.

The JS Monster grows stronger with each update, and so do we as developers. What’s your favorite modern JavaScript feature? Are you using these in production yet?

Keep coding, keep learning, and keep feeding the JS Monster within!

Tags

#javascript #es6 #modern-js #tips
🟨

Join the Monster Community!

Share your thoughts and JavaScript adventures.

Join the Discussion