ES6主要機能と新機能の概要

モジュール化

ES6ではモジュール化にexportimportのキーワードを使用します。

// utils.js
export function fetchData(text) {
  // 処理内容
}

// main.js
import { fetchData } from './utils';

fetchData(params); // 処理実行

ブラウザでES6モジュールを利用するには、webpackやrollupなどのバンドラが必要です。バンドル結果を比較すると、webpackは独自のヘルパー関数が多く含まれる一方で、rollupはAMD/UMD形式の関数以外はすべて自身のロジックで構成されています。

クラス構文

ES6のclass構文は、従来のコンストラクタ関数のシンタックスシュガーです。継承などもより明確に記述できます。

// classes.js
// class構文
export class Creature {
    constructor(name) {
        this.name = name;
    }
    consume() {
        console.log(`${this.name} is eating`);
    }
}

export class Cat extends Creature {
    constructor(name) {
        super(name);
        this.name = name;
    }
    meow() {
        console.log(`${this.name} is meowing`);
    }
}

// 通常の関数構文
export function Animal(name) {
    this.name = name;
    this.consume = function() {
        console.log(`function: ${this.name} is eating`);
    }
}
export function Cat2(name) {
    this.meow = function() {
        console.log(`function: ${this.name} is meowing`);
    }
}
Cat2.prototype = new Animal('cat2');
// main.js
import { Cat, Cat2 } from './classes'

const cat = new Cat('タマ')
cat.meow()
cat.consume()

const cat2 = new Cat2('ミケ')
cat2.meow()
cat2.consume()

Promiseオブジェクト

Promiseはコールバック地獄を解消するための仕組みで、3つの状態を持ちます:pending, fulfilled, rejected

const fetchData = new Promise((resolve, reject) => {
	// 処理実行
	if (success) {
		resolve(data);
	} else {
		reject(error);
	}
});

// 使用例
fetchData
	.then(result => {
		// 成功時の処理
	})
	.catch(err => {
		// 失敗時の処理
	});

let/constの導入

letは再代入可能、constは再代入不可です。

let x = 5;
const y = 10;

x = 15; // OK
y = 20; // エラー

テンプレートリテラル

複数行文字列や変数埋め込みが可能になります。

const user = '佐藤';
const years = 30;
const output = `
<section>
	<span>名前: ${user}</span>
	<span>年齢: ${years}</span>
</section>
`;

分割代入

オブジェクトや配列の値を簡単に変数に代入できます。

const data = {
	key1: 'valueA',
	key2: 'valueB'
};
const { key1: firstValue } = data;

ブロックスコープ

varは関数スコープ、letconstはブロックスコープを持ちます。

// ES5
var obj = { x: 10, y: 20 };
for (var prop in obj) {
	console.log(prop);
}
console.log(prop); // propはグローバルスコープに残る

// ES6
const obj = { x: 10, y: 20 };
for (let prop in obj) {
	console.log(prop);
}
console.log(prop); // undefined

関数のデフォルト引数

function fetchData(param1, param2 = 5) {
	console.log(param1, param2);
}

アロー関数

アロー関数はthisのスコープが周囲のコンテキストを継承します。

function process() {
	const nums = [10, 20, 30];
	nums.map(function(item) {
		console.log('function:', this);
		return item * 2;
	});
	nums.map((item, idx) => {
		console.log('arrow:', this);
		return item * 2;
	});
}

process.call({ val: 200});

タグ: ECMAScript6 javascript モジュール化 class Promises

5月19日 14:00 投稿