26 Clean Code JavaScript Tips for Efficient Programming

Lokesh Prajapati
5 min readMar 29, 2024

--

As developers, we strive to write code that’s not just functional but also clean and efficient. Clean code is crucial for maintainability, scalability, and readability. In the ever-evolving world of JavaScript, adopting best practices for writing clean code can significantly improve your programming efficiency and the quality of your projects. Here are 26 tips to help you write cleaner, more efficient JavaScript code, complete with examples to guide your journey.

1. Use const and let Over var

Avoid using var to declare variables. Instead, use let and const for block-scoped variables to improve readability and reduce runtime errors.

// Instead of
var name = 'Lokesh Prajapati';

// Use
const name = 'Lokesh Prajapati'; // for constants
let age = 24; // for variables that may change

2. Descriptive Variable Names

Choose variable and function names that describe their purpose or the value they hold.

// Instead of
const d = new Date();

// Use
const currentDate = new Date();

3. Use Template Literals

Template literals make string concatenation more readable.

const name = 'Lokesh';
console.log(`Hello, ${name}!`); // More readable

4. Destructuring Assignments

Destructuring makes it easier to extract values from arrays or properties from objects.

const person = { name: 'Lokesh', age: 24 };
const { name, age } = person;

5. Default Parameters

Use default parameters to make your functions more robust.

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

6. Arrow Functions

Arrow functions provide a concise syntax and lexically bind the this value.

const add = (a, b) => a + b;

7. Use Promise and Async/Await for Asynchronous Code

Promises and async/await syntax make asynchronous code easier to read and manage.

async function fetchData() {
const data = await fetch('https://api.example.com');
return data.json();
}

8. Modules

Use modules to organize and reuse your code efficiently.

// math.js
export const add = (a, b) => a + b;

// app.js
import { add } from './math.js';
console.log(add(2, 3));

9. Short-circuit Evaluation

Use short-circuit evaluation for concise conditional expressions.

const greet = name => console.log(name || 'Guest');

10. Ternary Operator

The ternary operator can simplify your if-else statements.

const age = 20;
const canVote = age >= 18 ? 'Yes' : 'No';

11. Spread Operator

The spread operator allows an iterable to expand in places where 0+ arguments are expected.

const nums = [1, 2, 3];
const newNums = [...nums, 4, 5];

12. Rest Parameters

Rest parameters allow functions to accept an indefinite number of arguments as an array.

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

13. Chain Promises Wisely

Chain promises to avoid the “callback hell” and keep your code clean.

fetchData()
.then(data => processData(data))
.then(result => displayData(result))
.catch(error => console.error(error));

14. Use Array and Object Methods

Leverage built-in methods for arrays and objects for more concise and descriptive code.

const numbers = [1, 2, 3, 4, 5];
const doubled = numbers.map(number => number * 2);

15. Early Returns

Use early returns to avoid deep nesting and make your functions clearer.

function processUser(user) {
if (!user) return;
// Process user
}

16. Avoid Global Variables

Minimize the use of global variables to reduce potential conflicts and bugs.

(() => {
const localVar = 'I am local';
})();

17. Comment Wisely

Comments should explain “why” something is done, not “what” is being done, as the code itself should be self-explanatory for the latter. Good comments can prevent misunderstandings and save time for anyone who is reading your code in the future, including yourself.

// Bad: The comment is unnecessary as the code is self-explanatory
// Increment the counter by one
counter++;

// Good: The comment provides context that the code cannot
// We increment the counter here because the user has opened a new session
counter++;

// Bad: Comment restates the code
// Check if the user is logged in
if (user.isLoggedIn) {
// ...
}

// Good: Explains why the condition is important
// Check if the user is logged in because only logged-in users have access to premium features
if (user.isLoggedIn) {
// Code to provide access to premium features
}

18. Consistent Coding Style

Adopt a consistent coding style or follow a style guide (like Airbnb’s JavaScript Style Guide) to maintain readability. Consistency in naming, spacing, and syntax will make your code easier to follow and maintain.

// Bad: inconsistent spacing and naming
function calculatevalue(a,b){
const total=a+b
return total;
}

// Good: consistent naming and spacing, following a common style guide
function calculateValue(a, b) {
const total = a + b;
return total;
}

19. Keep Functions Small and Focused

Each function should do one thing and do it well. Small, focused functions are easier to test and debug.

// Bad: doing too much in one function
function handleUserData(user) {
if (user.age < 18) {
console.log('User is a minor');
} else {
console.log('User is an adult');
}
// Additional unrelated tasks...
}

// Good: breaking down into smaller, focused functions
function logUserAgeCategory(age) {
const category = age < 18 ? 'minor' : 'adult';
console.log(`User is a ${category}`);
}

20. Modularize Your Code

Break your code into modules or components. This not only makes it more manageable but also enhances reusability.

// userValidation.js
export function isValidUser(user) {
// Validation logic...
}

// app.js
import { isValidUser } from './userValidation.js';
if (isValidUser(user)) {
// Proceed...
}

21. Avoid Magic Numbers

Replace magic numbers with named constants to make your code more readable and maintainable.

const MAX_USERS = 10;

// Instead of
if (users.length > 10) {
// Do something
}
// Use
if (users.length > MAX_USERS) {
// Do something
}

22. Simplify Conditional Expressions

Break down complex conditions into variables or smaller functions for clarity.

const isEligibleForDiscount = (user) => user.age > 65 || user.memberStatus === 'VIP';

if (isEligibleForDiscount(user)) {
// Apply discount
}

23. Use Comments Sparingly

Code should be self-explanatory as much as possible. Use comments to explain “why” not “what”.

// Bad: unnecessary comment
// adds one to the number
const increment = (number) => number + 1;

// Good: comment explaining why
// We add 1 to include the last day of the range
const inclusiveEnd = (start, end) => end - start + 1;

24. Prefer Composition Over Inheritance

Composition offers more flexibility and reduces the complexity associated with deep inheritance hierarchies.

const canEat = {
eat: function() {
console.log('Eating');
}
};

// Composition
const person = Object.assign({}, canEat);
person.eat(); // Eating

25. Encapsulate Code Blocks

Encapsulate sections of code that deal with specific tasks. This improves readability and reusability.

function processOrder(order) {
const validateOrder = (order) => {
// Validation logic
};

26. Keep up with Latest Features

JavaScript is constantly evolving. Staying up-to-date with the latest features can help you write more efficient and concise code.

// Old way: callbacks
fs.readFile(filePath, function(err, data) {
if (err) throw err;
console.log(data);
});

// New way: async/await
async function readFileAsync(filePath) {
try {
const data = await fs.promises.readFile(filePath);
console.log(data);
} catch (err) {
console.error(err);
}
}

Embracing these tips will not only enhance your JavaScript coding skills but also make your codebase more maintainable and enjoyable to work with. Remember, the goal of writing clean code is not just about following rules but about making your code as clear and understandable as possible for others, including your future self.

--

--

Lokesh Prajapati
Lokesh Prajapati

No responses yet