跨浏览器功能我的意思是在所有5个主流浏览器中实现的功能。 (Beta版本也可以)
这样一个功能的一个例子是JSON对象随着IE8的发布变成了跨浏览器,但直到ECMAScript第5版(9个月后)才被标准化。
既然第5版已经发布,是否还有其他任何跨浏览器功能(因此可以安全使用)但ECMAScript标准没有记录?
答案 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]+
),因此文字08
或09
,应生成{{1} }
但是在我测试的任何实现中都没有发生这种情况,它们被视为DecimalLiteral,(SyntaxError
生成08
)。
Firefox是唯一会向您显示警告的实现:
编辑:目前存在的另一种广泛传播的非标准功能是 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:
if (...) { function f() { ... } }
for (... in ...)
循环的密钥迭代顺序。 ES5仍然没有指定密钥顺序。关于如何为数组指定这一点仍然存在争议,并且浏览器在角落情况下有所不同,但似乎所有人都同意插入顺序。答案 3 :(得分:-1)
可能有,但你无法保证明天会在那里。