Learn simple rules to write clean, easy-to-read JavaScript — using let and const properly, keeping names consistent, and formatting your code neatly.
JavaScriptには公式の「言語仕様(ECMAScript仕様)」はあるものの、「こう書かなければならない」という絶対的な記述ルールは存在しません。しかし、可読性や保守性、パフォーマンス、セキュリティなどの観点から、多くのプロジェクトやコミュニティが “推奨される” コーディングスタイルやベストプラクティスを策定しています。代表的な例としては Airbnb JavaScript Style Guide や Google JavaScript Style Guide などが挙げられます。
JavaScriptでは、大文字・小文字を厳密に使い分ける必要があります。一例を挙げると、変数を宣言(使用)するときに let というキーワードを使いますが、これはすべて半角の小文字でなければなりません。例えば、次の例では、2つの文で意味が変わるため、注意が必要です。
JavaScript
let hello = "hello"; // これ(let)は変数hello が宣言される
Let bye = "goodbye"; // これ(Let)はエラーが発生する
また、変数を宣言する際の変数名も大文字・小文字が区別されるので注意してください。例えば、次の2つの変数は、それぞれ異なるものとみなされます。
JavaScript
let val = "これは小文字の変数名です。";
let VAL = "これは大文字のため、小文字の変数とは異なる変数とみなされます。";
プログラムのコードは、基本的に半角文字を使って記述します。ダブルクォート(")で囲まれた文字列などの一部例外を除き、プログラム内で全角文字を使用することはありません。変数名では全角文字を使用できますが、不要なバグを招くため、文字列以外は半角英数字で記述するようにしたほうが良いようです。また、コードにスペースを挿入するときも、全角スペースではなく、半角スペース、またはタブを使うようにしてください。
JavaScript
let greeting = "半角英数字でコードは記述しましょう。";
let greeting = "letが全角のためエラー"; // これ(let)はエラーが発生する
let / const を優先使用する
JavaScript
// 良い例
let count = 0;
const API_URL = 'https://example.com/api';
// 悪い例(古い書き方)
var age = 20;
スコープを意識する
JavaScriptは自動セミコロン挿入(ASI: Automatic Semicolon Insertion)という仕組みをもっており、行末のセミコロンがなくても動作します。しかし、ASIに依存すると想定外の動作を引き起こす場合があるため、多くのスタイルガイドでは「行末に常にセミコロンを書く」方針が推奨されています。
JavaScript
// 推奨(セミコロンをつける)
let name = 'Taro';
console.log(name);
// 非推奨(動作はするが想定外の挙動を起こすケースあり)
let name = 'Taro'
console.log(name)
インデント
JavaScript
// スペース2つ
function greet(name) {
console.log(`Hello, ${name}`);
}
// スペース4つ
function greet(name) {
console.log(`Hello, ${name}`);
}
スペースの使い方
JavaScript
// 一般的な例
if (isValid) {
console.log('Valid!');
}
変数・関数名
JavaScript
// 良い例
let userCount = 10;
function getUserName(userId) {
// ...
}
// 悪い例
let x = 10;
function aaa(bbb) {
// ...
}
クラス名
JavaScript
class UserManager {
// ...
}
定数
JavaScript
const MAX_VALUE = 100;
通常の関数宣言
JavaScript
function greet(name) {
console.log(`Hello, ${name}`);
}
関数式
JavaScript
const greet = function(name) {
console.log(`Hello, ${name}`);
};
アロー関数式
this の扱いが通常の関数と異なり、クラスのメソッドとして使う場合などには注意が必要です。JavaScript
const greet = (name) => {
console.log(`Hello, ${name}`);
};
if / else / for / while など
波括弧 {} は省略せずに書くことが推奨されます。ワンライナーのブロックでも{}をつけることで可読性と安全性が向上します。
JavaScript
// 推奨
if (isValid) {
doSomething();
} else {
doSomethingElse();
}
// 非推奨
if (isValid) doSomething();
else doSomethingElse();
JavaScript
// シングルクォート
const myString = 'Hello';
// ダブルクォート
const myString = "Hello";
// テンプレートリテラル
const name = 'Taro';
const greeting = `Hello, ${name}!`;
JavaScript
// 推奨
if (value === 10) {
// ...
}
// 非推奨
if (value == 10) {
// ...
}
JavaScriptのスタイルや構文エラーを機械的にチェック&修正するためのツールとして、ESLint と Prettier が広く利用されています。
これらを使うと、チーム全体でフォーマットやルールを統一できるため、可読性が大幅に向上します。
JavaScript
const user = { id: 1, name: 'Taro', age: 20 };
const { name, age } = user;
console.log(name, age); // 'Taro', 20
JavaScript
const arr1 = [1, 2, 3];
const arr2 = [4, 5];
const merged = [...arr1, ...arr2]; // [1, 2, 3, 4, 5]
JavaScript
// async/await の例
async function fetchData(url) {
try {
const response = await fetch(url);
const data = await response.json();
return data;
} catch (error) {
console.error(error);
throw error;
}
}
JavaScript
let name = "Taro"; // ← let が全角
JavaScript
console.log(userName); // まだ宣言していない
let username = "taro";
console.log(userName); // 大文字小文字が違う
let / const で宣言してから使う。綴りと大文字小文字を統一。[ や ( で始まるとASlが失敗。JavaScript
const name = 'Taro'
[1, 2, 3].forEach(n => console.log(n)) // ← 構文エラー
JavaScript
const name = 'Taro';
[1, 2, 3].forEach(n => console.log(n));
( [ の行の前は必ずセミコロン。JavaScript
function sum(a, b) { return a + b; }
let sum = 10; // 関数名を変数で上書き
sum(1, 2); // もう関数ではない → エラー
console.logで確認。typeof sum の結果が "function" かを確認。undefined のままプロパティにアクセス。JavaScript
const user = undefined;
console.log(user.name); // undefined.name → エラー
JavaScript
if (user) {
console.log(user.name);
}
console.log(user?.name);
fetch後すぐに読む、など)。} や )、]、クォートの閉じ忘れ。JavaScript
function greet(name) {
console.log("Hello, " + name);
// } が足りない
const で宣言した変数に再代入している。JavaScript
const count = 0;
count = 1; // 再代入 → エラー
let を使う。const は「上書きしない」用。let / const を二重宣言。JavaScript
let total = 0;
let total = 1; // 同じスコープで再宣言 → エラー
let / const のTemporal Dead Zone(TDZ) で宣言前に参照。JavaScript
console.log(score); // ここではまだ使えない
let score = 10;
var と違い、let/const は巻き上げ後も未初期化で使えない。“ ” ‘ ’ )が混入。JavaScript
console.log(“Hello”); // ← 見た目は似てるが別文字
" または ' )。“ ” ‘ ’ → " or ' に。JavaScript
JSON.parse('{\'name\':\'Taro\'}'); // ← JSONではNG
JavaScript
JSON.parse("{\"name\":\"Taro\"}");
this を期待している/呼び出し方で this が変わる。JavaScript
const obj = {
name: "Taro",
getName: () => {
return this.name; // アローでは this が外側を参照 → undefined
}
};
console.log(obj.getName());
this を使うメソッドは通常の関数で書く。JavaScript
const obj = {
name: "Taro",
getName() {
return this.name;
}
};
this を束縛しない (外側の this を参照)。document.querySelector が要素を見つけられていない/実行時点で未生成。JavaScript
const el = document.querySelector('#app');
el.textContent = 'Hello'; // #app が無い → null.textContent
DOMContentLoaded 後に実行。JavaScript
document.addEventListener('DOMContentLoaded', () => {
const el = document.querySelector('#app');
if (el) {
el.textContent = 'Hello';
}
});
<script> を </body> 直前に置く方法も有効。await を async 関数の外で使っている。JavaScript
const data = await fetch('/api'); // async じゃない → エラー
async function の中で await を使う。JavaScript
async function main() {
const res = await fetch('/api');
const data = await res.json();
console.log(data);
}
main();
type="module")ならトップレベル await が使える環境もあるが、まずは async function に入れるのが安全。async/await で try...catch を付けていない/.catch() を忘れた。JavaScript
async function load() {
const res = await fetch('/nope'); // 失敗しても握りつぶされず上がる
return res.json();
}
load(); // 例外が未処理で「Unhandled」になる
JavaScript
async function load() {
try {
const res = await fetch('/nope');
if (!res.ok) throw new Error(res.statusText);
return await res.json();
} catch (e) {
console.error(e);
return null;
}
}
await の行にはエラーが来る前提で囲う癖を。null や普通のオブジェクトを反復可能だと思って使う。JavaScript
const obj = { a: 1, b: 2 };
for (const v of obj) { // オブジェクトは iterable ではない
console.log(v);
}
Object.entries(obj) を使う。JavaScript
for (const [k, v] of Object.entries(obj)) {
console.log(k, v);
}
for...of は配列・文字列・Map/Set などに。Access-Control-Allow-Origin が無い。JavaScript
const res = await fetch('https://api.example.com/data'); // CORS制限に当たる
console.log と typeof で実際の中身を確認する。