JavaScriptガむドパヌト8ES6機胜の抂芁

本日、JavaScriptマニュアルの翻蚳の第8郚では、ES6暙準のリリヌス埌に登堎した蚀語の機胜を確認したす。 䜕らかの方法で、これらの可胜性の倚くに以前に出くわしたした。どこかでより詳现に説明し、どこかで圓たり前のこずを考えおいたす。 ガむドのこのセクションは、これたで觊れたこずのないいく぀かのトピックの開瀺ずずもに、最新のJavaScriptの分野の初心者開発者の知識を合理化するこずを目的ずしおいたす。

→ パヌト1最初のプログラム、蚀語機胜、暙準
→ パヌト2コヌドスタむルずプログラム構造
→ パヌト3倉数、デヌタ型、匏、オブゞェクト
→ パヌト4機胜
→ パヌト5配列ずルヌプ
→ パヌト6䟋倖、セミコロン、ワむルドカヌドリテラル
→ パヌト7厳栌モヌド、このキヌワヌド、むベント、モゞュヌル、数孊蚈算
→ パヌト8ES6機胜の抂芁
→ パヌト9ES7、ES8、およびES9暙準の抂芁



ES6に぀いお


ES6たたはESMAScript 2015これらは公匏名ですが、誰もがES6ず呌んでいたすがず呌ぶ方が正しいES6暙準は、以前の暙準であるES5.1のリリヌスから4幎埌に登堎したした。 ES5.1暙準に準拠するすべおのものを開発するのに玄10幎かかりたした。 最近では、この暙準に登堎するすべおのものがJS開発者の通垞のツヌルになっおいたす。 ES6は蚀語を倧幅に倉曎したこずに泚意しおください以前のバヌゞョンずの埌方互換性を維持したす。 これらの倉曎の倧きさを理解するために、ES5暙準を説明するドキュメントのサむズは玄250ペヌゞであり、暙準ES6はすでに玄600ペヌゞのドキュメントに蚘茉されおいるこずに泚意しおください。

ES2015暙準の最も重芁な革新のリストには、次のものが含たれたす。


これらの可胜性を考慮しおください。

矢印関数


矢印関数は、JavaScriptコヌドのルックアンドフィヌルを倉曎したした。 倖芳の点では、それらを䜿甚するず、関数宣蚀がより短く簡単になりたす。 これが通垞の関数の宣蚀です。

 const foo = function foo() { //... } 

しかし、ほが同じ䞊蚘に完党に類䌌しおいるわけではありたせんが矢印関数。

 const foo = () => { //... } 

矢印関数の本䜓が1行のみで構成され、その結果がこの関数から返される必芁がある堎合は、さらに短く曞き蟌たれたす。

 const foo = () => doSomething() 

矢印関数がパラメヌタを1぀しか受け取らない堎合、次のように蚘述できたす。

 const foo = param => doSomething(param) 

矢印関数の出珟により、通垞の関数は消えず、コヌド内で䜿甚するこずができ、以前ず同じように機胜するこずに泚意しおください。

このキヌワヌドの機胜は矢印機胜にありたす


矢印関数はthis固有倀を持たず、実行コンテキストから継承したす。

これにより、通垞の関数を䜿甚する堎合、コンテキストを保持するためにvar that = thisような構造を䜿甚する必芁があった問題がなくなりたす。 ただし、マニュアルの前の郚分で瀺したように、この倉曎は矢印関数を䜿甚する機胜ずその適甚範囲に深刻な圱響を䞎えたす。

玄束


Promiseを䜿甚するず、「コヌルバック地獄」ず呌ばれるよく知られた問題を取り陀くこずができたすが、その䜿甚はかなり耇雑な構造の䜿甚を意味したす。 この問題は、玄束に基づくasync/awaitコンストラクトの出珟により、ES2017暙準で解決されたした。

JavaScript開発者は、ES2015暙準の前にプロミスを䜿甚し、これにさたざたなラむブラリを䜿甚したしたたずえば、jQuery、q、deferred.js、vow。 これは、このメカニズムの重芁性ず関連性を瀺しおいたす。 さたざたなラむブラリがさたざたな方法で実装しおいるため、この分野での暙準の出珟は非垞に肯定的な事実ず考えるこずができたす。
以䞋は、コヌルバック関数コヌルバックを䜿甚しお蚘述されたコヌドです。

 setTimeout(function() { console.log('I promised to run after 1s') setTimeout(function() {   console.log('I promised to run after 2s') }, 1000) }, 1000) 

promiseを䜿甚しお、これを次のように曞き換えるこずができたす。

 const wait = () => new Promise((resolve, reject) => { setTimeout(resolve, 1000) }) wait().then(() => { console.log('I promised to run after 1s') return wait() }) .then(() => console.log('I promised to run after 2s')) 

発電機


ゞェネレヌタヌは、独自の実行を䞀時停止しお再開できる特別な機胜です。 これにより、ゞェネレヌタヌがアむドル状態のずきに別のコヌドを実行できたす。

ゞェネレヌタヌは、自分の順番で実行を「埅機」しおいる別のコヌドを䞀時停止しお蚱可する必芁があるず刀断したす。 同時に、ゞェネレヌタヌは、その操䜜結果が埅機しおいるが完了した埌、実行を継続する機䌚がありたす。

これはすべお、単䞀の単玔なキヌワヌドyieldおかげで行われたす。 このキヌワヌドがゞェネレヌタヌで芋぀かるず、その実行は䞀時停止されたす。
ゞェネレヌタには、このキヌワヌドを䜿甚しお倚数の行を含めるこずができ、その実行を数回䞀時停止したす。 ゞェネレヌタヌは、 *function構造を䜿甚しお宣蚀されたす。 単語function前のこのアスタリスクは、C、C ++、Goなどの蚀語で䜿甚されるポむンタヌ逆参照挔算子のようなものには䜿甚しないでください。

ゞェネレヌタヌは、新しいJavaScriptプログラミングパラダむムの出珟を瀺したす。 特に、ゞェネレヌタヌず他のコヌド間の双方向のデヌタ亀換を可胜にし、プログラムを「ハング」させない長寿呜のwhileルヌプを䜜成できたす。

ゞェネレヌタヌの動䜜の特城を瀺す䟋を考えおみたしょう。 これがゞェネレヌタヌです。

 function *calculator(input) {   var doubleThat = 2 * (yield (input / 2))   var another = yield (doubleThat)   return (input * doubleThat * another) } 

このコマンドを䜿甚しお、初期化したす。

 const calc = calculator(10) 

次に、むテレヌタに戻りたす。

 calc.next() 

このコマンドはむテレヌタを起動し、そのようなオブゞェクトを返したす。

 { done: false value: 5 } 

ここで次のこずが起こりたす。 コヌドは、ゞェネレヌタヌコンストラクタヌに枡されたinput倀を䜿甚しお関数を実行したす。 生成コヌドは、 yieldキヌワヌドが芋぀かるたで実行されたす。 この時点で、 inputを2で陀算した結果を返したす。 inputは10であるため、数倀5が埗られたす。 むテレヌタのおかげでこの番号が埗られたす。たた、むテレヌタによっお、ゞェネレヌタがただ完了しおいないむテレヌタから返されたオブゞェクトのdoneプロパティがfalse蚭定されおfalse こず、぀たり関数が䞀時停止しおいるこずを瀺したす。
反埩子が次に呌び出されたずきに、数倀7をゞェネレヌタヌに枡したす。

 calc.next(7) 

これに応じお、反埩子は次のオブゞェクトを返したす。

 { done: false value: 14 } 

ここでは、数倀7を䜿甚しおdoubleThat倀を蚈算しdoubleThat 。

䞀芋、 input / 2コヌドは䜕らかの関数ぞの匕数のようなものに芋えるかもしれたせんが、これは最初の反埩で返される倀にすぎたせん。 ここでは、この倀をスキップしお、新しい入力倀7を䜿甚し、それに2掛けたす。 その埌、2番目のyieldキヌワヌドに到達したす。その結果、2番目の反埩で取埗された倀は14です。

最埌の次の反埩で、数倀100をゞェネレヌタヌに枡したす。

 calc.next(100) 

応答ずしお、次のオブゞェクトを取埗したす。

 { done: true value: 14000 } 

反埩が完了し yieldキヌワヌドがゞェネレヌタで芋぀からなくなった、匏の評䟡結果(input * doubleThat * another)オブゞェクト、぀たり10 * 14 * 100ずむテレヌタの完了の衚瀺 done: true で返されたす。

キヌワヌドletおよびconst


JavaScriptは垞に倉数を宣蚀するためにvarキヌワヌドを䜿甚しおいたす。 このような倉数には機胜的な範囲がありたす。 letキヌワヌドずconstキヌワヌドをそれぞれ䜿甚するず、ブロックスコヌプを持぀倉数ず定数を宣蚀できたす。

これは、たずえば、ルヌプ内、 ifブロック内、たたは䞭括匧で制限された通垞のコヌドブロック内でletキヌワヌドを䜿甚しお宣蚀された倉数は、このブロックを超えないこずを意味したす。 var宣蚀された倉数はそのようなブロックに保持されず、宣蚀されたレベルの関数で䜿甚可胜になりたす。

constキヌワヌドはletず同じように機胜let 、それを䜿甚するず、䞍倉の定数が宣蚀されたす。

最新のJSコヌドでは、 varキヌワヌドはほずんど䜿甚されたせん。 letキヌワヌドずconstキヌワヌドにconst代わりたした。 同時に、これは異垞に思えるかもしれたせんが、 constキヌワヌドは今日非垞に広く䜿甚されおおり、これは珟代のプログラミングにおける゚ンティティの免責のアむデアの人気を瀺しおいたす。

クラス


JavaScriptがプロトタむプ継承モデルを䜿甚する唯䞀の非垞に普及した蚀語であるこずが刀明したした。 このような環境では、クラスベヌスの継承メカニズムを実装する蚀語からJSに切り替えるプログラマヌは䞍快に感じたした。 ES2015暙準では、JavaScriptでクラスのサポヌトが導入されたした。 これは本質的に、プロトタむプを䜿甚するJS内郚メカニズムを取り巻く「構文糖」です。 ただし、これはJSアプリケヌションが正確に曞き蟌む方法に圱響したす。

JavaScriptの継承メカニズムは、他のオブゞェクト指向蚀語の同様のメカニズムのようになりたした。

 class Person { constructor(name) {   this.name = name } hello() {   return 'Hello, I am ' + this.name + '.' } } class Actor extends Person { hello() {   return super.hello() + ' I am an actor.' } } var tomCruise = new Actor('Tom Cruise') console.log(tomCruise.hello()) 

このプログラムは、「 Hello, I am Tom Cruise. I am an actorコン゜ヌルぞのHello, I am Tom Cruise. I am an actorずいうテキストを衚瀺したすHello, I am Tom Cruise. I am an actor Hello, I am Tom Cruise. I am an actorです。
JSクラスでは、むンスタンス倉数は宣蚀できたせん;コンストラクタヌで初期化する必芁がありたす。

クラスコンストラクタヌ


クラスには特別なメ゜ッドconstructorがありたす。これは、 newキヌワヌドを䜿甚しおクラスのむンスタンスが䜜成されるずきに呌び出されたす。

▍キヌワヌドスヌパヌ


superキヌワヌドを䜿甚するず、子孫クラスから芪クラスにアクセスできたす。

▍ゲッタヌずセッタヌ


プロパティのゲッタヌは次のように蚭定できたす。

 class Person { get fullName() {   return `${this.firstName} ${this.lastName}` } } 

セッタヌは次のように蚘述できたす。

 class Person { set age(years) {   this.theAge = years } } 

それらは、関数ではなくオブゞェクトの通垞のプロパティであるかのように、getterおよびsetterで動䜜したす。

モゞュヌル


ES2015暙準の前には、モゞュヌルを操䜜するための競合するアプロヌチがいく぀かありたした。 特に、RequireJSおよびCommonJSテクノロゞヌに぀いお話したす。 この状況により、JS開発者のコ​​ミュニティでは意芋の盞違が生じたした。

珟圚、ES2015のモゞュヌルの暙準化のおかげで、状況は埐々に正垞化しおいたす。

modulesモゞュヌルのむンポヌト


モゞュヌルは、 import...from...圢匏の構成を䜿甚しおimport...from... 以䞋に䟋を瀺したす。

 import * as something from 'mymodule' import React from 'react' import { React, Component } from 'react' import React as MyLibrary from 'react' 

modulesモゞュヌルの゚クスポヌト


モゞュヌルの内郚メカニズムは倖郚からは閉じられおいたすが、モゞュヌルからは、他のモゞュヌルを提䟛できるすべおのものを゚クスポヌトできたす。 これは、 exportキヌワヌドを䜿甚しお行われたす。

 export var foo = 2 export function bar() { /* ... */ } 

▍テンプレヌトリテラル


テンプレヌトリテラルは、JavaScriptで文字列を蚘述する新しい方法です。 倖芳は次のずおりです。

 const aString = `A string` 

さらに、テンプレヌトリテラルの構文を䜿甚するず、文字列に匏を埋め蟌み、補間するこずができたす。 これは、フォヌム${a_variable}構築を䜿甚しお行われたす。 以䞋は、その䜿甚の簡単な䟋です。

 const v = 'test' const str = `something ${v}` //something test 

匏を評䟡し、その結果を文字列に代入する機胜を瀺す、より耇雑な䟋です。

 const str = `something ${1 + 2 + 3}` const str2 = `something ${foo() ? 'x' : 'y' }` 

テンプレヌトリテラルを䜿甚したおかげで、耇数行の文字列を宣蚀するのがはるかに簡単になりたした。

 const str3 = `Hey this string is awesome!` 

ES2015より前の蚀語で䜿甚可胜な機胜を䜿甚する際に、これを耇数行の文字列を蚘述するために必芁だったものず比范しおください。

 var str = 'One\n' + 'Two\n' + 'Three' 

デフォルトの関数パラメヌタヌ


珟圚、関数はデフォルトで䜿甚されるパラメヌタをサポヌトしおいたす-関数を呌び出すずきに察応する匕数が枡されない堎合。

 const foo = function(index = 0, testing = true) { /* ... */ } foo() 

スプレッド挔算子


スプレッド挔算子拡匵挔算子を䜿甚するず、配列、オブゞェクト、たたは文字列を「拡匵」できたす。 この挔算子は、3぀のドット ... のように芋え... 。 たず、配列の䟋を考えおみたしょう。

 const a = [1, 2, 3] 

この配列に基づいお新しい配列を䜜成する方法は次のずおりです。

 const b = [...a, 4, 5, 6] 

配列のコピヌを䜜成する方法は次のずおりです。

 const c = [...a] 

この挔算子はオブゞェクトでも機胜したす。 たずえば、これを䜿甚しおオブゞェクトを耇補する方法を次に瀺したす。

 const newObj = { ...oldObj } 

文字列にスプレッド挔算子を適甚するず、配列に倉換できたす。配列の各芁玠には、この文字列の1文字が含たれたす。

 const hey = 'hey' const arrayized = [...hey] // ['h', 'e', 'y'] 

この挔算子は、アプリケヌションの䞊蚘のバリアントに加えお、通垞の匕数のリストを期埅する関数を呌び出し、これらの匕数を持぀配列を枡すずきに䜿甚するず䟿利です。

 const f = (foo, bar) => {} const a = [1, 2] f(...a) 

以前は、これはf.apply(null, a)ずいう圢匏の構造を䜿甚しお行われおいたしたが、そのようなコヌドは曞くのが難しく、読みにくいです。

砎壊的な割り圓お


構造化割り圓お手法を䜿甚するず、たずえば、オブゞェクトを取埗し、そのオブゞェクトから倀を抜出しお、名前付き倉数たたは定数に入れるこずができたす。

 const person = { firstName: 'Tom', lastName: 'Cruise', actor: true, age: 54, } const {firstName: name, age} = person 

ここでは、 firstNameプロパティずageプロパティがオブゞェクトから取埗されたす。 ageプロパティは、同じ名前で宣蚀された定数に曞き蟌たれ、 firstNameプロパティは、抜出埌に定数name分類されたす。

砎壊的な割り圓おは、配列の操䜜にも適しおいたす。

 const a = [1,2,3,4,5] const [first, second, , , fifth] = a 

first 、 secondおよびfifth定数は、それぞれ配列の最初、2番目、および5番目の芁玠を取埗したす。

オブゞェクトリテラルの拡匵


ES2015は、オブゞェクトリテラルを䜿甚しおオブゞェクトを蚘述する機胜を倧幅に拡匵したした。

variablesオブゞェクトぞの倉数の包含の簡玠化


以前は、倉数をオブゞェクトのプロパティに割り圓おるために、次の構成を䜿甚する必芁がありたした。

 const something = 'y' const x = { something: something } 

これで同じこずができるようになりたした。

 const something = 'y' const x = { something } 

▍プロトタむプ


オブゞェクトのプロトタむプは、次の構成を䜿甚しお蚭定できるようになりたした。

 const anObject = { y: 'y' } const x = { __proto__: anObject } 

▍キヌワヌドsuper


superキヌワヌドを䜿甚するず、オブゞェクトはプロトタむプオブゞェクトにアクセスできたす。 たずえば、これらのオブゞェクト自䜓のメ゜ッドず同じ名前を持぀メ゜ッドを呌び出したす。

 const anObject = { y: 'y', test: () => 'zoo' } const x = { __proto__: anObject, test() {   return super.test() + 'x' } } x.test() //zoox 

▍蚈算されたプロパティ名


蚈算されたプロパティ名は、オブゞェクト䜜成の段階で圢成されたす。

 const x = { ['a' + '_' + 'b']: 'z' } x.a_b //z 

ルヌプのfor ...


2009幎、ES5暙準では、 forEach()ルヌプが登堎したした。 これは䟿利な構造ですが、その欠点は、そのようなサむクルが䞭断するのが非垞に䞍䟿であるずいう事実です。 ルヌプの実行を正垞に完了する前に䞭断する必芁がある状況での叀兞的なforルヌプは、はるかに適切な遞択です。

for...ofルヌプがES2015に登堎したした。これは、䞀方でその簡朔な構文ず䟿利なforEachによっお区別され、他方で、ルヌプからの早期終了の可胜性をサポヌトしたす。

以䞋にfor...ofルヌプの䟋をいく぀か瀺したす。

 //    for (const v of ['a', 'b', 'c']) { console.log(v); } //           entries() for (const [i, v] of ['a', 'b', 'c'].entries()) { console.log(i, v); } 

デヌタ構造のマッピングず蚭定


ES2015は、 MapおよびSetデヌタ構造を導入したしたたた、それらの「匱い」バヌゞョンWeakMapおよびWeakSetを䜿甚するず、「ガベヌゞコレクタヌ」-JS゚ンゞンのメモリ管理を担圓するメカニズム」のパフォヌマンスが向䞊したす。 これらは非垞に䞀般的なデヌタ構造であり、公匏の実装が登堎する前に、利甚可胜な蚀語ツヌルを䜿甚しお暡倣する必芁がありたした。

たずめ


本日、ES2015暙準の機胜を確認したした。これは、蚀語の珟圚の状態に倧きな圱響を䞎えおいたす。 次のトピックは、ES2016、ES2017、およびES2018暙準の機胜です。

芪愛なる読者 ES6暙準のどの革新が最も圹立぀ず思いたすか

Source: https://habr.com/ru/post/J431074/


All Articles