JavaScript ES6: Moderne Features die u Moet Kennen

JavaScript ES6 Features

ECMAScript 2015, beter bekend als ES6, heeft JavaScript fundamenteel veranderd. Deze update introduceerde een schat aan nieuwe features die de taal moderne, eleganter en krachtiger maakten. In dit artikel bespreken we de belangrijkste ES6 features die elke JavaScript ontwikkelaar zou moeten kennen.

1. Let en Const - Nieuwe Variabele Declaraties

ES6 introduceerde twee nieuwe manieren om variabelen te declareren: let en const.

Let

Let biedt block-scoped variabelen, in tegenstelling tot var die function-scoped is:

// ES5
for (var i = 0; i < 3; i++) {
    setTimeout(() => console.log(i), 100); // Prints 3, 3, 3
}

// ES6
for (let i = 0; i < 3; i++) {
    setTimeout(() => console.log(i), 100); // Prints 0, 1, 2
}

Const

Const declareert constanten die niet opnieuw toegewezen kunnen worden:

const API_URL = 'https://api.example.com';
const user = { name: 'John', age: 30 };

// Dit werkt niet:
// API_URL = 'https://api2.example.com'; // TypeError

// Dit werkt wel (object properties kunnen nog steeds worden gewijzigd):
user.age = 31;

2. Arrow Functions

Arrow functions bieden een beknoptere syntax voor functies en behouden de this context van de omliggende scope:

// ES5
var multiply = function(a, b) {
    return a * b;
};

// ES6
const multiply = (a, b) => a * b;

// Met meerdere statements
const processUser = (user) => {
    console.log('Processing user:', user.name);
    return user.id;
};

// Array methods met arrow functions
const numbers = [1, 2, 3, 4, 5];
const doubled = numbers.map(n => n * 2);
const evens = numbers.filter(n => n % 2 === 0);

3. Template Literals

Template literals maken string interpolatie en multiline strings mogelijk:

// ES5
var name = 'John';
var age = 30;
var message = 'Hello, my name is ' + name + ' and I am ' + age + ' years old.';

// ES6
const name = 'John';
const age = 30;
const message = `Hello, my name is ${name} and I am ${age} years old.`;

// Multiline strings
const html = `
    <div class="user-card">
        <h2>${name}</h2>
        <p>Age: ${age}</p>
    </div>
`;

4. Destructuring Assignment

Destructuring maakt het mogelijk om waarden uit arrays en objecten uit te pakken in afzonderlijke variabelen:

Array Destructuring

const colors = ['red', 'green', 'blue'];

// ES5
var firstColor = colors[0];
var secondColor = colors[1];

// ES6
const [first, second, third] = colors;
console.log(first); // 'red'

// Met rest operator
const [primary, ...others] = colors;
console.log(others); // ['green', 'blue']

Object Destructuring

const user = { name: 'John', age: 30, city: 'Brussels' };

// ES5
var name = user.name;
var age = user.age;

// ES6
const { name, age, city } = user;

// Met aliassen
const { name: userName, age: userAge } = user;

// Met default waarden
const { name, age, country = 'Belgium' } = user;

5. Default Parameters

ES6 maakt het mogelijk om default waarden voor functie parameters te definiëren:

// ES5
function greet(name, greeting) {
    name = name || 'Guest';
    greeting = greeting || 'Hello';
    return greeting + ', ' + name + '!';
}

// ES6
function greet(name = 'Guest', greeting = 'Hello') {
    return `${greeting}, ${name}!`;
}

// Arrow function met default parameters
const calculateArea = (width = 1, height = 1) => width * height;

6. Rest en Spread Operators

Rest Operator (...)

Verzamelt meerdere elementen in een array:

// Rest parameters
function sum(...numbers) {
    return numbers.reduce((total, num) => total + num, 0);
}

console.log(sum(1, 2, 3, 4)); // 10

// Rest in destructuring
const [first, ...rest] = [1, 2, 3, 4, 5];
console.log(rest); // [2, 3, 4, 5]

Spread Operator (...)

Spreidt elementen van een array of object uit:

// Array spread
const arr1 = [1, 2, 3];
const arr2 = [4, 5, 6];
const combined = [...arr1, ...arr2]; // [1, 2, 3, 4, 5, 6]

// Object spread
const user = { name: 'John', age: 30 };
const updatedUser = { ...user, city: 'Brussels' };

// Function calls
const numbers = [1, 2, 3];
console.log(Math.max(...numbers)); // 3

7. Enhanced Object Literals

ES6 maakte object literals krachtig en beknopter:

const name = 'John';
const age = 30;

// ES5
var user = {
    name: name,
    age: age,
    greet: function() {
        return 'Hello, ' + this.name;
    }
};

// ES6
const user = {
    name,        // Shorthand property
    age,
    greet() {    // Method shorthand
        return `Hello, ${this.name}`;
    },
    [`dynamic_${Date.now()}`]: 'dynamic value' // Computed property names
};

8. Classes

ES6 introduceerde class syntax als syntactic sugar over JavaScript's prototype-based inheritance:

// ES6 Class
class User {
    constructor(name, email) {
        this.name = name;
        this.email = email;
    }
    
    greet() {
        return `Hello, I'm ${this.name}`;
    }
    
    // Static method
    static createGuest() {
        return new User('Guest', '[email protected]');
    }
}

// Inheritance
class AdminUser extends User {
    constructor(name, email, permissions) {
        super(name, email);
        this.permissions = permissions;
    }
    
    hasPermission(permission) {
        return this.permissions.includes(permission);
    }
}

const admin = new AdminUser('Alice', '[email protected]', ['read', 'write']);

9. Modules (Import/Export)

ES6 modules bieden een gestandaardiseerde manier om code te organiseren:

// math.js
export const PI = 3.14159;
export function add(a, b) {
    return a + b;
}
export default function subtract(a, b) {
    return a - b;
}

// main.js
import subtract, { PI, add } from './math.js';
import * as mathUtils from './math.js';

console.log(add(2, 3)); // 5
console.log(subtract(5, 2)); // 3
console.log(mathUtils.PI); // 3.14159

10. Promises

Promises bieden een elegante oplossing voor asynchrone programmering:

// Creating a Promise
const fetchUserData = (userId) => {
    return new Promise((resolve, reject) => {
        // Simulate API call
        setTimeout(() => {
            if (userId > 0) {
                resolve({ id: userId, name: 'John' });
            } else {
                reject(new Error('Invalid user ID'));
            }
        }, 1000);
    });
};

// Using Promises
fetchUserData(1)
    .then(user => console.log('User:', user))
    .catch(error => console.error('Error:', error));

// Promise chaining
fetchUserData(1)
    .then(user => `Hello, ${user.name}`)
    .then(greeting => console.log(greeting))
    .catch(error => console.error(error));

11. Map en Set

Nieuwe data structures voor verschillende use cases:

// Map
const userRoles = new Map();
userRoles.set('john', 'admin');
userRoles.set('jane', 'user');

console.log(userRoles.get('john')); // 'admin'
console.log(userRoles.has('jane')); // true

// Set
const uniqueIds = new Set([1, 2, 3, 3, 4, 4]);
console.log(uniqueIds); // Set {1, 2, 3, 4}

uniqueIds.add(5);
console.log(uniqueIds.size); // 5

Best Practices voor ES6

  • Gebruik const by default: Alleen let als herherziening nodig is
  • Prefer arrow functions: Voor callbacks en korte functies
  • Use template literals: Voor string concatenation
  • Destructure when possible: Maakt code leesbaarder
  • Use modules: Voor betere code organisatie
  • Embrace async/await: Voor betere Promise handling (ES2017)

Browser Ondersteuning

De meeste ES6 features hebben uitstekende browser ondersteuning in moderne browsers. Voor oudere browsers kun je transpilers zoals Babel gebruiken om ES6 code te converteren naar ES5.

Conclusie

ES6 heeft JavaScript getransformeerd van een eenvoudige scripting taal naar een krachtige, moderne programmeertaal. Deze features maken code leesbaarder, onderhoudbaarder en krachtiger.

Begin met het integreren van deze features in uw dagelijkse development werk. Start met de basics zoals let/const en arrow functions, en werk geleidelijk toe naar geavanceerdere concepten zoals classes en modules.

Wilt u JavaScript beheersen?

Onze JavaScript cursus behandelt alle moderne features en best practices.

JavaScript Cursus