JavaScript Versions — ECMAScript 6(2015)

Logismiko
5 min readFeb 12, 2023

--

ECMAScript 2015 (ES6) was a major update to the JavaScript language, introducing many new features and improvements. In this article, we will explore some of the key features of ES6 and provide code examples to help you better understand how they work.

let and const

The let and const keywords were introduced in ES6 to provide block-level scoping for variables. let is used to declare a variable that can be reassigned, while const is used to declare a variable that cannot be reassigned.

// let example
let count = 0;
if (true) {
let count = 1;
console.log(count); // output: 1
}
console.log(count); // output: 0

// const example
const PI = 3.14;
PI = 3.14159; // error: assignment to constant variable

Arrow Functions

Arrow functions provide a more concise syntax for defining functions. They automatically bind to the this value of the enclosing scope and do not have their own this value.

// traditional function
function multiply(a, b) {
return a * b;
}

// arrow function
const multiply = (a, b) => a * b;
console.log(multiply(2, 3)); // output: 6

Template Literals

Template literals allow you to embed expressions and variables in a string using backticks instead of quotes. They also support multi-line strings.

const name = "John";
const age = 30;
const message = `My name is ${name} and I am ${age} years old.`;
console.log(message);
// output:
// "My name is John and I am 30 years old."

Destructuring

Destructuring allows you to extract values from objects and arrays and assign them to variables in a more concise way. Here is an example:

const person = {
name: 'John',
age: 30,
address: {
street: '123 Main St',
city: 'Anytown',
state: 'CA'
}
};

const { name, age, address: { city } } = person;
console.log(name, age, city);

Rest and spread operators

The rest operator (…) can be used to capture any number of arguments passed to a function as an array. The spread operator (…) can be used to spread out an array or object into individual values. Here are examples:

function sum(...numbers) {
return numbers.reduce((acc, curr) => acc + curr, 0);
}

console.log(sum(1, 2, 3, 4, 5));
const numbers = [1, 2, 3];
const moreNumbers = [4, 5, 6];
const allNumbers = [...numbers, ...moreNumbers];
console.log(allNumbers);

Default Parameters

Default parameters allow us to specify default values for function parameters. This provides a way of defining optional parameters in JavaScript.

For example, the following code defines a function using the old syntax:

function greet(name) {
name = name || "World";
console.log("Hello, " + name + "!");
}

With default parameters, we can write the same function in a more concise way:

function greet(name = "World") {
console.log(`Hello, ${name}!`);
}

Classes

ES6 introduced a new syntax for defining classes in JavaScript. Classes provide a more structured way of creating objects with methods and properties.

class Rectangle {
constructor(height, width) {
this.height = height;
this.width = width;
}
get area() {
return this.height * this.width;
}
set area(value) {
this._area = value;
}
}
const rect = new Rectangle(5, 10);
console.log(rect.area); // output: 50

Promises

Promises provide a way to handle asynchronous operations in JavaScript. They allow you to write code that runs asynchronously without blocking the main thread.

function getData() {
return new Promise((resolve, reject) => {
// fetch data from server
// resolve with data if successful
// reject with error if unsuccessful
});
}

getData()
.then((data) => {
console.log(data);
})
.catch((error) => {
console.error(error);
});

Modules

ES6 introduced a standardized module system for JavaScript. Modules are reusable pieces of code that can be imported and exported across different files and projects.

// File: utils.js
export function add(a, b) {
return a + b;
}

// File: app.js
import { add } from './utils.js';
const result = add(2, 3);
console.log(result); // 5

Generators

ES6 generators are another feature introduced in ECMAScript 2015 (ES6). They allow you to write functions that can be paused and resumed, providing a way to write code that can handle asynchronous operations in a more synchronous-looking way.

Generators are functions that use the function* syntax and can yield values using the yield keyword. When a generator function is called, it returns an iterator object, which can be used to iterate over the values that are yielded by the generator.

Here is an example of a generator function that yields the first five even numbers:

function* generateEvenNumbers() {
let num = 0;
while (num < 10) {
yield num;
num += 2;
}
}

const evenNumbers = generateEvenNumbers();
console.log(evenNumbers.next().value); // 0
console.log(evenNumbers.next().value); // 2
console.log(evenNumbers.next().value); // 4
console.log(evenNumbers.next().value); // 6
console.log(evenNumbers.next().value); // 8
console.log(evenNumbers.next().value); // undefined

In the above example, the generateEvenNumbers function is a generator function that yields even numbers. The yield keyword is used to return the value of num, and the function is paused at that point. When next() is called on the iterator object returned by the function, the generator function is resumed and continues execution from the point it was paused.

Generators can also be used for asynchronous operations, using the yield keyword to wait for promises to resolve. Here is an example of a generator function that makes an asynchronous call to an API and yields the response:

function* fetchUsers() {
try {
const response = yield fetch('https://jsonplaceholder.typicode.com/users');
const data = yield response.json();
console.log(data);
} catch (error) {
console.error(error);
}
}

const generator = fetchUsers();
const iterator = generator.next();
iterator.value.then((response) => {
return response.json();
}).then((data) => {
generator.next(data);
}).catch((error) => {
generator.throw(error);
});

In the above example, the fetchUsers function is a generator function that makes an asynchronous call to the API and yields the response. The response is then converted to JSON and the data is yielded. The try/catch block is used to handle errors.

Generators are a powerful feature of ES6 that allow for more expressive and readable code when dealing with asynchronous operations.

Conclusion

ECMAScript 2015 introduced many new features and improvements to the JavaScript language, making it easier to write more concise and efficient code. The let and const keywords, arrow functions, template literals, classes, and promises are just a few of the many new features that were introduced in ES6. By using these features and others like them, you can write cleaner, more efficient, and more maintainable JavaScript code.

--

--

Logismiko
Logismiko

Written by Logismiko

Logismiko - The Next-Generation software development studio. We have clients from all over the world, who trust us with their business identity and image.

No responses yet