日期:2014-05-16  浏览次数:20575 次

发现js的test方法两次执行返回不同结果。高手说说这个是什么原因。
<script   type= "text/javascript ">
<!--
var   re   =   /^\d+(?:\.\d)?$/ig;      

alert(re.test( '112.3 '));
alert(re.test( '112.3 '));

//-->
</script>
结果:true   false

这个test方法太BT了,搞了我一上午,现在用search代替了,但始终不明白为什么?各位兄弟知道的,给兄弟指点下。

------解决方案--------------------
test 方法
返回一个 Boolean 值,它指出在被查找的字符串中是否存在模式。

rgexp.test(str)

参数
rgexp

必选项。包含正则表达式模式或可用标志的正则表达式对象。

str

必选项。要在其上测试查找的字符串。

说明
test 方法检查在字符串中是否存在一个模式,如果存在则返回 true,否则就返回 false。

全局 RegExp 对象的属性不由 test 方法来修改。

示例
下面的例子举例说明了 test 方法的用法:

function TestDemo(re, s){
var s1; // 声明变量。
// 检查字符串是否存在正则表达式。
if (re.test(s)) // 测试是否存在。
s1 = " contains "; // s 包含模式。
else
s1 = " does not contain "; // s 不包含模式。
return( " ' " + s + " ' " + s1 + " ' "+ re.source + " ' "); // 返回字符串。
}

------解决方案--------------------
是/g的原因
------解决方案--------------------
<script type= "text/javascript ">
<!--
var re = /^\d+(?:\.\d)?$/ig;

alert(re.lastIndex );
alert(re.test( '112.3 '));
alert(re.lastIndex );
alert(re.test( '112.3 '));

//-->
</script>


lastIndex Property
This property is an integer that specifies the index at which to start the next match, but is only set if the regular expression uses the 'g ' flag to specify a global search.

Syntax: object.lastIndex
------解决方案--------------------
test会修改lastIndex的值
第一次匹配后lastIndex在字符串末尾,就是字符串的长度了

第二次从末尾这个位置这个匹配肯定找到到了
<script type= "text/javascript ">
<!--
var re = /^\d+(?:\.\d)?$/ig;

alert(re.test( '112.3 '));
re.lastIndex=0;//加这句试试
alert(re.test( '112.3 '));

//-->
</script>