Jas*_*ols 3 javascript ecmascript-5 jscript
长问题
首先,我知道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;
Run Code Online (Sandbox Code Playgroud)
在JScript的实现方面存在差异,理论上不符合ECMA标准。
EMCAScript标准的实现不仅仅是使规范规则生效的代码。ECMAScript标准是故意不完整的:
每个支持ECMAScript的Web浏览器和服务器都提供自己的主机环境,从而完成ECMAScript执行环境。
ECMAScript实现必须提供“主机环境”。对于Web浏览器,该主机环境包括DOM操作API和W3C和WHATWG指定的其他API。ECMAScript没有指定这些API 的行为(实际上是存在)。
用于完成实现的“主机环境”的对象称为“主机对象”。宿主对象不一定要遵循正常的对象规则:它们可能会引发对本机(非宿主)对象有效的属性访问错误,或者它们可能允许某些本来不允许的操作。
JScript和JavaScript可能会以不同的方式实现其DOM API。在某些特定点上哪种实现是“正确的”与ECMAScript遵从性无关,而与W3C标准遵从性无关。即使DOM对象似乎表现出某些与“正常” ECMAScript行为相反的行为(例如您的instanceof
错误示例),根据8.6.2节,它仍然是合法的ECMAScript :
主机对象可以通过任何与实现有关的行为来支持这些内部属性,只要它与本文档中所述的特定主机对象限制一致即可。
这里的“内部属性”包括诸如“按名称获取对象属性的值”之类的逻辑操作[[Get]]
。宿主对象的自定义[[Get]]
实现可能会引发错误,或者忽略先前设置的属性。
API差异与实际语言差异是不同的。一个语言差异表明无论是在支持词法或本机(非主机)对象的行为差异。实际语言中的一些差异包括:
cc_on
引起条件编译的注释yield
关键字,生成器,以及一堆其他不在ES5规范中的东西(但可能会在ES6中使用)所有浏览器都支持块中的函数声明,这不是合法的ECMAScript语法:
function foo() {
bar();
if(condition) {
function bar() { } // this is not legal
}
}
Run Code Online (Sandbox Code Playgroud)
支持此功能的浏览器(即所有'em)正在扩展ECMAScript语言。同样,在该示例中,JScript将吊起 bar
,而Mozilla的JavaScript将不会吊起。这是因为两个浏览器以不兼容的方式扩展了ECMAScript语言。
归档时间: |
|
查看次数: |
464 次 |
最近记录: |