JavaScriptのバージョンとは?初心者向けにES6以降の違いを解説
JavaScriptのバージョン(ES6、ES2017、ES2018など)について初心者向けに解説。各バージョンの主要な新機能と使い方を分かりやすく紹介します。
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
の代わりにlet
とconst
を使い分けます。
続けて、実際の動作を確認してみましょう。
// 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); // 25console.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でデフォルト値を適切に設定
null
やundefined
の場合のみデフォルト値を使う演算子です。
// 従来の書き方(問題がある場合)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を生成しているのも実用的ですね。
学習のコツとおすすめ順序
優先して覚えるべき機能
初心者の方は、以下の順序で学習することをおすすめします。
- let/const: 基本的な変数宣言
- アロー関数: 関数の短縮記法
- テンプレートリテラル: 文字列の作成
- 分割代入: 配列・オブジェクトからの値取得
- スプレッド演算子: 配列・オブジェクトの操作
- async/await: 非同期処理
- 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の書き方にチャレンジしてみませんか?