IE10からサポートされるECMAScript(エクマスクリプト)とは、
なんでしょうか?


■ECMAScript(エクマスクリプト)


 ECMAScript(エクマスクリプト)は、Ecma International によって
 策定されたスクリプト言語である。
 互換性の低い JavaScript と JScript を標準化すべく、両方の言語に
 共通する部分を取り入れて作られた。
 現在の最新バージョンは5 (5th edition)。
 2009年12月に標準化。関連規格の一つである

 ECMAScript for XML (E4X) では、ネイティブで XML が

 サポートされている。


■ECMAScript 5、


 ECMAScript 5では基本ライブラリの拡張、コーディングミスを

 特定するための仕組みが追加されている。



 ●基本ライブラリに拡張された機能


  ・DateがISO8601形式の日付を生成できるようになり、パースもできる


   例)20091209T12:34:56Z


  ・Stringにtrim()メソッドが組み込まれる。


  ・新しいJSONオブジェクトは、JSON形式のデータを
   効率的に生成するためにparseとstringifyをサポートする。
   evalと似ているが、セキュリティを考慮した実装がないので
   コードを少なくできる。
   また、JSONObjectやJSONArrayだけでなく、どのような

   JSONValueも使える。
   (JSON-Textを定義しているが、これはオブジェクトか配列に

   制限されている。)


  ・Prototypeのbind()と同じ構文でbindが追加。


  ・Arrayが標準的なファンクションをサポート。


   例)indexOf()やmap()、filter()そして reduce()など。


  ・オブジェクトはseal()
   (新しい属性の追加と既存の属性の削除ができなくなる)と
   freeze()
   (すべての属性が読み取り専用になり、属性の追加と削除も
   できなくなる)が利用できる。


  ・Object.keys()を使うとそのオブジェクトのすべての
   enumerableな属性を一覧できる。


  ・Object.getOwnPropertyNames()を使うとすべてのenumerableと
   非enumerable属性を一覧できる。


  ・Object.getPrototypeof()を使うとそのオブジェクトのprototypeを返す



 ●一般的でありがちなコーディングミスを特定し、
  除去するためにより厳格なランタイムモードが導入


  ・Strict mode

   strict modeを導入する目的は、ECMAScriptアプリケーションを
   開発するときに発生するコーディング上の一般的な問題を
   避けることです。
   ひとつのユニット(スクリプトまたはファンクション)の中に、
   次のような文字列リテラルを書くことでこの制約を有効にできる。


    "use strict;"


   このリテラルを宣言することにより、は従来のランタイム上では
   何の影響もないが、バージョン5がターゲットとする
   新しいランタイム上ではstrict modeに切り替わります。


サンプルソース

"use strict";

(function () {
console.log(new Function('return this')()); // [object Window]
console.log(Function('return this')()); // [object Window]
})();


   では、strictモードにすることによってどうなるか?


   ・変数は利用する前に宣言しなくてはならない。
    言い換えれば、i=3という書き方はランタイムエラーになる。
    var i=3としなければならない。

    (iがこのスコープ内にはないという前提)


   ・Evalは予約語になる。また、eval内で新しい変数を導入できなくなる。
    したがって、eval("var i=3"); print(i);と書くと例外が発生する。


   ・8進数のリテラルは使えない。したがって010は10であり、8ではない。

   ・configurableフラグがfalseに設定されている引数や関数、変数や
    その他の属性に対して、delete演算子が使えない。


   ・エラーの原因になりやすいwithステートメントは使えない。
    構文エラーと見なされる。


   ・同じ名前で引数が重複しているファンクションは定義できない。

   ・オブジェクトは同じ名前の属性を持てない。


   ・argumentsとcaller変数は不変になる。


   ・グローバルオブジェクトへのアクセスはランタイムエラーになる。