Introduction:
In 2015, ECMAScript 2015 (ES6) brought a significant update to JavaScript, introducing a lot of powerful features that transformed the way we write code. In this blog post, we will delve into 17 prominent ES6 features, accompanied by code examples for each, to demonstrate how they can enhance your JavaScript development experience.
1. let and const: Improved Variable Declarations
ES6 introduced block-scoped variables with let
and constants with const
. This allows for better variable scoping and the creation of immutable values, respectively.
When you save something in a let
variable then it can be changed or overridden to something else for example;
let num = 0;
num = 1;
// num is now equal to 1
But the opposite applies to a constant, as its name suggests, whatever you save in a const
can't be changed later on and you won't be given a chance to override it or redefine it as with the let
variable.
const count = 10;
count = 20; // an error would occur here
2. Arrow Functions for Concise Function Expressions
Arrow functions provide a shorter syntax for defining functions and automatically bind the surrounding context for this
.
const add = (a, b) => a + b;
add(2, 2);
At first sight this may look weird. You might want to ask if that is a function or variable or both. It is a function saved in a variable and its equivalent to this below;
const add = function(a, b) {return a + b};
add(2, 2)
But we can agree that the arrow function is more concise, in fact if we had only one argument you can remove the brackets;
const greet = name => console.log('Welcome'+ ' ' + name)
greet('Ife');
// check your console
3. Template Literals: Flexible String Formatting
Personally this is one of my favourites. Template literals enable multi-line strings and the interpolation of variables within a string using backticks. Before template literals writing strings had some problems, the one that got to me was this;
let text= 'It\'s alright.';
// I just hated the backslash for no reason
another option was to use double quotes, which wasn't really my thing:
let text = "It's alright."
// this looked better though
The above used to be a better approach to handling the apostrophe in words and whether the word was in "quotes" or not but sometimes there was need to join a string with a variable and the resort was usually this:
let name = 'Ife';
console.log('My name is' + ' ' name)
Of course there always had to be an additional empty string to separate the words from each other, but congratulations to all javascript developers as ES6 brought about glad tiding.
Instead of the 'single' or "double" quotes you can just use template strings
const name = 'Ife';
console.log(`Hello, ${name}!`);
instead of concatenating variables and string together you can simply add them provided you use a template string and wrap your variable in a dollar and curly bracket sign ${}
.
In fact not only can you keep a variable inside but also perform some mathematical operations amongst others.
const answer = `The answer is ${50 % 40}`;
console.log(answer)
4. Destructuring Assignment: Extracting Values with Ease
Destructuring allows extracting values from arrays and objects into distinct variables, making code more concise.
Before we used to got through the route of ;
let user = {
email: 'ife@gmail.com',
password: 12345,
name: 'ifeoluwa',
username: 'ife_xxo'
}
const name = user.name;
const email = user.email;
console.log(name, email)
But now destructuring finds where the value is itself and saves it in a variable providing you supplied the right name;
let user = {
email: 'ife@gmail.com',
password: 12345,
name: 'ifeoluwa',
username: 'ife_xxo'
}
const {name, email} = user;
console.log(name, email)
5. Default Parameters: Simplified Function Arguments
ES6 introduced default parameter values, which are used when an argument is not provided or is undefined
.
function greet(name = "Guest") {
console.log(`Hello, ${name}!`);
}
greet('Ife') // then default valid won't apply
greet() // then default value will apply and it will say "Hello Guest!"
6. Rest Parameters: Variable-Length Arguments
Rest parameters enable functions to accept any number of arguments as an array, making it easier to handle variable-length parameter lists.
function examp(a, b, ...therest) {
console.log('a', a)
console.log('b', b)
console.log(therest)
}
examp(1, 2, 3, 4, 5, 6)
The rest of the argument are stored in an array, if you check your console you will find 3, 4, 5, 6
.
7. Spread Operator: Unpacking Arrays and Objects
The spread operator allows expanding arrays and objects into individual elements, making it useful for function arguments or array manipulation.
const arr1 = [1, 2, 3];
const arr2 = [...arr1, 4, 5];
const obj1 = { x: 1, y: 2 };
const obj2 = { ...obj1, z: 3 };
8. Classes: Object-Oriented Programming Made Easier
ES6 introduced a more structured syntax for creating classes, constructors, and inheritance. For example;
class Animal {
constructor(name) {
this.name = name;
}
eat() {
console.log(`${this.name} is eating some food`)
}
sleep() {
console.log(`${this.name} is asleep`)
}
}
Inheritance allows classes to inherit properties and methods from other classes, forming a hierarchical relationship. In JavaScript, inheritance is achieved using prototypes.
class Dog extends Animal {
bark() {
console.log(`${this.name} is barking.`);
}
}
const myDog = new Dog('Buddy');
myDog.eat(); // Output: Buddy is eating.
myDog.bark(); // Output: Buddy is barking.
myDog.sleep(); // Output: Buddy is sleeping
In the above snippet, Dog inherits it's method eat()
and sleep()
from it's parent Animal, because if you think about it all animals eat and sleep but the method bark()
is peculiar to dogs only.
9. Modules: Organized Code Sharing
ES6 modules provide a standardized way to organize and share code across multiple files, improving code maintainability.
// math.js
export const PI = 3.14159;
export function double(x) {
return x * 2;
}
// app.js
import { PI, double } from "./math.js";
console.log(double(PI));
We do this a lot in react when we're importing or exporting one component or another.
10. Promises: Managing Asynchronous Operations
Promises simplify asynchronous programming, allowing more readable and maintainable code for handling asynchronous operations.
fetch("https://api.example.com/data")
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error(error));
11. Enhanced Object Literals: More Expressive Objects
ES6 enhanced object literals allow concise syntax for defining methods, dynamic property names, and object shorthand.
const name = 'Ife';
const person = {
name,
sayHello() {
console.log(`Hello, ${this.name}!`);
}
};
12. Iterators and Generators: Custom Iteration Control
Iterators and generators provide ways to define custom iteration behavior, enabling advanced control over looping in JavaScript.
const iterable = {
*[Symbol.iterator]() {
yield 1;
yield 2;
yield 3;
}
};
for (const item of iterable) {
console.log(item);
}
13. Map and Set: Advanced Data Structures
ES6 introduced built-in data structures such as Map
for key-value pairs and Set
for unique values, offering powerful alternatives to arrays and objects.
const map = new Map();
map.set("name", "John");
map.set("age", 30);
console.log(map.get("name"));
const set = new Set([1, 2, 3, 3, 4, 5]);
console.log(set.size);
15. Symbol: Unique Identifier Creation
Symbols are unique and immutable values that can be used as object property keys, preventing unintentional property name collisions.
const firstName = Symbol('firstName');
const lastName = Symbol('lastName');
const person = {
[firstName]: 'John',
[lastName]: 'Doe',
age: 30,
city: 'New York'
};
console.log(person[firstName]); // Output: John
console.log(person[lastName]); // Output: Doe
16. String Methods: Enhancing String Manipulation
ES6 introduced new string methods, including startsWith()
, endsWith()
, and includes()
, facilitating common string operations.
const str = "Hello, World!";
console.log(str.startsWith("Hello")); // true
console.log(str.endsWith("!")); // true
console.log(str.includes("World")); // true
17. Async/Await: Simplifying Asynchronous Code
Async/await is a powerful syntactic feature that makes asynchronous code look more synchronous and easier to understand.
async function fetchData() {
try {
const response = await fetch("https://api.example.com/data");
const data = await response.json();
console.log(data);
} catch (error) {
console.error(error);
}
}
Using the Async/Await, the above is a simple way of fetching data from an api, off course in the course of this other functions can be called to carry out other actions.
Conclusion:
These 17 prominent ES6 features have revolutionized JavaScript development, enhancing its readability, maintainability, and overall capabilities.
By leveraging these features in your projects, you can unlock the full potential of JavaScript and write more efficient and elegant code. Explore and experiment with these features further to elevate your JavaScript skills to the next level. Happy coding! And thanks for reading.
Top comments (2)
Excellent compilation!
One should understand these javascript basics before jumping into Angular, React, Next.js etc.
Thanks for reading.