🔧

JavaScriptのモダンなベストプラクティス

2025/03/05に公開

JavaScriptは、ウェブ開発において最も広く使用されているプログラミング言語の一つです。初心者の皆さんが効率的に学び、実践的なスキルを身につけるために、この記事ではモダンなJavaScriptのベストプラクティスを紹介します。これらのプラクティスを学ぶことで、より読みやすく、保守しやすいコードを書くことができるようになります。

1. 変数の宣言

JavaScriptでは変数を宣言する際に、varletconstの3つのキーワードがあります。モダンなJavaScriptでは、letconst を使用するのが一般的です。

  • let: 再代入が可能な変数を宣言します。
  • const: 再代入が不可能な変数を宣言します。値を変更しない場合に使用します。
let mutableValue = 10;
mutableValue = 20; // 再代入が可能

const immutableValue = 30;
// immutableValue = 40; // エラー: 再代入不可

なぜvarを避けるのか?

varはスコープ(変数の有効範囲)が関数スコープであるため、予期しない動作を引き起こすことがあります。letconstはブロックスコープを持っており、より直感的に動作します。

function exampleVar() {
  if (true) {
    var x = 5;
  }
  console.log(x); // 5
}

function exampleLet() {
  if (true) {
    let y = 5;
  }
  // console.log(y); // エラー: yは定義されていません
}

2. テンプレートリテラル

文字列を連結する際、従来の方法では+演算子を使用していましたが、テンプレートリテラルを使用することで、より簡潔に記述できます。テンプレートリテラルはバッククォート(`)で囲み、変数や式を${}で埋め込むことができます。

const name = "Zenn";
const message = `Hello, ${name}! Welcome to the JavaScript world.`;
console.log(message); // "Hello, Zenn! Welcome to the JavaScript world."

3. アロー関数

アロー関数は、関数を宣言する新しい方法です。関数式を簡潔に書くことができ、thisの扱いが従来の関数と異なるため、コールバック関数などで便利です。

// 従来の関数
function add(a, b) {
  return a + b;
}

// アロー関数
const addArrow = (a, b) => a + b;

console.log(add(2, 3)); // 5
console.log(addArrow(2, 3)); // 5

アロー関数のthisの扱い

アロー関数は自身のthisを持たず、外側のスコープのthisを継承します。これにより、コールバック関数内でのthisの扱いがより直感的になります。

function Counter() {
  this.count = 0;
  setInterval(() => {
    this.count++;
    console.log(this.count);
  }, 1000);
}

const myCounter = new Counter();
// 1, 2, 3, ... と1秒ごとにカウントアップ

4. 分割代入

分割代入を使用すると、配列やオブジェクトから複数の値を簡単に取り出すことができます。

配列の分割代入

const numbers = [1, 2, 3];
const [one, two, three] = numbers;

console.log(one); // 1
console.log(two); // 2
console.log(three); // 3

オブジェクトの分割代入

const person = {
  name: "Alice",
  age: 25
};

const { name, age } = person;

console.log(name); // "Alice"
console.log(age); // 25

5. スプレッド構文とレストパラメータ

スプレッド構文(...)を使うことで、配列やオブジェクトを展開したり、関数の引数をまとめたりすることができます。

配列のスプレッド構文

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

console.log(combined); // [1, 2, 3, 4, 5, 6]

オブジェクトのスプレッド構文

const obj1 = { a: 1, b: 2 };
const obj2 = { c: 3, d: 4 };
const combinedObj = { ...obj1, ...obj2 };

console.log(combinedObj); // { a: 1, b: 2, c: 3, d: 4 }

レストパラメータ

レストパラメータを使うと、関数の引数を配列としてまとめることができます。

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

console.log(sum(1, 2, 3)); // 6
console.log(sum(4, 5, 6, 7)); // 22

6. モジュール

JavaScriptでは、コードをモジュールとして分割することで、再利用性を高め、コードを整理することができます。ES6からは、importexportを使用してモジュールを扱うことができます。

モジュールのエクスポート

// math.js
export function add(a, b) {
  return a + b;
}

export const PI = 3.14159;

モジュールのインポート

// main.js
import { add, PI } from './math.js';

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

7. プロミスと非同期処理

JavaScriptでは、非同期処理を扱うためにプロミス(Promise)を使用します。プロミスは、非同期処理の結果を表すオブジェクトで、成功時の処理(then)と失敗時の処理(catch)を指定できます。

プロミスの基本

const promise = new Promise((resolve, reject) => {
  setTimeout(() => {
    resolve('Success!');
  }, 1000);
});

promise
  .then(result => {
    console.log(result); // "Success!"
  })
  .catch(error => {
    console.error(error);
  });

async/await

async/awaitを使用すると、プロミスをより直感的に扱うことができます。async関数内でawaitを使用することで、プロミスの結果を待ってから次の処理を実行できます。

async function fetchData() {
  try {
    const response = await fetch('https://api.example.com/data');
    const data = await response.json();
    console.log(data);
  } catch (error) {
    console.error('Error:', error);
  }
}

fetchData();

8. クラス

ES6から導入されたクラス構文を使用することで、オブジェクト指向プログラミングをより簡潔に実装できます。

クラスの基本

class Animal {
  constructor(name) {
    this.name = name;
  }

  speak() {
    console.log(`${this.name} makes a noise.`);
  }
}

class Dog extends Animal {
  speak() {
    console.log(`${this.name} barks.`);
  }
}

const dog = new Dog('Rex');
dog.speak(); // "Rex barks."

9. Nullish Coalescing Operator

Nullish Coalescing Operator??)は、nullまたはundefinedの場合にデフォルト値を設定するのに便利です。||演算子と似ていますが、0や空文字列''をデフォルト値として扱いたい場合に役立ちます。

const foo = null ?? 'default string';
console.log(foo); // "default string"

const bar = 0 ?? 42;
console.log(bar); // 0

10. Optional Chaining

Optional Chaining?.)を使用すると、オブジェクトのプロパティを安全にアクセスできます。プロパティが存在しない場合にエラーを発生させず、undefinedを返します。

const user = {
  profile: {
    name: 'John'
  }
};

console.log(user.profile?.name); // "John"
console.log(user.contact?.email); // undefined

まとめ

JavaScriptのモダンなベストプラクティスを学ぶことで、より効率的で保守性の高いコードを書くことができます。ここで紹介したプラクティスを実践し、日々のプログラミングに活かしてください。さらに詳しい情報や最新の技術トピックについては、MDN Web Docsなどの信頼できるリソースを参考にしてください。

Discussion