ES6 introduced let and const to replace var.
let allows reassigning values but is block-scoped.
const prevents reassignment and is also block-scoped.
let name = "Alice";
name = "Bob";
const age = 30;
age = 31;
let name = "Alice";
name = "Bob";
const age = 30;
age = 31;
let name = "Alice";
name = "Bob";
const age = 30;
age = 31;
if (true) {
let x = 10;
console.log(x);
}
console.log(x); if (true) {
let x = 10;
console.log(x);
}
console.log(x); if (true) {
let x = 10;
console.log(x);
}
console.log(x); Template literals use backticks (`) and allow embedding expressions using ${}.
let user = "Alice";
console.log(`Hello, ${user}!`); let user = "Alice";
console.log(`Hello, ${user}!`); let user = "Alice";
console.log(`Hello, ${user}!`); Multiline strings are also possible:
let message = `This is
a multiline
string.`;
console.log(message);
let message = `This is
a multiline
string.`;
console.log(message);
let message = `This is
a multiline
string.`;
console.log(message);
Arrow functions provide a concise syntax for defining functions.
const add = (a, b) => a + b;
console.log(add(5, 3));
const add = (a, b) => a + b;
console.log(add(5, 3));
const add = (a, b) => a + b;
console.log(add(5, 3));
If there’s only one parameter, parentheses can be omitted:
const greet = name => `Hello, ${name}`;
console.log(greet("Alice"));const greet = name => `Hello, ${name}`;
console.log(greet("Alice"));const greet = name => `Hello, ${name}`;
console.log(greet("Alice"));Arrow functions do not have their own this binding, which makes them useful in certain contexts like callbacks.
Destructuring simplifies extracting values from arrays and objects.
let colors = ["red", "green", "blue"];
let [first, second] = colors;
console.log(first, second);
let colors = ["red", "green", "blue"];
let [first, second] = colors;
console.log(first, second);
let colors = ["red", "green", "blue"];
let [first, second] = colors;
console.log(first, second);
Skipping elements:
let [, , third] = colors;
console.log(third);
let [, , third] = colors;
console.log(third);
let [, , third] = colors;
console.log(third);
let person = { name: "Alice", age: 25 };
let { name, age } = person;
console.log(name, age); let person = { name: "Alice", age: 25 };
let { name, age } = person;
console.log(name, age); let person = { name: "Alice", age: 25 };
let { name, age } = person;
console.log(name, age); Renaming variables:
let { name: fullName } = person;
console.log(fullName); let { name: fullName } = person;
console.log(fullName); let { name: fullName } = person;
console.log(fullName); Used in function parameters to collect multiple arguments.
function sum(...numbers) {
return numbers.reduce((acc, num) => acc + num, 0);
}
console.log(sum(1, 2, 3, 4)); function sum(...numbers) {
return numbers.reduce((acc, num) => acc + num, 0);
}
console.log(sum(1, 2, 3, 4)); function sum(...numbers) {
return numbers.reduce((acc, num) => acc + num, 0);
}
console.log(sum(1, 2, 3, 4)); Functions can have default values for parameters.
function greet(name = "Guest") {
console.log(`Hello, ${name}`);
}
greet();
greet("Alice"); function greet(name = "Guest") {
console.log(`Hello, ${name}`);
}
greet();
greet("Alice"); function greet(name = "Guest") {
console.log(`Hello, ${name}`);
}
greet();
greet("Alice"); ES6 introduced modules for better code organization.
export function add(a, b) {
return a + b;
}
export const PI = 3.14;
export function add(a, b) {
return a + b;
}
export const PI = 3.14;
export function add(a, b) {
return a + b;
}
export const PI = 3.14;
import { add, PI } from "./math.js";
console.log(add(2, 3));
console.log(PI);
import { add, PI } from "./math.js";
console.log(add(2, 3));
console.log(PI);
import { add, PI } from "./math.js";
console.log(add(2, 3));
console.log(PI); For default exports:
export default function message() {
console.log("This is a default export");
}
import msg from "./message.js";
msg();
export default function message() {
console.log("This is a default export");
}
import msg from "./message.js";
msg();
export default function message() {
console.log("This is a default export");
}
import msg from "./message.js";
msg();Promises simplify handling asynchronous operations.
let fetchData = new Promise((resolve, reject) => {
setTimeout(() => resolve("Data loaded"), 2000);
});
fetchData.then(result => console.log(result)); let fetchData = new Promise((resolve, reject) => {
setTimeout(() => resolve("Data loaded"), 2000);
});
fetchData.then(result => console.log(result)); let fetchData = new Promise((resolve, reject) => {
setTimeout(() => resolve("Data loaded"), 2000);
});
fetchData.then(result => console.log(result)); Handling errors:
fetchData
.then(result => console.log(result))
.catch(error => console.log(error));
fetchData
.then(result => console.log(result))
.catch(error => console.log(error));
fetchData
.then(result => console.log(result))
.catch(error => console.log(error));
async functions work with await to simplify promises.
async function fetchData() {
return "Data received";
}
fetchData().then(data => console.log(data));async function fetchData() {
return "Data received";
}
fetchData().then(data => console.log(data));async function fetchData() {
return "Data received";
}
fetchData().then(data => console.log(data));Using await inside an async function:
async function fetchUser() {
let response = await fetch("https://jsonplaceholder.typicode.com/users/1");
let user = await response.json();
console.log(user);
}
fetchUser();async function fetchUser() {
let response = await fetch("https://jsonplaceholder.typicode.com/users/1");
let user = await response.json();
console.log(user);
}
fetchUser();async function fetchUser() {
let response = await fetch("https://jsonplaceholder.typicode.com/users/1");
let user = await response.json();
console.log(user);
}
fetchUser();ES6+ features improve JavaScript's efficiency, readability, and maintainability. The next section will explore asynchronous JavaScript, covering callbacks, promises, and async/await in detail.