68 – Symbols (Javascript)

Exploring ES6+ Features: Symbols

ES6 introduced a new primitive data type called “Symbols,” which are unique and immutable values often used as object property keys. Symbols provide a way to create hidden and unchangeable object properties, contributing to cleaner and more robust code. In this guide, we’ll delve into the world of Symbols, understand their creation, and explore their use cases in JavaScript.

What Are Symbols?

Symbols are unique and immutable values. Unlike other primitive data types like numbers and strings, they don’t have literal representations (e.g., you can’t create a symbol with 'mySymbol'), making them ideal for creating hidden and unchangeable object properties.

Creating Symbols

You can create a symbol using the Symbol() factory function, which returns a new, unique symbol each time you call it:

JavaScript:


const mySymbol = Symbol('description');
const anotherSymbol = Symbol('description');

console.log(mySymbol === anotherSymbol); // false

The optional string parameter passed to Symbol() is a description that helps with debugging but doesn’t affect the uniqueness of the symbol.

Using Symbols as Object Properties

Symbols are often used as object property keys, creating private and hidden properties. Here’s an example:

JavaScript:


const user = {
  [mySymbol]: 'Alice',
};

console.log(user[mySymbol]); // 'Alice'

This property is not accessible via the Object.keys() method or a for...in loop, making it truly hidden and unchangeable.

Use Cases for Symbols
1. Creating Hidden Properties

Symbols are a practical way to create hidden and private properties within objects, protecting them from accidental modification or access.

2. Object Property Names

Symbols are unique, so they can be used as keys in objects to avoid property name collisions.

3. Well-Known Symbols

ES6 introduced several built-in symbols, called well-known symbols, that are used to customize various object behaviors, such as Symbol.iterator for creating iterable objects.

Practical Example: Using Symbols to Create a Private Method

Here’s an example of using a symbol to create a private method in an object:

JavaScript:


const user = {
  name: 'Alice',
  [Symbol('incrementAge')]() {
    this.age = (this.age || 0) + 1;
  },
};

console.log(user.age); // undefined
user[Symbol('incrementAge')]();
console.log(user.age); // undefined

The [Symbol('incrementAge')] method is private and inaccessible from outside the object.

Benefits of Using Symbols
1. Improved Encapsulation

Symbols allow you to create truly private properties and methods within objects, enhancing encapsulation.

2. Uniqueness

Each symbol is unique, reducing the risk of accidental property name collisions in objects.

3. Customizing Object Behaviors

Well-known symbols provide a way to customize built-in object behaviors, offering better control over language features.

Conclusion

Symbols in JavaScript are a powerful addition, enabling developers to create hidden, unchangeable object properties and private methods. They play a crucial role in enhancing encapsulation and reducing the risk of naming conflicts in objects. Understanding how to create and use symbols is a valuable skill for modern JavaScript development.