长问题
首先,我知道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标准。
答案 0 :(得分:5)
EMCAScript标准的实现不仅仅是使规范规则生动的代码。 ECMAScript标准故意不完整:
支持ECMAScript的每个Web浏览器和服务器都提供自己的主机环境,完成ECMAScript执行环境。
ECMAScript实现必须提供“主机环境”。对于Web浏览器,该主机环境包括DOM操作API和W3C和WHATWG指定的其他API。 ECMAScript没有指定这些API的行为(实际上,存在)。
用于完成实现的“主机环境”的对象称为“主机对象”。主机对象不一定遵循正常的对象规则:它们可能会为在本机(非主机)对象上有效的属性访问引发错误,或者它们可能允许本机禁止的某些操作。
JScript和JavaScript可能以不同方式实现其DOM API。哪些实现在某些特定点上是“正确的”不是ECMAScript合规性的问题,而是符合W3C标准的问题。即使DOM对象似乎表现出一些与“正常”ECMAScript行为相反的行为(如instanceof
错误示例),根据section 8.6.2,它仍然是合法的ECMAScript:
主机对象可以支持具有任何依赖于实现的行为的这些内部属性,只要它与本文档中声明的特定主机对象限制一致。
“内部属性”在这里包括逻辑操作,例如“按名称获取对象属性的值”,编号为[[Get]]
。主机对象的自定义[[Get]]
实现可能会抛出错误,或忽略先前设置的属性。
API差异与实际的语言差异不同。 语言差异表明支持的词汇语法或本机(非主机)对象的行为存在差异。实际语言的一些差异包括:
cc_on
条评论
yield
关键字和生成器,以及一些不在ES5规范中的其他内容(但可能会在ES6中)所有浏览器都支持块中的函数声明,这不是合法的ECMAScript语法:
function foo() {
bar();
if(condition) {
function bar() { } // this is not legal
}
}
支持此功能的浏览器(即所有'em)正在扩展ECMAScript语言。此外,在该示例中,JScript将hoist bar
,而Mozilla的JavaScript则不会。这是因为两个浏览器以不兼容的方式扩展了ECMAScript语言。
答案 1 :(得分:0)
从here,您可以下载包含处理标准(3/5)和Microsoft扩展程序的文档(MS-ES[35](EX)?.pdf)
的.pdf .pd文件。