大昔のjavascriptとは違う、現代的なJSであるES2015(ES6)を理解する
参考URL
https://qiita.com/soarflat/items/b251caf9cb59b72beb9b
変数
1 2 3 |
var a; // グローバル変数になるからダメ!再定義も出来てしまう let a; // ローカル変数(ブロック内のみ有効) const a; // 定数 |
テンプレート文字列(テンプレートリテラル)は、ヒアドキュメントみたいな感じ
バッククオートで囲んだ文字列を使って、変数を挿入したり、改行を入れたり出来る仕組み
イメージ的には <?php ?> っぽい。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
// 文字列内で、変数が使える。${変数名} const name = 'Alice'; const greeting = `Hello, ${name}!`; console.log(greeting); // "Hello, Alice!" // 計算など式も使える const a = 5; const b = 10; const result = `The sum of ${a} and ${b} is ${a + b}.`; console.log(result); // "The sum of 5 and 10 is 15." // 改行もOK const multiLine = `This is a string that spans across multiple lines.`; console.log(multiLine); // 関数すら埋め込める!! function getGreeting(name) { return `Hello, ${name}!`; } const name = 'Bob'; const greeting = `${getGreeting(name)} How are you?`; console.log(greeting); // "Hello, Bob! How are you?" |
アロー関数。書き方が違うだけで、基本的に同じ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
// 基本の関数 function fn(a,b){ return a + b; } // アロー関数 const fn = (a, b) => { return a + b; }; // 単一式の場合は、カーリーブラケットやreturnを省略できる const fn = (a, b) => a + b; // 引数の初期値も設定できる const fn = (a=1, b=2) => a + b; console.log(fn()) |
モジュール(関数を別のファイルでも使えるようにする仕組み)
exportで外部で使います宣言
importで、モジュールファイルの、この関数を使います宣言
1 2 3 4 5 6 7 8 9 |
// モジュールA export const name = 'John'; export function sayHello() { console.log('Hello'); } // モジュールB import { name, sayHello } from './moduleA'; sayHello(); // Hello |
たぶん、これがJSで一番むずかしい。
非同期処理(時間がかかる処理が終わるのを待たない)
https://qiita.com/cheez921/items/41b744e4e002b966391a
昔ながらのJS非同期。setTimeoutが非同期処理な事を利用する
1 2 3 4 5 6 7 8 9 10 11 12 |
console.log("1番目"); // 1秒後に実行する処理 setTimeout(() => { console.log("2番目(1秒後に実行)"); }, 1000); console.log("3番目"); // 1番目 // 3番目 // 2番目(1秒後に実行) |
ES6のPromiseのJS非同期
Promise()内で、resolve()実行すると、then()が実行される
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
console.log("1番目"); // お約束を取り付けたい処理にPromise new Promise((resolve) => { //1秒後に実行する処理 setTimeout(() => { console.log("2番目(1秒後に実行)"); //無事処理が終わったことを伝える resolve(); }, 1000); }).then(() => { // 処理が無事終わったことを受けとって実行される処理 console.log("3番目"); }); // 1番目 // 2番目(1秒後に実行) // 3番目 |
ES6のasync/awaitのJS非同期
1, 関数定義の前にasyncで非同期関数であることを宣言
2, 実行する関数名の前にawaitで、非同期実行を宣言
3, 非同期関数内でPromise()実行
4, その中で、resolveを実行したら非同期処理が完了
5, 呼び出し元のcatch以降が実行される
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
// データを取得(取得に時間がかかる) async function fetchData() { // fetch()はpromiseを返す非同期処理だけど、awaitを使うことで完了するまで、次の行の処理を実行しないで待つ(await) const response = await fetch('https://api.example.com/data'); // response.json()もpromiseを返す非同期処理なので、awaitを使うことで完了するまで、次の行の処理を実行しないで待つ(await) const data = await response.json(); return data; } async function run() { try { // awaitを使うことでfetchData()が完了するまで次の行の処理を待つ const data = await fetchData(); console.log('取得したデータ:', data); } catch (error) { console.error('エラーが発生しました:', error.message); } } run(); |
クラスと継承が利用可能
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
class Person { constructor(name, age) { this.name = name; this.age = age; } greet() { console.log(`Hello, my name is ${this.name}`); } } class Employee extends Person { constructor(name, age, jobTitle) { super(name, age); // 親クラスのコンストラクタを呼び出し this.jobTitle = jobTitle; } work() { console.log(`${this.name} is working as a ${this.jobTitle}`); } } const person2 = new Person('Alice', 30); person2.greet(); // "Hello, my name is Alice" const employee2 = new Employee('Bob', 25, 'Software Engineer'); employee2.greet(); // "Hello, my name is Bob" employee2.work(); // "Bob is working as a Software Engineer" |
pythonにもある分割代入。連想配列みたい。
1 2 3 4 5 6 7 8 9 10 |
変数名や定数名を、{要素名}で値を取得できる const params = { id: 123, name: 'John Doe', age: 30 }; const { id } = params; console.log(id); // 123 |
スプレッド構文(配列名の前にピリオド3つをつけると、配列を展開する)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
// 配列の展開で、配列同士の結合が簡単! const arr1 = [1, 2, 3]; const arr2 = [...arr1, 4, 5, 6]; // [1,2,3,4,5,6] const arr3 = [arr1, arr2]; // これだと2次元配列になる。[[1,2,3],[4,5,6]] // スプレッド構文による配列のコピー(別メモリに同じ値を確保) const arr1 = [1, 2, 3]; const arr2 = [...arr1]; console.log(arr2); // [1, 2, 3] // 参照コピー(同じメモリを指しているので、arr1かarr3のどちらかで値を操作すると、もう片方も変わる) const arr3 = arr1; console.log(arr3); // [1, 2, 3] |
for…of インデックス不要な場合のfor文(全要素アクセス)
1 2 3 4 5 6 |
const array = [10, 20, 30]; for (const value of array) { console.log(value); } // 出力: 10, 20, 30, 40, 50 |