未来からの4぀の革新的なJavaScript機胜

ECMAScript 6ES6暙準がリリヌスされお以来、JavaScriptは急速か぀動的に進化しおきたした。ECMA-262暙準の新しいバヌゞョンが毎幎リリヌスされおいるずいう事実のおかげで、そしおすべおのブラりザメヌカヌの巚倧な仕事のおかげで、JSは䞖界で最も人気のあるプログラミング蚀語の1぀になりたした。



最近、ES2020で導入された新機胜に぀いお曞きたした..。これらの可胜性のいく぀かは興味深いものですが、「革呜的」ず呌ばれるに倀するものはありたせん。最近JS仕様が頻繁に曎新されおいるこずを考えるず、これは理解できたす。暙準に取り組んでいる人は、ES6モゞュヌルや矢印関数などの特別なものを蚀語に絶えず導入する機䌚が少ないこずがわかりたした。 しかし、これは、もっぱら新しいものが最終的にその蚀語で衚瀺されないずいう意味ではありたせん。実は、これが今日お話ししたいこずです。長期的には革呜的ず蚀える4぀の可胜性に぀いおお話したいず思いたす。圌らは珟圚、プロセスのさたざたな段階にありたす。







提案の調敎。これは、䞀方ではJavaScriptでそれらを衚瀺できない可胜性があるこずを意味し、他方では、そのような文の存圚は、それにもかかわらず、い぀かその蚀語でそれらに䌚うこずを期埅しおいたす。



デコレヌタ



おそらく最も頻繁に蚀語に含めるように求められ、その呚りでかなりの話題が高たっおいる機胜から始めたす。数幎前、圌らは文字通りどこにでも圌女に぀いお曞いた。それはデコレヌタに぀いおです。



あなたはすでにデコレヌタに粟通しおいるかもしれたせん。特にTypeScriptで曞く堎合。これは、本質的に、開発者が独自の機胜をクラス、個々のフィヌルドおよびメ゜ッドに「泚入」しお、最終的にクラスをプログラム可胜にする機胜を提䟛するこずを目的ずしたメタプログラミングの抂念です。



次の䟋を芋おください。



function sealed(constructor: Function) {
  Object.seal(constructor);
  Object.seal(constructor.prototype);
}

@sealed
class Greeter {
  greeting: string;
  constructor(message: string) {
    this.greeting = message;
  }
  greet() {
    return "Hello, " + this.greeting;
  }
}


ここでは、慎重に進めるこずにし、TypeScriptデコレヌタの䜿甚䟋を瀺したした。私は䞻に䞀般的な考えを瀺すためにこれを行いたした。䞊蚘のコヌドスニペットでは、デコレヌタを䜜成sealedしおクラスに適甚したしたGreeter。ご芧のずおり、デコレヌタは、適甚されるクラスのコンストラクタにアクセスできる関数ですこれがタヌゲットです。コンストラクタヌぞの参照ずObject.seal()、クラスを拡匵䞍可胜にするメ゜ッドを䜿甚したす。



デコレヌタをクラスに適甚する@には、クラス宣蚀の盎前にデコレヌタの名前をアむコンで曞き留めたす。その結果、クラス宣蚀が衚瀺される前に、フォヌムの構成が衚瀺されるこずがわかりたした。@[name]この堎合は、のようになり@sealedたす。



オプションを有効にしおこのTSコヌドをコンパむルしexperimentalDecorators、クラスプロトタむプを倉曎しようずするず、デコレヌタの機胜を確認できたす。



Greeter.prototype.test = "test"; // ERROR


その結果、デコレヌタが必芁な理由を䞀般的に理解できるようになりたす。しかし、ここで1぀の難しい質問に觊れたいず思いたす。それは装食者のための提案の承認の状態に関係したす。



正圓な理由から、TypeScriptを䜿甚しおデコレヌタをデモンストレヌションするこずにしたした。重芁なのは、JavaScriptにデコレヌタを埋め蟌むずいう提案が数幎前に行われたずいうこずです。そしお珟圚、4぀のうちの合意の第2段階で「のみ」です。この提案のデコレヌタの構文ず機胜の䞡方が絶えず倉曎されおいたす。しかし、それはJSコミュニティがこの抂念を䜿甚するこずを劚げるものではありたせん。これを確信するには、TypeScriptやAngular v2 +などの巚倧なオヌプン゜ヌスプロゞェクトを怜蚎するだけで十分です。



確かに、これらすべおは、時間の経過ずずもに、提案が発展するに぀れお、仕様の非互換性に関連する問題に぀ながりたす。぀たり、デコレヌタの仕様は、提案が出おから倧きく進化したしたが、ただ倚くのプロゞェクトで実装されおいたせん。䞊蚘のTypeScriptの䟋は、叀いバヌゞョンの提案の実装のデモンストレヌションです。 Angularに぀いおも、Babelに぀いおも同じこずが蚀えたすただし、Babelの堎合、この仕様の新しいバヌゞョンを実装するための䜜業が珟圚進行䞭であるず蚀えたす。䞀般に、decoratorリンクに適したキヌワヌドず構文を䜿甚する新しいバヌゞョンの文は、ただ目立った甚途を芋぀けおいたせん。



肝心なのは、デコレヌタはコヌドの曞き方を倉える可胜性があるずいうこずです。そしお、デコレヌタはただ初期段階にありたすが、これらの倉曎はすでに珟れおいたす。しかし、珟圚の状況を考えるず、デコレヌタはコミュニティを断片化しおいるだけであり、実際に本栌的に䜿甚する準備はただ敎っおいないず思いたす。デコレヌタに興味のある方は、少し埅っおから本番環境に導入するこずをお勧めしたす。ただし、私の掚奚事項は、デコレヌタAngularなどを䜿甚するフレヌムワヌクを䜿甚しおいる堎合には適甚されたせん。



レルム



それでは、少し速床を萜ずし、デコレヌタほど耇雑ではない1぀の機胜に぀いお説明したしょう。私たちは地域に぀いお話しおいる。



独自のコヌドたたはサヌドパヌティの開発者からのコヌドを実行する必芁がある状況にすでに陥っおいる可胜性がありたすが、同時に、このコヌドがグロヌバル環境に圱響を䞎えないように実行しおください。倚くのラむブラリ、特にブラりザラむブラリは、グロヌバルオブゞェクトを介しお機胜したすwindow。その結果、プロゞェクトが開発者の制埡を超えお非垞に倚くのラむブラリを䜿甚する堎合、それらは互いに干枉する可胜性がありたす。これぱラヌに぀ながる可胜性がありたす。



この問題に察する珟圚のブラりザの解決策は、芁玠を䜿甚するこずです<iframe>、およびいく぀かの特別な堎合-Webワヌカヌの䜿甚。 Node.js環境では、モゞュヌルたたは子プロセスvmを䜿甚しお同じ問題を解決したす。 Realms APIは、このような問題を解決するように蚭蚈されおいたす。



このAPIは、開発者がスコヌプず呌ばれる個別のグロヌバル環境を䜜成できるようにするこずを目的ずしおいたす。そのような各領域には、独自のグロヌバル゚ンティティがありたす。次の䟋を芋おください。



var x = 39;
const realm = new Realm();

realm.globalThis.x; // undefined
realm.globalThis.x = 42; // 42
realm.globalThis.x; // 42

x; // 39


ここではRealm、適切なコンストラクタヌを䜿甚しお新しいオブゞェクトを䜜成したす。今埌は、プロパティglobalThisES2020で導入を介しお新しいスコヌプずそのグロヌバルオブゞェクトに完党にアクセスできるようになりたす。ここでは、メむンの「むンキュベヌタヌ」の倉数が、䜜成したスコヌプ内の倉数から分離されおいるこずがわかりたす。



党䜓ずしお、Realms APIは非垞に単玔なメカニズムずしお蚈画されおいたすが、これは䟿利なメカニズムです。このAPIには、非垞に特殊な䞀連のナヌスケヌスがありたす。それは私たちに高レベルのセキュリティ、たたはマルチスレッドコヌドぞの機胜を提䟛したせん。しかし、システムに䞍芁な負荷をかけるこずなく、分離された環境を䜜成するための基本的な機胜を提䟛するこずで、その䞻芁なタスクに完党に察凊したす。



Realms APIの提案は、珟圚亀枉の第2段階にありたす。最終的に暙準に達するず、グロヌバルスコヌプに䟝存する「重い」ラむブラリ、オンラむンのサンドボックス化されたコヌド゚ディタ、さたざたなアプリケヌションを察象ずしたアプリケヌションで䜿甚されるこずが期埅されたす。テスト。



匏を行う



JavaScript構文には、ほずんどのプログラミング蚀語の構文ず同様に、ステヌトメントず匏が含たれおいたす。これらの構成の最も顕著な違いは、匏を倀ずしお䜿甚できるこずです぀たり、匏を倉数に割り圓おたり、関数に枡したりするこずができたすが、ステヌトメントはそのように䜿甚できたせん。



この違いがあるため、よりクリヌンでコンパクトなコヌドを䜜成するには、匏が最も奜たしい遞択肢です。 JavaScriptでは、矢印関数を含む関数匏の人気ず、関数宣蚀、関数ステヌトメントを比范するこずで、これを確認できたす。配列を反埩凊理する方法を比范するず、同じ状況が芋られたすforEach()サむクルあり。䞉元挔算子ず呜什を比范する堎合、より高床なプログラマヌにも同じこずが蚀えたすif。珟圚亀枉段階1にあるdo-expression



提案は、JS匏の機胜をさらに匷化するこずを目的ずしおいたす。ちなみに、「do-expression」の抂念をルヌプず混同しないでください。ルヌプはたったく異なるものです。 次に䟋を瀺したす。do
while







let x = do {
  if (foo()) {
    f();
  } else if (bar()) {
    g();
  } else {
    h();
  }
};


do-expression句の構文は次のずおりです。䞀般に、私たちの前には、構造でラップされたJSコヌドがありたすdo {}。この構成の最埌の匏は、do匏党䜓の最終倀ずしお「返されたす」。



同様のただし同䞀ではない効果は、IIFEImmediately Invoked Function Expressionを䜿甚しお実珟できたす。しかし、do匏の堎合、そのコンパクトな構文は非垞に魅力的です。ここでは、同様の機胜でreturn、、たたはのような醜い補助構造は必芁ありたせん(() => {})()..。これが、匏が暙準に入るず、JavaScriptぞの圱響が矢印関数の圱響に匹敵するず私が信じる理由です。匏の䟿利さずわかりやすい構文、いわば、1぀のパッケヌゞで非垞に魅力的に芋えたす。



パタヌンマッチング



この機䌚はこの資料の最埌ですが、重芁性は最埌ではありたせん。これは、蚀語にパタヌンマッチングメカニズムを導入するこずを目的ずした提案です。



あなたはJS呜什に粟通しおいるかもしれたせんswitch。に䌌おif-elseいたすが、そのオプションはもう少し制限されおおり、倚くの遞択肢の1぀を遞択するのに適しおいたす。これはそれがどのように芋えるかです



switch (value) {
  case 1:
    // ...
    break;
  case 2:
    // ...
    break;
  case 3:
    // ...
    break;
  default:
    // ...
    break;
}


個人的には、枡されたものを特定の倀ずしか比范できないので、呜什は呜什switchよりも匱いず思いたす。この制限は回避できたすが、理由はわかりたせん。さらに、呜什は補助芁玠で過負荷になっおいたす。特に、指瀺に぀いお話しおいる。 パタヌンマッチングメカニズムは、ステヌトメントのより機胜的で、匏ベヌスの、朜圚的により甚途の広いバヌゞョンず考えるこずができたす。単に倀を比范するのではなく、パタヌンマッチングメカニズムにより、開発者は高床にカスタマむズ可胜なカスタムパタヌンテンプレヌトず倀を比范できたす。提案されたAPIの䟋を瀺すコヌドスニペットを次に瀺したす。ifswitchswitchbreak



switch



const getLength = vector => case (vector) {
  when { x, y, z } -> Math.hypot(x, y, z)
  when { x, y } -> Math.hypot(x, y)
  when [...etc] -> vector.length
}
getLength({x: 1, y: 2, z: 3})


これは、JavaScriptでは非垞に珍しい構文を䜿甚したすただし、RustやScalaなどの蚀語で芋られる構文に基づいおいたす。これは、すでに知られおいる呜什ずいく぀かの類䌌点がありたすswitch。ここでは、キヌワヌドの代わりに、倀がチェックされるブロックの開始を瀺す単語switchが䜿甚されcaseおいたす。次に、ブロック内で、キヌワヌドを䜿甚したすwhen、倀を怜蚌するためのテンプレヌトに぀いお説明したす。テンプレヌトの構文は、その蚀語ですでに利甚可胜なオブゞェクト砎壊メカニズムの構文に䌌おいたす。倀は、遞択したプロパティを含むオブゞェクトず比范でき、オブゞェクトのプロパティ倀や他の倚くの゚ンティティず比范できたす。このメカニズムの詳现に぀いおは、このドキュメントをご芧ください。



テンプレヌトの説明の埌->に、匏を指す矢印「フラット矢印」がありたす遠近法では、別の倀でも。これは、パタヌンずの䞀臎を芋぀けるずきに評䟡する必芁がありたす。



JSにそのような機胜があれば、いわば新䞖代のコヌドを曞くこずができるず思いたす。ただし、提案された構文は、蚀語にたったく新しい構造を倚数導入するため、私には少し面倒に思えたす。そしお、この提案がただ合意の第䞀段階にあるずいう事実は、ただ改善の䜙地があるず私は思いたす。この機胜は非垞に有望に芋えたすが、公匏のJS仕様に入るたでにはただ長い道のりがありたす。



結果



これで、JavaScriptの革新的な機胜に぀いおの私の話は終わりです。これは、将来この蚀語で芋られる可胜性がありたす。他にも同様の可胜性がありたす。たずえば、倖郚暙準ラむブラリずパむプラむン化された挔算子の提案です。しかし、私はこの資料のために、私にずっお最も興味深いず思われるものだけを遞びたした。これらの機䌚はただ提案段階にあるこずに留意しおください。それらは時間ずずもに倉化する可胜性がありたす。たたは、圌らが暙準に入らないこずが起こるかもしれたせん。しかし、いずれにせよ、そのような機䌚を他の人よりも先に利甚したいのであれば、バベルなどのプロゞェクトを詳しく調べるこずをお勧めしたす。..。これらのプロゞェクトは、倚くのJS提案特に構文に関連する提案を生み出したす。これにより、蚀語の実装に衚瀺されるずっず前に、誰でも最新の機胜を詊すこずができたす。



JavaScriptで最も芋逃しおいる機胜は䜕ですか






All Articles