5

長い質問

まず、ECMA Script が標準であり、JavaScript と JScript が実装であることを知っています。3つすべてに独自の仕様が維持されており、非常に多くのエンジン、インタープリター、および実装があることを理解していますが、私の具体的な質問は次のとおりです。

3 つのそれぞれに完璧なインタープリターとエンジンが実装されていると仮定すると、あるものでできて別の 2 つではできなかったこと、またはあるものと他の 2 つとで異なる効果をもたらすものは何ですか?

幅広い質問であることは理解していますが、両方の言語 (JScript と JavaScript) は仕様 (ECMAScript) から派生しているため、実際の違いは無視できるはずです。

繰り返しますが、クロスブラウザーの互換性について話しているのではありません (IE8 と IE9 は、JScript を異なる方法で解釈する異なるエンジンを使用しており、標準は時間の経過とともに変化しています)、純粋な ECMA5、JavaScript (公式の標準がある場合、最も近いのはW3CまたはおそらくMDN、および JScript ( MSDNで管理されているようです (図を参照))。

ノート:

これは、5 年ほど前のこの質問の複製ではなく、言語の適用ではなく用語の定義を扱っているか、またはJavaScript と JScript が ECMAScript の方言であることを再度説明しているが、そうではないこの質問を扱っています。機能の違いについて説明します。

この質問は最も近いですが、具体的には、開発者が X を期待して Y を取得する際に注意すべき技術的な落とし穴です。良い例は、この質問の次のコードです。

// just normal, casual null hanging out in the sun
var nullA = null;
// query for non existing element, should get null, same behaviour also for getElementById
var nullB = document.querySelector('asdfasfdf');

// they are equal
console.log(nullA === nullB);

// false
nullA instanceof Object;

// will throw 'Object expected' error in ie8. Black magic
nullB instanceof Object;

は、理論的には ECMA 標準に準拠していない JScript の実装の違いを示しました。

4

2 に答える 2

8

EMCAScript 標準の実装は、仕様規則を実現するコード以上のものです。ECMAScript 標準は意図的に不完全です。

ECMAScript をサポートする各 Web ブラウザーとサーバーは、独自のホスト環境を提供し、ECMAScript 実行環境を完成させます。

ECMAScript の実装は、「ホスト環境」を提供する必要があります。Web ブラウザーの場合、そのホスト環境には、DOM 操作 API と、W3C および WHATWG によって指定されたその他の API が含まれます。これらの APIの動作 (実際、その存在) は、ECMAScript によって指定されていません。

実装の「ホスト環境」を完成させるために使用されるオブジェクトは、「ホスト オブジェクト」と呼ばれます。ホスト オブジェクトは、通常のオブジェクト ルールに従う必要はありません。ネイティブ (非ホスト) オブジェクトで有効なプロパティ アクセスに対してエラーをスローしたり、ネイティブでは許可されていない特定のアクションを許可したりする場合があります。

JScript と JavaScript では、DOM API の実装が異なる場合があります。特定の点でどの実装が「正しい」かは、ECMAScript への準拠の問題ではなく、W3C 標準への準拠の問題です。DOM オブジェクトが「通常の」ECMAScript の動作 (エラーの例のように) に反する動作を示しているように見える場合でも、セクション 8.6.2instanceofによると、それでも合法的な ECMAScriptです。

ホスト オブジェクトは、このドキュメントで説明されている特定のホスト オブジェクトの制限と一致している限り、実装に依存する動作でこれらの内部プロパティをサポートできます。

ここでの「内部プロパティ」には、「オブジェクトのプロパティの値を名前で取得する」などの論理演算が含まれ、 として成文化され[[Get]]ます。ホスト オブジェクトのカスタム[[Get]]実装は、エラーをスローするか、以前に設定されたプロパティを無視する可能性があります。

API の違いは、実際の言語の違いとは異なります。言語の違いは、サポートされている字句文法またはネイティブ (非ホスト) オブジェクトの動作の違いを示唆しています。実際の言語には次のような違いがあります。

  • JScript は、条件付きコンパイルcc_onを引き起こすコメントを許可します
  • Mozilla の JavaScript は、yieldキーワード、ジェネレーター、および ES5 仕様にない他の多くのものをサポートしています (ただし、ES6 仕様になる可能性があります)。
  • すべてのブラウザーはブロック内の関数宣言をサポートしていますが、これは ECMAScript の構文としては正しくありません。

    function foo() {
        bar();
    
        if(condition) {
            function bar() { } // this is not legal
        }
    }
    

    これをサポートするブラウザー (つまり、すべてのブラウザー) は、ECMAScript 言語を拡張しています。また、JScript はその例に挙げられます barが、Mozilla の JavaScript はそうではありません。これは、2 つのブラウザーが互換性のない方法で ECMAScript 言語を拡張したためです。

于 2013-09-13T19:16:53.757 に答える
0

ここから(MS-ES[35](EX)?.pdf)、標準 (3/5) およびそれらに対する Microsoft の拡張機能を扱うドキュメントを含む .pdf の .zip をダウンロードできます。

于 2013-09-14T18:48:25.493 に答える