5

长问题

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

假设为这三个中的每一个都实现了完美的解释器和引擎,那么您可以在其中一个中做什么而在另一个中无法做到,或者在一个中与其他两个中会产生什么不同的效果?

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

同样,我不是在谈论跨浏览器兼容性(IE8 和 IE9 使用了不同的引擎,对 JScript 的解释不同,并且标准随着时间的推移而变化),而是纯 ECMA5、JavaScript(如果有官方标准,我猜最接近的是W3C或者可能是MDN和 JScript(显然在MSDN上维护(如图))。

笔记:

这不是这个已经过时五年的问题的重复,它处理的是术语的定义,而不是语言的应用,或者这个问题再次解释了 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;

展示了 JScript 实现的差异,理论上不符合 ECMA 标准。

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 行为相反的行为(如您的instanceof错误示例),根据第 8.6.2 节,它仍然是合法的 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 不会。这是因为这两种浏览器以不兼容的方式扩展了 ECMAScript 语言。

于 2013-09-13T19:16:53.757 回答
0

这里您可以下载 .pdf 的 .zip,其中包含(MS-ES[35](EX)?.pdf)处理标准 (3/5) 和 Microsoft 对它们的扩展的文档。

于 2013-09-14T18:48:25.493 回答