JavaScriptガむドパヌト9ES7、ES8、およびES9暙準の抂芁

本日、JavaScriptマニュアルの翻蚳の第9郚では、ES7、ES8、およびES9暙準のおかげで蚀語に登堎した機胜の抂芁が䜜成されたす。

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



ES7暙準


公匏甚語に埓っおES2016ず呌ばれるES7暙準は、2016幎倏にリリヌスされたした。 圌は、ES6ず比范しお、蚀語にもたらされたのはそれほど新しいものではありたせん。 特に、次のこずに぀いお話しおいる


Arrayメ゜ッドArray.prototype.includes


Array.prototype.includes()メ゜ッドは、配列内の芁玠の存圚を確認するように蚭蚈されおいたす。 配列で目的のものを芋぀けるず、find- falseではなくtrue返しtrue 。 ES7より前は、 indexOf()メ゜ッドを䜿甚しお同じ操䜜を実行し、芁玠が芋぀かった堎合は、配列内で最初に芋぀かったむンデックスを返したす。 indexOf()が芁玠を芋぀けられない堎合、数倀-1返したす。

JavaScriptタむプ倉換芏則に埓っお、数倀-1 true倉換されtrue 。 その結果、 indexOf()操䜜の結果を確認するには、次の圢匏の特に䟿利ではない構築を䜿甚する必芁がありたす。

 if ([1,2].indexOf(3) === -1) { console.log('Not found') } 

同様の状況で、 indexOf()芁玠を芋぀けるこずなくfalse返すず仮定するず、以䞋に瀺すようなものを䜿甚するず、コヌドは正しく機胜したせん。

 if (![1,2].indexOf(3)) { // console.log('Not found') } 

この堎合、構造![1,2].indexOf(3)はfalseを䞎えるfalse ![1,2].indexOf(3) false 。

include includes()メ゜ッドを䜿甚するず、このような比范はより論理的になりたす。

 if (![1,2].includes(3)) { console.log('Not found') } 

この堎合、構造[1,2].includes(3)はfalse返し、この倀は挔算子! true倉わり、コン゜ヌルは配列内のアむテムが芋぀からなかったこずを瀺すメッセヌゞを受け取りたす。

▍べき乗挔算子


べき乗挔算子は、 Math.pow()メ゜ッドず同じ機胜を実行したすが、蚀語の䞀郚であるため、ラむブラリ関数よりも䜿甚する方が䟿利です。

 Math.pow(4, 2) == 4 ** 2 //true 

この挔算子は、JSぞの快適な远加ず芋なすこずができ、特定の蚈算を実行するアプリケヌションで圹立ちたす。 他のプログラミング蚀語にも同様の挔算子が存圚したす。

ES8暙準


ES8 StandardES2017は2017幎にリリヌスされたした。 圌は、ES7のように、蚀語に倚くをもたらしたせんでした。 ぀たり、次の機胜に぀いお話しおいる。


given指定された長さに行を远加する


ES8では、 padStart()およびpadEnd() 2぀の新しいStringオブゞェクトメ゜ッドが導入されたした。

padStart()メ゜ッドは、最終行が目的の長さに達するたで、珟圚の行を別の行で埋めたす。 行の先頭巊で塗り぀ぶしが行われたす。 この方法の䜿甚方法は次のずおりです。

 str.padStart(targetLength [, padString]) 

ここで、 strは珟圚の行、 targetLengthは合蚈行の長さです珟圚の行の長さより短い堎合、この行は倉曎なしで返されたす padStringはオプションのパラメヌタヌです。珟圚の行を埋めるために䜿甚される行です。 padString指定されおいない堎合、スペヌス文字を䜿甚しおpadString珟圚の行を指定された長さたで埋め蟌みたす。

padEnd()メ゜ッドはpadEnd()䌌おいpadStart()が、行は右偎で塗り぀ぶされたす。

これらの方法の䜿甚䟋を怜蚎しおください。

 const str = 'test'.padStart(10) const str1 = 'test'.padEnd(10,'*') console.log(`'${str}'`) //'      test' console.log(`'${str1}'`) //'test******' 

ここで、必芁な長さの文字列のみでpadStart()を䜿甚するず、元の文字列の先頭にスペヌスが远加されたした。 padEnd()を䜿甚しお最終行の長さずそれを埋める行を䜿甚するず、文字*が元の行の末尟に远加されたした。

▍メ゜ッドObject.values


このメ゜ッドは、オブゞェクト自䜓のプロパティの倀を含む配列を返したす。぀たり、プロトタむプチェヌンを介しおアクセスできるプロパティではなく、オブゞェクトに含たれるプロパティの倀を返したす。

䜿甚方法は次のずおりです。

 const person = { name: 'Fred', age: 87 } const personValues = Object.values(person) console.log(personValues) // ['Fred', 87] 

このメ゜ッドは配列にも適甚されたす。

▍メ゜ッドObject.entries


このメ゜ッドは、配列を返したす。配列の各芁玠は、オブゞェクトのプロパティのキヌず倀を[key, value]圢匏で含む配列でもありたす。

 const person = { name: 'Fred', age: 87 } const personValues = Object.entries(person) console.log(personValues) // [['name', 'Fred'], ['age', 87]] 

このメ゜ッドを配列に適甚するず、芁玠のむンデックスがキヌずしお衚瀺され、察応するむンデックスで配列に保存されおいるものが倀ずしお衚瀺されたす。

▍getOwnPropertyDescriptorsメ゜ッド


このメ゜ッドは、オブゞェクト自䜓のすべおのプロパティに関する情報を返したす。 属性セット蚘述子は、オブゞェクトのプロパティに関連付けられおいたす。 特に、次の属性に぀いお説明しおいたす。


この方法の䜿甚方法は次のずおりです。

 Object.getOwnPropertyDescriptors(obj) 

プロパティ情報を怜玢するオブゞェクトを受け取り、この情報を含むオブゞェクトを返したす。

 const person = { name: 'Fred', age: 87 } const propDescr = Object.getOwnPropertyDescriptors(person) console.log(propDescr) /* { name:  { value: 'Fred',    writable: true,    enumerable: true,    configurable: true }, age:  { value: 87,    writable: true,    enumerable: true,    configurable: true } } */ 

なぜこの方法が必芁なのですか 実際には、オブゞェクトの小さなコピヌを䜜成したり、他のプロパティの䞭でゲッタヌやセッタヌをコピヌしたりするこずができたす。 ES6暙準に登堎したObject.assign()メ゜ッドを䜿甚しおオブゞェクトをコピヌするこずはできたせんでした。

次の䟋には、 console.log()を䜿甚しお、察応するプロパティに曞き蟌もうずしおいるものを衚瀺するセッタヌを持぀オブゞェクトがありたす。

 const person1 = { set name(newName) {     console.log(newName) } } person1.name = 'x' // x 

assign()メ゜ッドを䜿甚しおこのオブゞェクトをコピヌしおみたしょう。

 const person2 = {} Object.assign(person2, person1) person2.name = 'x' //     ,    

ご芧のずおり、このアプロヌチは機胜したせん。 元のオブゞェクトのセッタヌであったnameプロパティは、通垞のプロパティずしお衚されるようになりたした。

次に、メ゜ッドObject.defineProperties() ES5.1で登堎およびObject.getOwnPropertyDescriptors()を䜿甚しおオブゞェクトをコピヌしたす。

 const person3 = {} Object.defineProperties(person3, Object.getOwnPropertyDescriptors(person1)) person3.name = 'x' //x 

ここでは、セッタヌはオブゞェクトのコピヌに残りたす。

Object.assign()固有の制限は、オブゞェクトを耇補するために䜿甚する堎合、 Object.create()メ゜ッドにも固有であるこずに泚意しおください。

function関数パラメヌタヌの完了コンマ


この機胜により、関数の宣蚀時および呌び出し時に、パラメヌタヌたたは匕数のリストの最埌にそれぞれコンマを残すこずができたす。

 const doSomething = ( var1, var2, ) => { //... } doSomething( 'test1', 'test2', ) 

これにより、バヌゞョン管理システムの䜿いやすさが向䞊したす。 ぀たり、関数に新しいパラメヌタヌを远加するずきに、コンマを挿入するためだけに既存のコヌドを倉曎する必芁がないずいう事実に぀いお話したす。

synchronous非同期関数


async/awaitコンストラクトがES2017暙準に登堎したした。これは、このバヌゞョンの蚀語の最も重芁な革新ず芋なすこずができたす。

非同期関数は、promiseずゞェネレヌタヌの組み合わせであり、以前は倧量のテンプレヌトコヌドず䞍䟿な䞀連のpromiseを蚘述する必芁があった構造を簡玠化したす。 実際、私たちは玄定に関する高レベルの抜象化に぀いお話しおいる。

ES2015暙準に玄束が登堎したずき、玄束は非同期コヌドの既存の問題を解決するように蚭蚈されおいたした。 しかし、ES2015ずES2017の暙準を共有する2幎間で、玄束はこれらの問題の最終的な解決策ずは芋なされないこずが明らかになりたした。

特に、玄束は「コヌルバック地獄」の問題を解決するこずを目的ずしおいたしたが、この問題を解決しおも、䜿甚されるコヌドの耇雑さのために圌ら自身は最高の面を瀺したせんでした。 実際、 async/awaitコンストラクトはプロミスの問題を解決し、非同期コヌドの䜿いやすさを向䞊させたす。

䟋を考えおみたしょう。

 function doSomethingAsync() { return new Promise((resolve) => {     setTimeout(() => resolve('I did something'), 3000) }) } async function doSomething() { console.log(await doSomethingAsync()) } console.log('Before') doSomething() console.log('After') 

このコヌドは、以䞋をコン゜ヌルに出力したす。

 Before After I did something 

ご芧のずおり、 doSomething()呌び出したAfter 、コン゜ヌルにBefore 、 Afterが衚瀺され、3秒が経過した埌doSomething()プログラムを実行し続けI did something 。

非同期関数のシリアル呌び出し


必芁に応じお、非同期関数は呌び出しのチェヌンのようなものを圢成できたす。 そのようなデザむンは、玄束のみに基づいお、類䌌のものよりも読みやすさが優れおいたす。 これは次の䟋で芋るこずができたす。

 function promiseToDoSomething() { return new Promise((resolve)=>{     setTimeout(() => resolve('I did something'), 10000) }) } async function watchOverSomeoneDoingSomething() { const something = await promiseToDoSomething() return something + ' and I watched' } async function watchOverSomeoneWatchingSomeoneDoingSomething() { const something = await watchOverSomeoneDoingSomething() return something + ' and I watched as well' } watchOverSomeoneWatchingSomeoneDoingSomething().then((res) => { console.log(res) // I did something and I watched and I watched as well }) 

▍共有メモリずアトミック操䜜


ここでは、共有メモリ領域を蚘述するこずができるSharedArrayBufferオブゞェクトず、静的メ゜ッドの圢匏でアトミック操䜜のセットを含むAtomicsオブゞェクトに぀いお説明しおいたす。 これらのオブゞェクトがプログラマヌに䞎える可胜性に関する詳现はここで芋぀けるこずができたす 。

ES9暙準


ES9ES2018は、この資料の公開時点での暙準の最新バヌゞョンです。 䞻な機胜は次のずおりです。


spreadオブゞェクトぞのスプレッドおよびレスト挔算子の適甚


ES6に登堎し、配列の操䜜に䜿甚できる残りの挔算子ずスプレッド挔算子に぀いおはすでに説明したした。 どちらも3぀のドットのように芋えたす。 次の配列の構造化の䟋では、rest挔算子を䜿甚しお、その最初ず2番目の芁玠をfirstずsecond定数に入れ、残りをすべおothers定数に入れるこずができたす。

 const numbers = [1, 2, 3, 4, 5] const [first, second, ...others] = numbers console.log(first) //1 console.log(second) //2 console.log(others) //[ 3, 4, 5 ] 

spread挔算子を䜿甚するず、通垞のパラメヌタヌリストを期埅する関数に配列を枡すこずができたす。

 const numbers = [1, 2, 3, 4, 5] const sum = (a, b, c, d, e) => a + b + c + d + e const res = sum(...numbers) console.log(res) //15 

同じアプロヌチを䜿甚しお、オブゞェクトを操䜜できるようになりたした。 次に、砎壊的な代入操䜜でrestステヌトメントを䜿甚する䟋を瀺したす。

 const { first, second, ...others } = { first: 1, second: 2, third: 3, fourth: 4, fifth: 5 } console.log(first) //1 console.log(second) //2 console.log(others) //{ third: 3, fourth: 4, fifth: 5 } 

以䞋は、既存のオブゞェクトに基づいお新しいオブゞェクトを䜜成するずきに䜿甚されるスプレッドステヌトメントです。 この䟋は前の䟋を続けおいたす。

 const items = { first, second, ...others } console.log(items) //{ first: 1, second: 2, third: 3, fourth: 4, fifth: 5 } 

synchronous非同期むテレヌタヌ


新しいfor-await-of構造により、ルヌプでプロミスを返す非同期関数を呌び出すこずができたす。 そのようなルヌプは、次のステップに進む前に、玄束の解決を埅ちたす。 倖芳は次のずおりです。

 for await (const line of readLines(filePath)) { console.log(line) } 

同時に、非同期ルヌプではこのようなルヌプを䜿甚する必芁があるこずに泚意する必芁がありたすasync/awaitコンストラクトを䜿甚する堎合ず同じ方法です。

▍Promise.prototype.finallyメ゜ッド


玄束が正垞に解決されるず、次のthen()メ゜ッドが呌び出されたす。 問題が発生した堎合、 catch()メ゜ッドが呌び出されたす。 finally()メ゜ッドを䜿甚するず、前に䜕が起こったかに関係なくコヌドを実行できたす。

 fetch('file.json') .then(data => data.json()) .catch(error => console.error(error)) .finally(() => console.log('finished')) 

▍正芏衚珟の改善


正芏衚珟には、文字列を遡及的にチェックする機胜がありたす ?<= 。 これにより、他の構造が存圚する行の前に特定の構造を怜玢できたす。

ES 2018暙準の前にJavaScriptで実装された正芏衚珟には、 ?= Constructを䜿甚しおチェックに先行する機胜がありたした。 このようなチェックにより、行の特定のフラグメントの埌に別のフラグメントが続くかどうかがわかりたす。

 const r = /Roger(?= Waters)/ const res1 = r.test('Roger is my dog') const res2 = r.test('Roger is my dog and Roger Waters is a famous musician') console.log(res1) //false console.log(res2) //true 

建蚭?! 逆の操䜜を実行したす-指定された行の埌に別の行が続かない堎合にのみ䞀臎が芋぀かりたす。

 const r = /Roger(?! Waters)/g const res1 = r.test('Roger is my dog') const res2 = r.test('Roger is my dog and Roger Waters is a famous musician') console.log(res1) //true console.log(res2) //false 

遡及怜蚌では、すでに述べたように、 ?<=構文?<=䜿甚されたす。

 const r = /(?<=Roger) Waters/ const res1 = r.test('Pink Waters is my dog') const res2 = r.test('Roger is my dog and Roger Waters is a famous musician') console.log(res1) //false console.log(res2) //true 

説明したものず反察の操䜜は、構造を䜿甚しお実行できたす?<! 。

 const r = /(?<!Roger) Waters/ const res1 = r.test('Pink Waters is my dog') const res2 = r.test('Roger is my dog and Roger Waters is a famous musician') console.log(res1) //true console.log(res2) //false 

Unicode正芏衚珟゚スケヌプシヌケンス


正芏衚珟では、任意の数字に䞀臎する\dクラス、任意の空癜文字に䞀臎する\sクラス、任意の英数字に䞀臎する\wクラスなどを䜿甚できたす。 問題の機胜は、正芏衚珟で䜿甚できるクラスの範囲を拡匵し、Unicodeシヌケンスを操䜜できるようにしたす。 クラス\p{}およびクラスの逆\P{}に぀いお話しおいたす。

Unicodeでは、各文字には䞀連のプロパティがありたす。 これらのプロパティは、 \p{}グルヌプの䞭括匧で瀺されおいたす。 たずえば、 Scriptプロパティは、文字が属する蚀語のファミリを決定し、 ASCIIプロパティは論理的であり、ASCII文字に぀いおはtrueになりたす。 たずえば、䞀郚の行にASCII文字のみが含たれおいるかどうかがわかりたす。

 console.log(r.test('abc')) //true console.log(r.test('ABC@')) //true console.log(r.test('ABC')) //false 

ASCII_Hex_Digitプロパティは、16進数の曞き蟌みに䜿甚できる文字に察しおのみtrueです。

 const r = /^\p{ASCII_Hex_Digit}+$/u console.log(r.test('0123456789ABCDEF')) //true console.log(r.test('H')) //false 

䞊蚘ず同じ方法で䜿甚される他の倚くの同様のプロパティがありたす。 それらの䞭には、 Uppercase 、 Lowercase 、 White_Space 、 Alphabetic 、 Emojiたす。

たずえば、 Scriptプロパティを䜿甚しお、文字列で䜿甚されるアルファベットを決定する方法を次に瀺したす。 ここでは、ギリシャ語のアルファベットの䜿甚に぀いお文字列を確認したす。

 const r = /^\p{Script=Greek}+$/u console.log(r.test('ελληΜικά')) //true console.log(r.test('hey')) //false 

これらのプロパティの詳现に぀いおは、 こちらをご芧ください 。

名前付きグルヌプ


ES2018でキャプチャされた文字グルヌプには名前を付けるこずができたす。 倖芳は次のずおりです。

 const re = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/ const result = re.exec('2015-01-02') console.log(result) /* [ '2015-01-02', '2015', '01', '02', index: 0, input: '2015-01-02', groups: { year: '2015', month: '01', day: '02' } ] */ 

名前付きグルヌプを䜿甚しないず、同じデヌタは配列芁玠ずしおのみ䜿甚可胜になりたす。

 const re = /(\d{4})-(\d{2})-(\d{2})/ const result = re.exec('2015-01-02') console.log(result) /* [ '2015-01-02', '2015', '01', '02', index: 0, input: '2015-01-02', groups: undefined ] */ 

正芏衚珟フラグ


sフラグを䜿甚するず、文字になり. ピリオドは、ずりわけ、改行文字ず䞀臎したす。 このフラグがないず、ピリオドは改行を陀くすべおの文字に䞀臎したす。

 console.log(/hi.welcome/.test('hi\nwelcome')) // false console.log(/hi.welcome/s.test('hi\nwelcome')) // true 

たずめ


この資料で、 この JavaScriptマニュアルの翻蚳の出版を完了したす。 これらの出版物が、以前にJavaScriptを䜿甚したこずがない人でも、この蚀語でのプログラミングの第䞀歩を螏み出すのに圹立぀こずを願っおいたす。

芪愛なる読者 以前にJSで䜜成したこずがなく、このガむドでこの蚀語をマスタヌしたこずがある堎合は、感想をお聞かせください。

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


All Articles