2009-08-25 70 views
1

下面的代码会导致 “不确定” 的lastIndex的:一个奇怪的正则表达式的问题

var a = /cat/g; 
var l = "A test sentence containing cat and dog."; 
var r = a.exec(l); 

document.write(r.lastIndex); 

然而,它完美的r.index(和r.input)。

我正在使用Firefox。有人有线索吗?

编辑:好的,上面的代码在IE中完美工作!此外,在Firefox中,如果不是在第5行调用r.lastIndex,而是调用a.lastIndex,它可以很好地工作。看起来,Firefox不会在结果中返回lastIndex属性 - 而只是为调用exec()的模式设置属性。有趣的是IE设置了两者。

回答

4

这是那些地方微软决定一些东西添加到语言和行为,就好像它应该是有一个。值得庆幸的是,他们现在正在清理他们的行为并记录下这些废话。

要清楚:Firefox根据ECMAScript Language Specification 3rd Edition(PDF,705KB)是正确的。

IE是不是正确;其行为是专有扩展。没有理由相信任何其他浏览器都支持这种特定于IE的行为。这当然不是现在。请参阅JScript Deviations from ES3(PDF,580KB,由Microsoft Corporation的Pratap Lakshman提供)有关此特定偏差的更多信息,请参阅4.6节,其中包括对其他浏览器不支持的测试。

另请注意,这可能甚至在未来不会被IE支持:默认情况下,在IE8-in-IE8模式下,许多专有IE CSS相关机制被禁用,并且JScript的未来实现可能会找到原因类似地禁用该语言的扩展。

4

lastIndexRegExp object的财产。所以,试试这个:

a.lastIndex 
+0

lastIndex的也是)执委会(返回的结果的性质,以及该模式的调用属性exec() – 2009-08-25 09:16:28

+0

@Crimson:不,'lastIndex'不是'exec'返回值的属性:'r.hasOwnProperty(“lastIndex”)'returns * false *。另见https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/RegExp/exec#Description – Gumbo 2009-08-25 09:21:09

0

为了避免所有的怪异,试试这个

var a = /cat/g; 
var l = "A test sentence containing cat and dog."; 
var r = a.exec(l); 
var lastIndex = (r!=null) ? l.indexOf(r[0])+r[0].length : 0; 

它用在这里:http://www.pagecolumn.com/tool/regtest.htm