JavaScriptのバージョンとは?初心者向けにES6以降の違いを解説

JavaScriptのバージョン(ES6、ES2017、ES2018など)について初心者向けに解説。各バージョンの主要な新機能と使い方を分かりやすく紹介します。

Learning Next 運営
23 分で読めます

JavaScriptのバージョンとは?初心者向けにES6以降の違いを解説

「ES6とかES2020って何のこと?」と疑問に思ったことはありませんか?

「JavaScriptにはバージョンがあるって聞いたけど、何が違うの?」 「新しい書き方を覚えたほうがいいのかな?」

そんな疑問を抱いている方は多いと思います。 でも大丈夫です!

この記事では、JavaScriptのバージョンについて初心者向けに詳しく解説します。 ES6以降の主要な新機能と、実際にどう使えばいいかをわかりやすく説明していきます。

きっと「新しいJavaScriptってこんなに便利だったんだ!」と感じられるはずですよ。

JavaScriptのバージョンって何?基本を理解しよう

JavaScriptの正式名称を知ろう

JavaScriptのバージョンは、**ECMAScript(イーマスクリプト)**という標準仕様に基づいています。

簡単に言うと、「JavaScriptに新しい機能を追加したり、使いやすくするためのアップデート」なんです。 スマホアプリのアップデートと同じように、JavaScriptも定期的に新機能が追加されています。

バージョンの名前を覚えよう

JavaScriptのバージョンには、いくつかの呼び方があります。

  • ES6 (ES2015): 2015年にリリースされた大幅アップデート
  • ES2016: 2016年版(ES7とも呼ばれる)
  • ES2017: 2017年版(ES8とも呼ばれる)
  • ES2018: 2018年版(ES9とも呼ばれる)
  • ES2019: 2019年版(ES10とも呼ばれる)
  • ES2020: 2020年版(ES11とも呼ばれる)

ES6が特に有名なのは、それまでのJavaScriptを大きく変える機能がたくさん追加されたからです。

ES6(ES2015)の革新的な新機能

let と const で変数宣言が安全に

従来のvarに代わる、より安全な変数宣言方法が追加されました。

// 従来の書き方(ES5以前)
var name = "田中";
var age = 25;
// 新しい書き方(ES6以降)
let name = "田中"; // 変更可能な変数
const age = 25; // 変更不可能な定数

varの代わりにletconstを使い分けます。

続けて、実際の動作を確認してみましょう。

// constは再代入できない
const pi = 3.14;
// pi = 3.141; // エラーになる
// letは再代入可能
let score = 80;
score = 90; // 問題なし

constは値が変わらない場合、letは値が変わる可能性がある場合に使います。

アロー関数で書き方がスッキリ

関数をより短く書ける記法が追加されました。

// 従来の書き方
function add(a, b) {
return a + b;
}
// アロー関数の書き方
const add = (a, b) => {
return a + b;
};
// さらに短く(一行の場合)
const add = (a, b) => a + b;

アロー関数を使うと、コードがすっきりします。

配列処理での使用例も見てみましょう。

// 使用例
const numbers = [1, 2, 3, 4, 5];
// 従来の書き方
const doubled = numbers.map(function(num) {
return num * 2;
});
// アロー関数を使った書き方
const doubled = numbers.map(num => num * 2);
console.log(doubled); // [2, 4, 6, 8, 10]

アロー関数を使うと、コードがより読みやすくなります。

テンプレートリテラルで文字列作成が簡単に

文字列の中に変数を埋め込みやすくなりました。

const name = "田中";
const age = 25;
// 従来の書き方
const message = "こんにちは、" + name + "さん。年齢は" + age + "歳ですね。";
// テンプレートリテラルを使った書き方
const message = `こんにちは、${name}さん。年齢は${age}歳ですね。`;
console.log(message); // "こんにちは、田中さん。年齢は25歳ですね。"

バッククォート(`)を使うことで、文字列の作成がとても楽になります。

複数行の文字列も簡単に作れます。

// 複数行の文字列も簡単
const html = `
<div>
<h1>${name}のプロフィール</h1>
<p>年齢: ${age}歳</p>
</div>
`;

HTMLテンプレートの作成などでとても便利ですね。

分割代入で値の取り出しが簡単に

配列やオブジェクトから値を取り出すのが簡単になりました。

// 配列の分割代入
const colors = ["赤", "青", "緑"];
// 従来の書き方
const first = colors[0];
const second = colors[1];
// 分割代入を使った書き方
const [first, second, third] = colors;
console.log(first); // "赤"
console.log(second); // "青"
console.log(third); // "緑"

配列の場合は角括弧を使って分割代入を行います。

オブジェクトの分割代入も見てみましょう。

// オブジェクトの分割代入
const person = {
name: "田中",
age: 25,
city: "東京"
};
// 従来の書き方
const name = person.name;
const age = person.age;
// 分割代入を使った書き方
const {name, age, city} = person;
console.log(name); // "田中"
console.log(age); // 25
console.log(city); // "東京"

オブジェクトの場合は波括弧を使って、プロパティ名で値を取り出します。

ES2017(ES8)の便利な新機能

async/awaitで非同期処理がわかりやすく

非同期処理をより分かりやすく書けるようになりました。

// 従来の書き方(Promise)
function getData() {
fetch('/api/data')
.then(response => response.json())
.then(data => {
console.log(data);
})
.catch(error => {
console.error(error);
});
}
// async/awaitを使った書き方
async function getData() {
try {
const response = await fetch('/api/data');
const data = await response.json();
console.log(data);
} catch (error) {
console.error(error);
}
}

async/awaitを使うと、非同期処理が同期処理のように読みやすくなります。

より実用的な例も見てみましょう。

// より実用的な例
async function loadUserProfile(userId) {
try {
// ユーザー情報を取得
const userResponse = await fetch(`/api/users/${userId}`);
const user = await userResponse.json();
// 投稿情報を取得
const postsResponse = await fetch(`/api/users/${userId}/posts`);
const posts = await postsResponse.json();
return {
user: user,
posts: posts
};
} catch (error) {
console.error("データの取得に失敗しました:", error);
return null;
}
}

複数のAPI呼び出しを順番に実行する場合でも、コードが読みやすくなります。

ES2018(ES9)の実用的な新機能

スプレッド演算子(オブジェクト)でコピーと結合が簡単に

オブジェクトのコピーや結合が簡単になりました。

const user = {
name: "田中",
age: 25
};
// オブジェクトのコピー
const userCopy = {...user};
console.log(userCopy); // {name: "田中", age: 25}
// プロパティの追加
const userWithCity = {
...user,
city: "東京"
};
console.log(userWithCity); // {name: "田中", age: 25, city: "東京"}

...(スプレッド演算子)を使って、オブジェクトを展開できます。

複数のオブジェクトの結合も簡単です。

// 複数のオブジェクトを結合
const basicInfo = {name: "田中", age: 25};
const contactInfo = {email: "tanaka@example.com", phone: "090-1234-5678"};
const fullProfile = {
...basicInfo,
...contactInfo
};
console.log(fullProfile);
// {name: "田中", age: 25, email: "tanaka@example.com", phone: "090-1234-5678"}

オブジェクトの操作がとても簡潔に書けるようになります。

ES2020(ES11)の安全な新機能

Optional Chainingで安全なプロパティアクセス

存在しない可能性があるプロパティに安全にアクセスできます。

const user = {
name: "田中",
address: {
city: "東京",
zipCode: "123-4567"
}
};
// 従来の書き方(エラーチェックが必要)
let zipCode;
if (user && user.address && user.address.zipCode) {
zipCode = user.address.zipCode;
}
// Optional Chainingを使った書き方
const zipCode = user?.address?.zipCode;
console.log(zipCode); // "123-4567"

?.演算子を使うことで、プロパティが存在しない場合でもエラーになりません。

存在しないプロパティの場合を見てみましょう。

// 存在しないプロパティの場合
const country = user?.address?.country;
console.log(country); // undefined(エラーにならない)
// 配列でも使用可能
const users = [
{name: "田中", posts: [{title: "記事1"}, {title: "記事2"}]},
{name: "佐藤"} // postsプロパティがない
];
const firstPostTitle = users[0]?.posts?.[0]?.title;
console.log(firstPostTitle); // "記事1"
const secondUserFirstPost = users[1]?.posts?.[0]?.title;
console.log(secondUserFirstPost); // undefined

配列の要素へのアクセスでも安全にチェックできます。

Nullish Coalescingでデフォルト値を適切に設定

nullundefinedの場合のみデフォルト値を使う演算子です。

// 従来の書き方(問題がある場合)
const userName = user.name || "ゲスト";
// 問題: user.nameが空文字("")や0の場合でも"ゲスト"になってしまう
// Nullish Coalescingを使った書き方
const userName = user.name ?? "ゲスト";
// null または undefined の場合のみ"ゲスト"になる

??演算子は、nullまたはundefinedの場合のみデフォルト値を使用します。

具体的な動作例を見てみましょう。

// 例
const examples = [
{value: null, result: null ?? "デフォルト"}, // "デフォルト"
{value: undefined, result: undefined ?? "デフォルト"}, // "デフォルト"
{value: "", result: "" ?? "デフォルト"}, // ""
{value: 0, result: 0 ?? "デフォルト"}, // 0
{value: false, result: false ?? "デフォルト"} // false
];
examples.forEach(example => {
console.log(`${example.value} ?? "デフォルト" = ${example.result}`);
});

空文字や0、falseの場合はそのまま残り、nullやundefinedの場合のみデフォルト値が使われます。

実際の開発での活用方法

モダンなJavaScriptの書き方を習得しよう

現在の開発では、これらの新機能を組み合わせて使うのが一般的です。

// モダンなJavaScriptの例
class UserService {
constructor(apiUrl) {
this.apiUrl = apiUrl;
}
// async/awaitを使った非同期処理
async getUser(userId) {
try {
const response = await fetch(`${this.apiUrl}/users/${userId}`);
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
const user = await response.json();
return this.formatUser(user);
} catch (error) {
console.error("ユーザー情報の取得に失敗:", error);
return null;
}
}
// 分割代入とスプレッド演算子を活用
formatUser(rawUser) {
const {id, name, email, profile = {}} = rawUser;
const {age, city} = profile;
return {
id,
name,
email,
// Optional Chainingを使用
displayName: profile?.displayName ?? name,
location: city ?? "不明",
// テンプレートリテラルを使用
summary: `${name}さん(${age ?? "年齢非公開"})- ${city ?? "居住地不明"}`
};
}
}

ちょっと長いコードですね。でも大丈夫です! 一つずつ見ていきましょう。

まず、クラスの定義部分から。

class UserService {
constructor(apiUrl) {
this.apiUrl = apiUrl;
}

ES6のクラス構文を使ってUserServiceクラスを定義しています。 constructorでAPIのベースURLを受け取って保存します。

次に、async/awaitを使った非同期処理を見てみましょう。

async function getUser(userId) {
try {
const response = await fetch(`${this.apiUrl}/users/${userId}`);
const user = await response.json();
return this.formatUser(user);
} catch (error) {
console.error("ユーザー情報の取得に失敗:", error);
return null;
}
}

async関数内でawaitを使って、非同期処理を同期的に書いています。 テンプレートリテラルでURLを組み立てているのもポイントです。

配列処理での活用例

アロー関数と組み合わせた配列処理も見てみましょう。

// アロー関数を使った配列処理
async getUsersList() {
const users = await this.getUsers();
return users
?.filter(user => user.active)
?.map(user => this.formatUser(user))
?.sort((a, b) => a.name.localeCompare(b.name));
}
// 使用例
const userService = new UserService('/api');
async function displayUserProfile(userId) {
const user = await userService.getUser(userId);
if (user) {
const profileHtml = `
<div class="user-profile">
<h2>${user.displayName}</h2>
<p>Email: ${user.email}</p>
<p>Location: ${user.location}</p>
<p>${user.summary}</p>
</div>
`;
document.getElementById('profile-container').innerHTML = profileHtml;
}
}

Optional Chainingでusersが存在しない場合も安全にチェックしています。 テンプレートリテラルでHTMLを生成しているのも実用的ですね。

学習のコツとおすすめ順序

優先して覚えるべき機能

初心者の方は、以下の順序で学習することをおすすめします。

  1. let/const: 基本的な変数宣言
  2. アロー関数: 関数の短縮記法
  3. テンプレートリテラル: 文字列の作成
  4. 分割代入: 配列・オブジェクトからの値取得
  5. スプレッド演算子: 配列・オブジェクトの操作
  6. async/await: 非同期処理
  7. Optional Chaining: 安全なプロパティアクセス

これらを段階的に覚えていけば、モダンなJavaScriptが書けるようになります。

実践的な学習方法

理論だけでなく、実際にコードを書いて練習することが重要です。

// 練習用のサンプルコード
const students = [
{name: "田中", scores: {math: 85, english: 92}},
{name: "佐藤", scores: {math: 78, english: 88}},
{name: "鈴木", scores: {math: 95}} // englishスコアがない
];
// モダンJavaScriptを使った処理
const calculateAverages = (students) => {
return students.map(student => {
const {name, scores} = student;
const mathScore = scores?.math ?? 0;
const englishScore = scores?.english ?? 0;
const average = (mathScore + englishScore) / 2;
return {
name,
average,
summary: `${name}さんの平均点: ${average}`
};
});
};
const results = calculateAverages(students);
console.log(results);

この例では、分割代入、Optional Chaining、Nullish Coalescing、テンプレートリテラルを組み合わせて使っています。

まとめ

JavaScriptのバージョンアップにより、より読みやすく、書きやすいコードが書けるようになりました。

重要なポイントをおさらい

今回学習した主要な機能を確認しましょう。

  • let/const: より安全な変数宣言
  • アロー関数: 簡潔な関数記法
  • テンプレートリテラル: 文字列作成の改善
  • 分割代入: 値の取り出しが簡単
  • async/await: 非同期処理の改善
  • Optional Chaining: 安全なプロパティアクセス

これらの機能を理解することが重要です。

学習の進め方

以下のステップで段階的に学習していきましょう。

  • 基本機能から始める: let/const、アロー関数
  • 実際にコードを書く: 練習用のサンプルで実装
  • 組み合わせて使う: 複数の機能を連携
  • 実用的な例で確認: 実際の開発に近い形で練習

特にES6以降の機能は、現在の開発現場では標準的に使われているため、初心者の方でも積極的に学習することをおすすめします。

一度に全てを覚える必要はないので、まずは基本的な機能から始めて、徐々にマスターしていきましょう。 ぜひ今日から、モダンなJavaScriptの書き方にチャレンジしてみませんか?

関連記事