详细问题

首先,我知道ECMA Script是标准的,而JavaScript和JScript是实现。我知道所有这三个规范都有自己的规范,并且引擎,解释器和实现都有很多,但是我的具体问题是:

假设为这三个实现了一个完美的解释器和引擎,那么您可以在一个中做什么而又不能在另一个中做,或者哪​​个会与其他两个有不同的作用?

我知道这是一个广泛的问题,但是由于两种语言(JScript和JavaScript)均源于规范(ECMAScript),因此实际差异应该可以忽略不计。

同样,我不是在谈论跨浏览器的兼容性(IE8和IE9使用了不同的引擎,这些引擎对JScript的解释不同,并且标准随着时间的推移而发生了变化),而是纯ECMA5,JavaScript(如果有正式标准,我想最接近的是W3CMDN,以及JScript(显然维护在MSDN处)。

注意:

这不是this question的副本,后者已经过期了五年,它处理术语的定义,而不是语言的应用,或者不是this question,后者再次说明JavaScript和JScript是ECMAScript的方言,但没有涉及任何功能上的差异。

This question是最接近的,但是我要关注的是开发人员期望X并获得Y时应谨慎的技术陷阱。一个很好的例子是来自this question的以下代码:

// 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;

在JScript的实现上显示出差异,这在理论上不符合ECMA标准。

最佳答案

EMCAScript标准的实现不仅仅是使规范规则生效的代码。 ECMAScript标准是故意不完整的:



ECMAScript实现必须提供“主机环境”。对于Web浏览器,该主机环境包括DOM操作API和W3C和WHATWG指定的其他API。 ECMAScript未指定这些API的行为(实际上是存在)。

用于完成实现的“主机环境”的对象称为“主机对象”。宿主对象不一定要遵循正常的对象规则:它们可能会引发对 native (非宿主)对象有效的属性访问错误,或者它们可能允许某些 native 不允许的操作。

JScript和JavaScript可能会以不同的方式实现其DOM API。在某些特定点上哪种实现是“正确”的,与ECMAScript的合规性无关,而与W3C标准的合规性无关。即使DOM对象似乎表现出某些与“正常” ECMAScript行为相反的行为(例如您的instanceof错误示例),但根据section 8.6.2,它仍然是合法的ECMAScript:



这里的“内部属性”包括诸如“按名称获取对象属性的值”之类的逻辑操作,它们被编码为[[Get]]。主机对象的自定义[[Get]]实现可能会引发错误,或者忽略先前设置的属性。

API差异与实际语言差异是不同的。语言上的差异表明所支持的词汇语法或 native (非宿主)对象的行为有所不同。实际语言中的一些差异包括:

  • JScript允许引起conditional compilationcc_on注释
  • Mozilla的JavaScript支持yield关键字,生成器以及许多其他不在ES5规范中(但可能在ES6中使用)的东西
  • 所有浏览器都支持块形式的函数声明,这不是合法的ECMAScript语法:
    function foo() {
        bar();
    
        if(condition) {
            function bar() { } // this is not legal
        }
    }
    

    支持此功能的浏览器(即所有'em)都在扩展ECMAScript语言。同样,在该示例中,JScript将hoist bar,而Mozilla的JavaScript不会。这是因为两个浏览器以不兼容的方式扩展了ECMAScript语言。
  • 关于javascript - JScript,JavaScript和ECMA Script之间的功能区别是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18793295/

    10-11 16:58