DEV Community

Cover image for 🔥10 JavaScript Tips and Tricks That Will Be Useful
Anthony Max Subscriber for HMPL.js

Posted on

🔥10 JavaScript Tips and Tricks That Will Be Useful

Hello everyone! In this article I would like to describe 10 simple, but at the same time effective tips and tricks that will help you achieve more understandable and effective JavaScript code. Perhaps you know some of them, and perhaps you know all of them. It would be great if you write more about any of them in the comments.

1. Destructuring for Cleaner Code

Destructuring is a syntax that allows you to unpack values from arrays or properties from objects into variables. This reduces repetitive code and improves readability.

// Before destructuring
const user = { name: "Alice", age: 25 };
const name = user.name;
const age = user.age;

// Using destructuring
const { name, age } = user;
console.log(name, age); // Output: Alice 25
Enter fullscreen mode Exit fullscreen mode

Without destructuring, you must explicitly reference each property, leading to verbose and repetitive code. With destructuring, you extract name and age directly from the user object in a single statement. This is especially useful when dealing with large objects or arrays, as it simplifies the assignment process.

2. Optional Chaining for Safer Access

Optional chaining ?. allows you to access deeply nested properties without worrying about errors if a property doesn’t exist. Instead of throwing an error, it returns undefined.

const user = { profile: { email: "user@example.com" } };

console.log(user?.profile?.email); // Output: user@example.com
console.log(user?.settings?.theme); // Output: undefined (no error)
Enter fullscreen mode Exit fullscreen mode

Traditional property access would require checks like if (user && user.profile). Optional chaining removes this hassle, ensuring your code doesn’t break if an intermediate property (settings in this case) is undefined or null. This makes it easier to work with unpredictable or incomplete data, especially from APIs.

3. Default Parameters

Default parameters allow you to set default values for function arguments. This ensures that your function behaves predictably when called without certain parameters.

function greet(name = "Guest") {
  return `Hello, ${name}!`;
}

console.log(greet()); // Output: Hello, Guest!
console.log(greet("Alice")); // Output: Hello, Alice!
Enter fullscreen mode Exit fullscreen mode

In this example, the greet function uses a default value of "Guest" for the name parameter. If no argument is passed, it falls back to the default. This is particularly useful for handling optional inputs, reducing the need for manual checks or fallback logic inside the function.

4. Array Methods: Map, Filter, and Reduce

These methods provide powerful, declarative ways to manipulate arrays without needing traditional loops.

const numbers = [1, 2, 3, 4];

// Transform each element with map
const doubled = numbers.map(num => num * 2); // [2, 4, 6, 8]

// Filter elements based on a condition
const evens = numbers.filter(num => num % 2 === 0); // [2, 4]

// Aggregate values with reduce
const sum = numbers.reduce((acc, num) => acc + num, 0); // 10
Enter fullscreen mode Exit fullscreen mode
  1. map() processes each element and returns a new array, great for transformations.
  2. filter() creates a subset of the array based on a condition, useful for eliminating unwanted elements.
  3. reduce() combines all elements into a single value, making it ideal for tasks like summation or building objects.

These methods allow for cleaner, more expressive code compared to manually iterating over arrays.

5. Template Literals

Template literals use backticks and enable multi-line strings and inline variable interpolation, making string manipulation more convenient.

const name = "Alice";
const greeting = `Hello, ${name}!
Welcome to JavaScript tips!`;

console.log(greeting);
Enter fullscreen mode Exit fullscreen mode

Traditional string concatenation "Hello, " + name + "! is cumbersome and error-prone. Template literals make it easier to embed variables (
${name} directly into strings and format multi-line text without escape characters \n. This improves readability, especially for dynamic or complex strings.

6. The Spread Operator

The spread operator ... is a versatile tool to copy, combine, or expand arrays and objects.

const arr1 = [1, 2];
const arr2 = [3, 4];
const combined = [...arr1, ...arr2]; // [1, 2, 3, 4]

const user = { name: "Alice", age: 25 };
const updatedUser = { ...user, age: 26 }; // { name: "Alice", age: 26 }
Enter fullscreen mode Exit fullscreen mode
  1. For arrays, the spread operator merges arr1 and arr2 into a new array.
  2. For objects, it creates a shallow copy of user while overriding the age property.

This avoids mutation (direct modification) of original data structures, which is a best practice for maintaining clean, predictable code.

7. Short-Circuit Evaluation

Logical operators && and || can simplify conditional expressions by leveraging their short-circuit behavior.

const isLoggedIn = true;
const welcomeMessage = isLoggedIn && "Welcome back!";
console.log(welcomeMessage); // Output: Welcome back!

const username = null;
const displayName = username || "Guest";
console.log(displayName); // Output: Guest
Enter fullscreen mode Exit fullscreen mode
  • && returns the second value if the first is true. If isLoggedIn is true, it evaluates and returns "Welcome back!".
  • || returns the first truthy value. If username is null, it falls back to "Guest".

These shortcuts eliminate the need for if statements in simple conditional assignments.

8. Debounce and Throttle

Debounce and throttle control how often a function executes during rapid events like typing or scrolling.

function debounce(func, delay) {
  let timer;
  return function (...args) {
    clearTimeout(timer);
    timer = setTimeout(() => func(...args), delay);
  };
}

function throttle(func, interval) {
  let lastTime = 0;
  return function (...args) {
    const now = Date.now();
    if (now - lastTime >= interval) {
      lastTime = now;
      func(...args);
    }
  };
}
Enter fullscreen mode Exit fullscreen mode
  • Debounce ensures the function runs only after the user stops triggering it for a specific delay. Useful for search inputs.
  • Throttle limits execution to once per interval, regardless of how many times the event is fired. Ideal for scroll listeners.

These techniques optimize performance and prevent excessive function calls.

Let's say debounce is well suited for those cases when working with input, because each time a character is entered, a request will be sent to the server, while throttle is suitable for working with scrolling, or with moving the cursor across the screen.

9. Promise.all for Concurrent Operations

Promise.all allows you to run multiple promises concurrently and wait for all of them to resolve.

const fetchData1 = fetch("/api/data1");
const fetchData2 = fetch("/api/data2");

Promise.all([fetchData1, fetchData2])
  .then(responses => Promise.all(responses.map(res => res.json())))
  .then(data => console.log(data))
  .catch(error => console.error(error));
Enter fullscreen mode Exit fullscreen mode

By combining promises, Promise.all ensures that all asynchronous tasks complete before proceeding. In this example, both API calls run in parallel, and the results are processed together, saving time compared to sequential requests.

10. Arrow Functions and Lexical this

Arrow functions do not bind their own this; they inherit it from the surrounding scope.

function Timer() {
  this.seconds = 0;

  setInterval(() => {
    this.seconds++;
    console.log(this.seconds);
  }, 1000);
}

const timer = new Timer();
Enter fullscreen mode Exit fullscreen mode

In the Timer example, using an arrow function inside setInterval ensures that this refers to the Timer instance. Regular functions would bind this dynamically to the global scope or the calling context, leading to errors. Arrow functions simplify handling of this, making them ideal for callbacks.

Top comments (1)

Collapse
 
anthonymax profile image
Anthony Max

You can add more and more complex ones, but I think that these are some of the main ones.