详细问题
首先,我知道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标准是故意不完整的:
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 (非宿主)对象的行为有所不同。实际语言中的一些差异包括:
cc_on
注释yield
关键字,生成器以及许多其他不在ES5规范中(但可能在ES6中使用)的东西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/