gpt4 book ai didi

javascript - JScript、JavaScript 和 ECMA Script 之间的功能差异是什么?

转载 作者:行者123 更新时间:2023-11-29 09:52:47 25 4
gpt4 key购买 nike

长问题

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

假设为这三个中的每一个都实现了一个完美的解释器和引擎,你可以在一个中做什么而在另一个中不能做什么,或者在一个中与其他两个中有什么不同的效果?

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

再次声明,我不是在谈论跨浏览器兼容性(IE8 和 IE9 使用不同的引擎对 JScript 的解释不同,并且标准随着时间的推移而改变),而是纯粹的 ECMA5,JavaScript(如果有官方标准,我想最接近的是 W3C 或可能是 MDN 和 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 标准故意不完整:

Each Web browser and server that supports ECMAScript supplies its own host environment, completing the ECMAScript execution environment.

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。 :

Host objects may support these internal properties with any implementation-dependent behaviour as long as it is consistent with the specific host object restrictions stated in this document.

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

API 差异不同于实际的语言 差异。 语言 的差异表明受支持的词法语法或 native (非宿主)对象的行为存在差异。实际语言的一些差异包括:

  • JScript 允许 cc_on 注释导致 conditional compilation
  • Mozilla 的 JavaScript 支持 yield 关键字、生成器以及 ES5 规范中没有的其他一些东西(但可能会出现在 ES6 中)
  • 所有浏览器都支持 block 中的函数声明,这是不合法的 ECMAScript 语法:

    function foo() {
    bar();

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

    支持此功能的浏览器(即所有浏览器)正在扩展 ECMAScript 语言。此外,JScript 将 hoist bar 在那个例子中,而 Mozilla 的 JavaScript 不会。这是因为两个浏览器以不兼容的方式扩展了 ECMAScript 语言。

关于javascript - JScript、JavaScript 和 ECMA Script 之间的功能差异是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18793295/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com