是否有ECMAScript标准未记录的跨浏览器JavaScript功能?

时间:2010-11-08 16:03:52

标签: javascript cross-browser

跨浏览器功能我的意思是在所有5个主流浏览器中实现的功能。 (Beta版本也可以)

这样一个功能的一个例子是JSON对象随着IE8的发布变成了跨浏览器,但直到ECMAScript第5版(9个月后)才被标准化。

既然第5版已经发布,是否还有其他任何跨浏览器功能(因此可以安全使用)但ECMAScript标准没有记录?

4 个答案:

答案 0 :(得分:3)

类似于JSON对象示例的内容是Array.prototype方法。

很多浏览器供应商在ES5之前很长时间实现了它们,例如Mozilla,从2005年9月开始为它的JavaScript (tm) 1.6版本实现它们

ES3-ES5间隙之间的其他因素 - 直到ES5-才描述:

  • 不在for (var prop in null)undefined上,在ES3中TypeError应该发生
  • 不在FunctionDeclarations块内部,例如:

     { function foo () {} }
    

    FunctionDeclarations允许在Program级别(任何事物之外的全局代码)或函数的FunctionBody级别内,块只能包含语句。

  • 使用LineContinuations的字符串,例如:

    var s = 'foo \
    bar'; // 'foo bar'
    

存在其他有趣的事情,例如 not-very octal numbers ,例如:

var n = 08;

在任何版本的ECMAScript标准中,上述NumericLiteral 无效

DecimalLiteral语法不允许文字以0开头(0文字除外)并指定OctalIntegerLiterals的语法取0,然后从0到7的数字(仅0[0-7]+),因此文字0809生成{{1} }

但是在我测试的任何实现中都没有发生这种情况,它们被视为DecimalLiteral,(SyntaxError生成08)。

Firefox是唯一会向您显示警告的实现:

08 warning

编辑:目前存在的另一种广泛传播的非标准功能是 Callable RegExps

此功能是Mozilla在很久以前推出的,后来由WebKit JSC,V8和Opera JS引擎克隆。

基本上你可以调用RegExp对象,就像它们是函数一样,只是语法糖 8方法的别名:

RegExp.prototype.exec

此功能完全不标准,因为ES3和ES5不允许在var re = /foo/; re('foobar'); // ["foo"], just an alias for: re.exec('foobar'); // ["foo"] 个实例上定义[[Call]],因为它们的内部方法和语义已完全指定。

由于在这些实现中RegExp个对象实现了RegExp内部方法,因此[[Call]]运算符将它们识别为函数:

typeof

答案 1 :(得分:0)

在某些方面,ECMAScript标准是股票分析师称之为尾随指标的标准。也就是说,它们反映了已经发生的事情,而不是应该发生的事情。从某种意义上说,这是一件好事。正如你自己可能已经意识到的那样,世界上所有的计划都无法让你为意外做好准备。在我们发现需要它之前,我们不知道我们需要JSON,所以我们不得不发明它。一旦它被发明和使用,流行有用,各种浏览器制造商都选择支持它。甚至是微软。

好的,足够的肥皂盒。实际上,在有限的时间和资源的情况下,你必须意识到制定标准并不断在现在支持的内容,现在支持的内容,不太可能支持的内容和内容之间进行权衡。该死的风险很大。你必须要小心。有许多天上掉馅饼的好主意从未幸存下来。见证Netscape和其他人使用的“层”概念。支持innerText是否有意义?你最终打电话,你最终必须成为打电话的人。

答案 2 :(得分:0)

Getters和setter几乎统一实施(不在IE中),但没有在ES3中编写,最近在ES5中实现了标准化。

仍然没有参加ES5:

  1. 声明除程序或函数顶级以外的函数的能力。例如。 if (...) { function f() { ... } }
  2. for (... in ...)循环的密钥迭代顺序。 ES5仍然没有指定密钥顺序。关于如何为数组指定这一点仍然存在争议,并且浏览器在角落情况下有所不同,但似乎所有人都同意插入顺序。
  3. 能够在正则表达式中转义任意字符。 ES3& ES5语法禁止像/ \ $ /这样的正则表达式(因为它是一个IdentifierPart),但它适用于所有主要的解释器。
  4. 能够让来自多个JavaScript上下文(框架)的对象进行交互。没有ES规范说明当有多个JavaScript上下文时,应该发生什么,每个上下文都有自己的Object.prototype版本和其他内在函数。

答案 3 :(得分:-1)

可能有,但你无法保证明天会在那里。