JavaScript is an easy to learn programming language. It’s easy to write programs that run and does something. However, it’s hard to account for all the uses cases and write robust JavaScript code.
In this article, we’ll look at the best ways to work with modules, arrays, and objects.
If we have a Single Export, then we Should Use Default Export
If we have only one export from our module, then we should use a default export instead of named export.
It’s more readable and maintainable.
For instance, instead of writing:
export const foo = () => {};
We write:
const foo = () => {}
export default foo;
Put all imports Above Non-Import Statements
Putting all imports
above non-import statements make them easier to read.
For example, we should write:
import { foo } from "./foo";
foo();
Multiline Imports Should be Indented Like Multiline Arrays and Object Literals
If we have lots of imports, we shouldn’t write:
import {foo, bar, baz, qux, longName} from 'foo';
Instead, we should write:
import {
foo,
bar,
baz,
qux,
longName
} from "foo";
Don’t Use Webpack Loader Syntax in import Statements
If we use Webpack specific syntax for import things, then we’ll have issues when we try to switch to another module loader.
Instead, we should use standard syntax to avoid issues with Webpack specific syntax.
Instead of writing:
import barSass from 'css!sass!bar.scss';
We write:
import barCss from 'bar.css';
Don’t Add JavaScript File Extension to Imports
We don’t need to add the JavaScript file extension to imports.
It also creates problems when we change the extension,
Therefore, we shouldn’t include it.
For instance, we can write:
import { bar } from './foo.js';
Instead, we write:
import { bar } from './foo';
Iterators and Generators
Iterators and generators are JavaScript features new to ES6 that lets us return items sequentially.
Don’t Use Iterators to Manipulate Arrays
Instead of using loops, we should use array methods to manipulate arrays.
For instance, instead of writing:
let arr = [1, 2, 3];
let result = [];
for (const a of arr) {
result.push(a ** a);
}
We write:
const arr = [1, 2, 3];
const result = arr.map(a => a ** a);
It’s shorter and no loops.
Another reason is that we don’t want to mutate array entries.
For instance, if we write:
let arr = [1, 2, 3];
for (let i = 0; i < arr.length; i++) {
arr[i] = arr[i] ** arr[i];
}
Then we mutate each entry of arr
as we loop through it.
If we can avoid mutation, then we should do that.
The following are some array methods that we can use to manipulate arrays:
map
— map entries from one to another and return an array with the mapped entriesevery
— checks if each array entry meets some conditionfind
— returns the first entry of something that meets some conditionfindIndex
— returns the index of the first entry of something that meets some conditionreduce
— combine array entries into a single value and return itsome
— check if some array entries meet a given condition
We can also get object keys and values with these methods:
Object.keys
— gets own string keys of objectsObject.values
— gets own values of objectsObject.entries
— gets own key-value pairs of objects
Don’t use Generators
If we’re targeting ES5 in our builds, then we shouldn’t use generators since they don’t transpile well.
Space Generators Definitions Properly
We should space the function definition as follows:
function* foo() {
// ...
}
Object Properties
There’re a few things to be aware of if we access object properties.
Use Dot Notation When Accessing Properties
Dot notation should be used when we access object properties that are valid JavaScript identifers.
For instance, instead of writing:
const bar = foo['bar'];
We write:
const bar = foo.bar;
Conclusion
We should have a default export if we only export one member of a module.
Instead of using loops, we should use array methods to manipulate arrays.
If we need to manipulate object keys and values, we can get them with some Object
static methods.
Also, use the dot notation as much as possible for accessing object properties.