BabelJS-ES6機能をES5にトランスパイル
この章では、ES6に追加された機能について説明します。また、BabelJSを使用して機能をES5にコンパイルする方法についても学習します。
以下は、この章で説明するさまざまなES6機能です。
- Let + Const
 - 矢印関数
 - Classes
 - Promises
 - Generators
 - Destructuring
 - Iterators
 - テンプレートLiteralst
 - 拡張オブジェクト
 - デフォルト、レスト、スプレッドのプロパティ
 
Let + Const
JavaScriptでブロックスコープのローカル変数を宣言しましょう。letの使用法を理解するために、次の例を検討してください。
例
let a = 1;
if (a == 1) {
   let a = 2;
   console.log(a);
}
console.log(a); 
    出力
2
1 
    最初のコンソールが2を出力する理由は、 a を使用して再度宣言されます let でのみ利用可能になります ifブロック。letを使用して宣言された変数は、宣言されたブロック内でのみ使用できます。letを使用して変数を2回宣言しましたが、aの値は上書きされません。
これは、varキーワードとletキーワードの違いです。varを使用して変数を宣言すると、変数は関数のスコープ内で使用可能になります。宣言されている場合は、グローバル変数のように機能します。
変数がletで宣言されている場合、その変数はブロックスコープ内で使用できます。ifステートメント内で宣言されている場合、ifブロック内でのみ使用できます。同じことがスイッチ、forループなどにも当てはまります。
これで、babeljsを使用したES5でのコード変換が表示されます。
次のコマンドを実行してコードを変換しましょう-
npx babel let.js --out-file let_es5.js 
    letキーワードのes6からes5への出力は次のとおりです。
ES6を使用しましょう
let a = 1;
if (a == 1) {
   let a = 2;
   console.log(a);
}
console.log(a); 
    バベルを使用してES5にトランスパイル
"use strict";
var a = 1;
if (a == 1) {
   var _a = 2;
   console.log(_a);
}
console.log(a); 
    ES5コードが表示されている場合は、letキーワードが varキーワード。また、ifブロック内の変数の名前が次のように変更されます_a で宣言したときと同じ効果があります let キーワード。
Const
このセクションでは、ES6およびES5でのconstキーワードの動作について学習します。Constキーワードもスコープ内で使用できます。外にいると、エラーが発生します。const宣言変数の値は、一度割り当てられると変更できません。constキーワードの使用方法を理解するために、次の例を考えてみましょう。
例
let a =1;
if (a == 1) {
   const age = 10;
}
console.log(age); 
    出力
Uncaught ReferenceError: age is not defined at 
      
       :5:13 
        
    上記の出力は、定数がifブロック内で定義され、ifブロック内で使用可能であるため、エラーをスローします。
BabelJSを使用したES5への変換について理解します。
ES6
let a =1;
if (a == 1) {
   const age = 10;
}
console.log(age); 
    コマンド
npx babel const.js --out-file const_es5.js 
    BabelJSを使用してES6にトランスパイル
"use strict";
var a = 1;
if (a == 1) {
   var _age = 10;
}
console.log(age); 
    ES5の場合、上記のようにconstキーワードがvarキーワードに置き換えられます。
矢印関数
Arrow関数は、変数式と比較して構文が短くなっています。ファットアロー関数またはラムダ関数とも呼ばれます。関数には、独自のこのプロパティはありません。この関数では、キーワード関数は省略されています。
例
var add = (x,y) => {
   return x+y;
}
var k = add(3,6);
console.log(k); 
    出力
9 
    BabelJSを使用して、上記のコードをES5にトランスパイルします。
ES6-矢印機能
var add = (x,y) => {
   return x+y;
}
var k = add(3,6);
console.log(k); 
    コマンド
npx babel arrowfunction.js --out-file arrowfunction_es5.js 
    BabelJS-ES5
Babelを使用すると、矢印関数が次のように変数式関数に変換されます。
"use strict";
var add = function add(x, y) {
   return x + y;
};
var k = add(3, 6);
console.log(k); 
    クラス
ES6には、新しいクラス機能が付属しています。クラスは、ES5で使用可能なプロトタイプベースの継承に似ています。classキーワードは、クラスを定義するために使用されます。クラスは特殊関数のようなものであり、関数式のような類似点があります。クラス内で呼び出されるコンストラクターがあります。
例
class Person {
   constructor(fname, lname, age, address) {
      this.fname = fname;
      this.lname = lname;
      this.age = age;
      this.address = address;
   }
   get fullname() {
      return this.fname +"-"+this.lname;
   }
}
var a = new Person("Siya", "Kapoor", "15", "Mumbai");
var persondet = a.fullname; 
    出力
Siya-Kapoor 
    ES6-クラス
class Person {
   constructor(fname, lname, age, address) {
      this.fname = fname;
      this.lname = lname;
      this.age = age;
      this.address = address;
   }
   get fullname() {
      return this.fname +"-"+this.lname;
   }
}
var a = new Person("Siya", "Kapoor", "15", "Mumbai");
var persondet = a.fullname; 
    コマンド
npx babel class.js --out-file class_es5.js 
    BabelJS-ES5
ES5と同じクラスで機能を機能させるために、babeljsを使用して追加のコードが追加されています。BabelJsは、機能がES6で機能するのと同じように機能することを確認します。
"use strict";
var _createClass = function () {
   function defineProperties(target, props) {
      for (var i = 0; i < props.length; i++) {
         var descriptor = props[i];
         descriptor.enumerable = descriptor.enumerable || false;
         descriptor.configurable = true;
         if ("value" in descriptor) descriptor.writable = true;
         Object.defineProperty(target, descriptor.key, descriptor);
      }
   }
   return function (Constructor, protoProps, staticProps) {
      if (protoProps) defineProperties(Constructor.prototype, protoProps);
      if (staticProps) defineProperties(Constructor, staticProps);
      return Constructor;
   };
}();
function _classCallCheck(instance, Constructor) {
   if (!(instance instanceof Constructor)) {
      throw new TypeError("Cannot call a class as a function");
   }
}
var Person = function () {
   function Person(fname, lname, age, address) {
      _classCallCheck(this, Person);
      this.fname = fname;
      this.lname = lname;
      this.age = age;
      this.address = address;
   }
   _createClass(Person, [{
      key: "fullname",
      get: function get() {
         return this.fname + "-" + this.lname;
      }
   }]);
   return Person;
}();
var a = new Person("Siya", "Kapoor", "15", "Mumbai");
var persondet = a.fullname; 
    約束
JavaScriptのpromiseは、コード内の非同期リクエストを管理するために使用されます。
依存関係のある非同期リクエストからの複数のコールバックを管理するため、作業が楽になり、コードがクリーンに保たれます。Promiseは、コールバック関数を操作するためのより良い方法を提供します。PromiseはES6の一部です。デフォルトでは、Promiseを作成すると、Promiseの状態は保留中です。
約束には3つの状態があります-
- 保留中(初期状態)
 - 解決済み(正常に完了)
 - rejected(failed)
 
new Promise()約束を構築するために使用されます。Promiseコンストラクターには、コールバック関数である1つの引数があります。コールバック関数には、resolveとrejectの2つの引数があります。
これらは両方とも内部機能です。作成した非同期コード、つまりAjax呼び出し、画像の読み込み、タイミング関数は、コールバック関数に入ります。
コールバック関数で実行されたタスクが成功した場合、resolve関数が呼び出されます。それ以外の場合は、エラーの詳細とともに拒否関数が呼び出されます。
次のコード行は、promise構造の呼び出しを示しています-
var _promise = new Promise (function(resolve, reject) {
   var success = true;
   if (success) {
      resolve("success");
   } else {
      reject("failure");
   }
});
_promise.then(function(value) {
   //once function resolve gets called it comes over here with the value passed in resolve
   console.log(value); //success
}).catch(function(value) {
   //once function reject gets called it comes over here with the value passed in reject
   console.log(value); // failure.
}); 
    ES6Promiseの例
let timingpromise = new Promise((resolve, reject) => {
   setTimeout(function() {
      resolve("Promise is resolved!");
   }, 1000);
});
timingpromise.then((msg) => {
   console.log(msg);
}); 
    出力
Promise is resolved! 
    ES6-約束
let timingpromise = new Promise((resolve, reject) => {
   setTimeout(function() {
      resolve("Promise is resolved!");
   }, 1000);
});
timingpromise.then((msg) => {
   console.log(msg);
}); 
    コマンド
npx babel promise.js --out-file promise_es5.js 
    BabelJS-ES5
"use strict";
var timingpromise = new Promise(function (resolve, reject) {
   setTimeout(function () {
      resolve("Promise is resolved!");
   }, 1000);
});
timingpromise.then(function (msg) {
   console.log(msg);
}); 
    promiseの場合、トランスパイルされたときにコードは変更されません。古いブラウザで動作させるには、babel-polyfillを使用する必要があります。babel-polyfillの詳細については、babel-poyfillの章で説明しています。
発電機
ジェネレーター機能は通常通り function。この関数には、関数内で使用される関数とyieldキーワードに*が付いた特別な構文function *があります。これは、必要に応じて機能を一時停止または開始することを目的としています。実行開始後は、その間に通常の機能を停止することはできません。関数全体を実行するか、returnステートメントが検出されると停止します。ここではジェネレーターのパフォーマンスが異なります。yieldキーワードを使用して関数を停止し、必要に応じてジェネレーターを再度呼び出すことで関数を開始できます。
例
function* generatorfunction(a) {
   yield a;
   yield a +1 ;
}
let g = generatorfunction(8);
console.log(g.next());
console.log(g.next()); 
    出力
{value: 8, done: false}
{value: 9, done: false} 
    ES6-ジェネレーター
function* generatorfunction(a) {
   yield a;
   yield a +1 ;
}
let g = generatorfunction(8);
console.log(g.next());
console.log(g.next()); 
    コマンド
npx babel generator.js --out-file generator_es5.js 
    BabelJS-ES5
"use strict";
var _marked = /*#__PURE__*/regeneratorRuntime.mark(generatorfunction);
function generatorfunction(a) {
   return regeneratorRuntime.wrap(function generatorfunction$(_context) {
      while (1) {
         switch (_context.prev = _context.next) {
            case 0:
               _context.next = 2;
               return a;
            case 2:
               _context.next = 4;
               return a + 1;
               
            case 4:
            case "end":
               return _context.stop();
         }
      }
   }, _marked, this);
}
var g = generatorfunction(8);
console.log(g.next());
console.log(g.next()); 
    イテレータ
JavaScriptのイテレータは、値を持つJavaScriptオブジェクトを返します。オブジェクトには、true / false値を持つdoneというフラグもあります。イテレータの終わりでない場合はfalseを返します。例を考えて、配列でのイテレータの動作を見てみましょう。
例
let numbers = [4, 7, 3, 10];
let a = numbers[Symbol.iterator]();
console.log(a.next());
console.log(a.next());
console.log(a.next());
console.log(a.next());
console.log(a.next()); 
    上記の例では、数値の配列を使用し、を使用して配列の関数を呼び出しました。 Symbol.iterator インデックスとして。
配列でnext()を使用して得られる出力は、次のとおりです。
{value: 4, done: false}
{value: 7, done: false}
{value: 3, done: false}
{value: 10, done: false}
{value: undefined, done: true} 
    出力は値を持つオブジェクトを提供し、プロパティとして実行されます。すべてnext()メソッド呼び出しは配列から次の値を与え、falseとして実行されます。doneの値は、配列の要素が完了した場合にのみtrueになります。これを使用して、配列を反復処理できます。のような利用可能なより多くのオプションがありますfor-of 次のように使用されるループ-
例
let numbers = [4, 7, 3, 10];
for (let n of numbers) {
   console.log(n);
} 
    出力
4
7
3
10 
    いつ for-of loopキーを使用すると、上記のように配列値の詳細が表示されます。両方の組み合わせをチェックし、babeljsがそれらをes5に変換する方法を確認します。
例
let numbers = [4, 7, 3, 10];
let a = numbers[Symbol.iterator]();
console.log(a.next());
console.log(a.next());
console.log(a.next());
console.log(a.next());
console.log(a.next());
let _array = [4, 7, 3, 10];
for (let n of _array) {
   console.log(n);
} 
    コマンド
npx babel iterator.js --out-file iterator_es5.js 
    出力
"use strict";
var numbers = [4, 7, 3, 10];
var a = numbers[Symbol.iterator]();
console.log(a.next());
console.log(a.next());
console.log(a.next());
console.log(a.next());
console.log(a.next());
var _array = [4, 7, 3, 10];
var _iteratorNormalCompletion = true;
var _didIteratorError = false;
var _iteratorError = undefined;
try {
   for (var _iterator = _array[Symbol.iterator](),
      _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done);
      _iteratorNormalCompletion = true) {
      var n = _step.value;
      console.log(n);
   }
} catch (err) {
   _didIteratorError = true;
   _iteratorError = err;
} finally {
   try {
      if (!_iteratorNormalCompletion && _iterator.return) {
         _iterator.return();
      }
   } finally {
      if (_didIteratorError) {
         throw _iteratorError;
      }
   }
} 
    追加された変更があります for-ofes5でループします。ただし、iterator.nextはそのままです。使用する必要がありますbabel-polyfill古いブラウザで動作させるため。Babel-polyfillはbabelと一緒にインストールされ、以下に示すようにnode_modulesから同じものを使用できます-
例
<html>
   <head>
      <script type="text/javascript" src="node_modules/babel-polyfill/dist/polyfill.min.js"></script>
      <script type="text/javascript" src="iterator_es5.js"></script>
   </head>
   <body>
      <h1>Iterators</h1>
   </body>
</html> 
    出力
                破壊
プロパティの破棄は、配列やオブジェクトから値を解凍するJavaScript式のように動作します。
次の例では、構文の破棄の動作について説明します。
例
let x, y, rem;
[x, y] = [10, 20];
console.log(x);
console.log(y);
[x, y, ...rem] = [10, 20, 30, 40, 50];
console.log(rem);
let z = 0;
({ x, y } = (z) ? { x: 10, y: 20 } : { x: 1, y: 2 });
console.log(x);
console.log(y); 
    出力
10
20
[30, 40, 50]
1
2 
    上記のコード行は、配列の右側から左側の変数に値がどのように割り当てられるかを示しています。変数...rem 配列から残りのすべての値を取得します。
以下に示すように、条件演算子を使用して左側のオブジェクトから値を割り当てることもできます。
({ x, y } = (z) ? { x: 10, y: 20 } : { x: 1, y: 2 });
console.log(x); // 1
console.log(y); // 2 
    babeljsを使用して同じものをES5に変換しましょう-
コマンド
npx babel destructm.js --out-file destruct_es5.js 
    destruct_es5.js
"use strict";
var x = void 0,
   y = void 0,
   rem = void 0;
x = 10;
y = 20;
console.log(x);
console.log(y);
x = 10;
y = 20;
rem = [30, 40, 50];
console.log(rem);
var z = 0;
var _ref = z ? { x: 10, y: 20 } : { x: 1, y: 2 };
x = _ref.x;
y = _ref.y;
console.log(x);
console.log(y); 
    テンプレートリテラル
テンプレートリテラルは、その中の式を許可する文字列リテラルです。一重引用符または二重引用符の代わりにbacktick( ``)を使用します。文字列内で式と言うときは、文字列内で変数を使用したり、関数を呼び出したりできることを意味します。
例
let a = 5;
let b = 10;
console.log(`Using Template literal : Value is ${a + b}.`);
console.log("Using normal way : Value is " + (a + b)); 
    出力
Using Template literal : Value is 15.
Using normal way : Value is 15 
    ES6-テンプレートリテラル
let a = 5;
let b = 10;
console.log(`Using Template literal : Value is ${a + b}.`);
console.log("Using normal way : Value is " + (a + b)); 
    コマンド
npx babel templateliteral.js --out-file templateliteral_es5.js 
    BabelJS-ES5
"use strict";
var a = 5;
var b = 10;
console.log("Using Template literal : Value is " + (a + b) + ".");
console.log("Using normal way : Value is " + (a + b)); 
    強化されたオブジェクトリテラル
es6では、オブジェクトリテラルに追加された新機能は非常に優れており、便利です。ES5とES6のオブジェクトリテラルの例をいくつか見ていきます。
例
ES5
var red = 1, green = 2, blue = 3;
var rgbes5 = {
   red: red,
   green: green,
   blue: blue
};
console.log(rgbes5); // {red: 1, green: 2, blue: 3}
ES6
let rgbes6 = {
   red,
   green,
   blue
};
console.log(rgbes6); // {red: 1, green: 2, blue: 3} 
    上記のコードが表示されている場合、ES5とES6のオブジェクトは異なります。ES6では、変数名がキーと同じである場合、キー値を指定する必要はありません。
babelを使用したES5へのコンパイルを見てみましょう。
ES6-拡張オブジェクトリテラル
const red = 1, green = 2, blue = 3;
let rgbes5 = {
   red: red,
   green: green,
   blue: blue
};
console.log(rgbes5);
let rgbes6 = {
   red,
   green,
   blue
};
console.log(rgbes6);
let brand = "carbrand";
const cars = {
   [brand]: "BMW"
}
console.log(cars.carbrand);  //"BMW" 
    コマンド
npx babel enhancedobjliteral.js --out-file enhancedobjliteral_es5.js 
    BabelJS-ES5
"use strict";
function _defineProperty(obj, key, value) {
   if (key in obj) {
      Object.defineProperty(obj, key, {
         value: value, enumerable: true, configurable: true, writable: true
      });
   } else { obj[key] = value; } return obj;
}
var red = 1,
   green = 2,
   blue = 3;
var rgbes5 = {
   red: red,
   green: green,
   blue: blue
};
console.log(rgbes5);
var rgbes6 = {
   red: red,
   green: green,
   blue: blue
};
console.log(rgbes6);
var brand = "carbrand";
var cars = _defineProperty({}, brand, "BMW");
console.log(cars.carbrand); //"BMW" 
    デフォルト、レスト、スプレッドのプロパティ
このセクションでは、デフォルト、レスト、スプレッドのプロパティについて説明します。
デフォルト
ES6では、次のように関数paramsのデフォルトパラメータを使用できます。
例
let add = (a, b = 3) => {
   return a + b;
}
console.log(add(10, 20));  // 30
console.log(add(10));      // 13 
    babelを使用して上記のコードをES5にトランスパイルしましょう。
コマンド
npx babel default.js --out-file default_es5.js 
    BabelJS-ES5
"use strict";
var add = function add(a) {
   var b = arguments.length > 1 >> arguments[1] !== undefined ? arguments[1] : 3;
   return a + b;
};
console.log(add(10, 20));
console.log(add(10)); 
    残り
以下の例に示すように、RESTパラメーターは3つのドット(...)で始まります-
例
let add = (...args) => {
   let sum = 0;
   args.forEach(function (n) {
      sum += n;
   });
   return sum;
};
console.log(add(1, 2));    // 3
console.log(add(1, 2, 5, 6, 6, 7));   //27 
    上記の関数では、n個のパラメーターを関数addに渡します。ES5にある場合にこれらすべてのパラメーターを追加するには、argumentsオブジェクトに依存して引数の詳細を取得する必要があります。ES6では、rest it 上に示したように3つのドットで引数を定義するのに役立ち、それをループして数値の合計を取得できます。
Note − 3つのドット、つまり残りを使用する場合、追加の引数を使用することはできません。
例
let add = (...args, value) => {    //syntax error
   let sum = 0;
   args.forEach(function (n) {
      sum += n;
   });
   return sum;
}; 
    上記のコードは構文エラーを出します。
es5へのコンパイルは次のようになります-
コマンド
npx babel rest.js --out-file rest_es5.js 
    バベル-ES5
"use strict";
var add = function add() {
   for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
      args[_key] = arguments[_key];
   }
   var sum = 0;
   args.forEach(function (n) {
      sum += n;
   });
   return sum;
};
console.log(add(1, 2));
console.log(add(1, 2, 5, 6, 6, 7)); 
    拡大
Spreadプロパティにも、残りのように3つのドットがあります。以下は、spreadプロパティの使用方法を示す実際の例です。
例
let add = (a, b, c) => {
   return a + b + c;
}
let arr = [11, 23, 3];
console.log(add(...arr));   //37 
    上記のコードがbabel-を使用してどのようにトランスパイルされるかを見てみましょう。
コマンド
npx babel spread.js --out-file spread_es5.js 
    バベル-ES5
"use strict";
var add = function add(a, b, c) {
   return a + b + c;
};
var arr = [11, 23, 3];
console.log(add.apply(undefined, arr)); 
    プロキシ
プロキシは、プロパティの検索、割り当て、列挙、関数、呼び出しなどの操作のカスタム動作を定義できるオブジェクトです。
構文
var a = new Proxy(target, handler); 
    ターゲットとハンドラーはどちらもオブジェクトです。
ターゲットはオブジェクトであるか、別のプロキシ要素にすることができます。
ハンドラーは、呼び出されたときに動作を提供する関数としてのプロパティを持つオブジェクトになります。
例を使ってこれらの機能を理解してみましょう-
例
let handler = {
   get: function (target, name) {
      return name in target ? target[name] : "invalid key";
   }
};
let o = {
   name: 'Siya Kapoor',
   addr: 'Mumbai'
}
let a = new Proxy(o, handler);
console.log(a.name);
console.log(a.addr);
console.log(a.age); 
    上記の例でターゲットとハンドラーを定義し、プロキシで使用しました。プロキシは、キー値を持つオブジェクトを返します。
出力
Siya Kapoor
Mumbai
invalid key 
    ここで、babel −を使用して上記のコードをES5にトランスパイルする方法を見てみましょう。
コマンド
npx babel proxy.js --out-file proxy_es5.js 
    バベル-ES5
'use strict';
var handler = {
   get: function get(target, name) {
      return name in target ? target[name] : "invalid key";
   }
};
var o = {
   name: 'Siya Kapoor',
   addr: 'Mumbai'
};
var a = new Proxy(o, handler);
console.log(a.name);
console.log(a.addr);
console.log(a.age);