ECMAScript HarmonyおよびNode.js

遠くから始めましょう。 ブラウザから。 私はブラウザ構築の革新にはあまり興味がありませんが、退屈して、将来のjavascriptが私たちに何を準備しているか、そして現代のブラウザが何を提供できるかを見ることにしました。 もちろん、これはECMAScript 5についてではなく、 ECMAScript 6 ECMAScript Harmonyについてです。 数分間のサーフィンの後、私はこの種の要約プレートに出会いました。 最も関連性の高いものではありません-たとえば、Chromeはかなり以前からProxyサポートしています。 もちろん、混乱はまだ1つでした。 ブラウザで使用するのはまだ現実的ではありません。

ブラウザで。 そしてサーバー上で? サーバーでは、さまざまなブラウザーの動物園をサポートする必要はありません。 Node.jsはV8(Chromeと同じjavascriptエンジン)をそれぞれ使用し、言語の同じ新しい機能をサポートする必要があります。



熱意に満ちて、letを使用してテストを開始し、nodeを開始しました。

-「そしてイチジクはあなたに」、野田は言った、「構文エラー!」

そして、悲しくなったので、私はこのベンチャーを簡単に去りました。 後で判明したように-無駄に。

ノードは猛烈なスピードでバージョンを変更していました。 変更ログは、V8のバージョンの変更について常に書きました。 そして、待望のハーモニーはどこにありますか?

数日前に別の人が出てきて、私はグーグルに身を隠し、ほとんどすぐに自分が馬鹿だと気づきました。 node.jsは起動フラグをサポートしていることがわかりました - ハーモニーと他のいくつかの比較的長い間:

--harmony(すべての調和機能を有効にします(typeofを除く))

--harmony_typeof(typeofの調和セマンティクスを有効にします)

--harmony_scoping(ハーモニーブロックスコープを有効にする)

--harmony_modules(調和モジュールを有効にします(ブロックスコープを意味します))

--harmony_proxies(調和プロキシを有効にする)

--harmony_collections(ハーモニーコレクション(セット、マップ、ウィークマップ)を有効にします)

--use_strict(厳密モードを強制する)//ちょっとしたトピックですが、重宝します



立ち上げました。 テスト済み。 それは動作します:)








では、現在ECMAScript Harmony Node.jsには何がありますか?



これまでのところ、それほどではありません。 単純なクラス宣言はまだありません。唇をなめることはできません。 ただし、少なくともProxyのせいで、新機能は注意する価値があります。



定数



フラグなしでデフォルトで有効になっているV8の唯一のHarmony機能は、多くの人がすでに絶えず使用していると思います。

以前は、jsは「定数」を大文字で書いていましたが、同じ大文字のいくつかはそれらを聞きたいと思って、コメントを次のスタイルで残していました。

var CONST_C=1;// !!!111
      
      





これですべてがシンプルになりました。

 const C=1; C=2; console.log(C);//=>1
      
      





strictモードでは、定数のスコープはletに似ています 、これについては後で詳しく説明します。



レットとブロック



厳密モードでのみ機能します。 常に処方したくない場合は、 -use_strictフラグを指定して実行してください 。 確かに、サードパーティのライブラリを特に積極的に使用していない場合にのみ-たとえば、arguments.calleeまたはwithなど、非常に多くのライブラリが存在できません。

これを新しいvarとしましょう 。一般的には1つの例外を除き、スコープはブロックに制限されます。

次のようになります。

 "use strict"; let i=1; { let i=2; console.log(i);//=>2; } console.log(i);//=>1; for(let i=0;i<5;i++) console.log(i);//=> 0, 1, 2, 3, 4 console.log(i);//=>1; if(true) var j=1;//OK if(true) let k=1;//!!!   - SyntaxError: Illegal let declaration in unprotected statement context. //,   : const C=1; { const C=2; console.log(C);//=>2; } console.log(C);//=>1;
      
      







プロキシ



おそらく、現時点で利用可能な最も興味深いオプションです。 JavaScriptのリフレクションを次のレベルに引き上げます。 たとえば、存在しないメソッドを動的に作成できます。

 var object=Proxy.create({ get:function(proxy,name){ return function(){ console.log(name); }; } }); object.test(); //=>"test" object.privet();//=>"privet"
      
      





私はかつてそのようなものがまったくjavascriptに現れることを疑っていました:)

Proxy.createFunctionを使用して、たとえば、クラスの実行可能インスタンスやその他の多くのグッズを作成できます。

ここによく描かれています



セット、マップ、およびWeakMap



セットは一意の値を格納します。MapWeakMapは、任意のオブジェクトと関数がキーになる連想配列です。 理論的には、WeakMapはMapとは異なり、キーを表すオブジェクトへのすべての参照が削除されると、配列のキーと値のペアも削除されます。 ただし、この実装では、V8、Map、およびWeakMapは同一です。 イテレータはまだ実装されていません。

 var st=new Set; st.add(5); st.add(5); console.log(st.has(5));//=>true st.delete(5); console.log(st.has(5));//=>false st.add(console); console.log(st.has(console));//=>true var map=new WeakMap; var obj={foo:"bar"}; map.set(obj,"val"); console.log(map.get(obj));//=>"val" map.delete(obj); console.log(map.get(obj));//=>undefined
      
      







nullのタイプ



 // console.log(typeof null);//=>"object" // console.log(typeof null);//=>"null"
      
      





ここにそのような論争の瞬間があります。 古いコードが破損する可能性があるため、 -harmonyフラグにはこの機能は含まれません。 使用する場合は、-- harmony_typeofで開始します



モジュール



そして今、悲しいことについて。 フラグ--harmony_modulesHarmonyスタイルのモジュールシステムの 単体テスト があり ます が、それらを拷問することはできませんでした。 セグメンテーション違反または構文エラーのいずれかを使用しようとしたとき。 誰が理解した-私は助けに感謝します。






フラグなしで実行するためにビルドする方法がわかりませんでした。実際に試してみませんでした:) deps / v8 / src / flag-definitions.hのフラグは正しいですが、 セグメンテーションフォールト以外は何も表示されませんでした 私もこれに助けてくれて感謝しています。



仕様の承認はまだ先のことであり、ほとんどのおいしい機能( tyktyktyktyktykなど)はV8ではまだ実装されていませんが、すでに悪くはないようです:)



All Articles