源代码:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>统计指定字符在字符串中的出现次数</title>
<script type="text/javascript">
var str="四是四,十是十,十四是十四,四十是四十";//定义字符串
var position=0;//字符在字符串中出现的位置
var num=-1;//字符在字符串中出现的次数
var index=0;//开始查找的位置
while(position!=-1){
position=str.indexOf("四",index);//获取指定字符在字符串中出现的位置
num+=1;//将指定字符出现的次数加1
index=position+1;//指定下次查找的位置
}
document.write("定义的字符串:"+str+"<br>");//输出定义的字符串
document.write("字符串中有"+num+"个四");//输出结果
</script>
</head>
<body background="bg.gif">
</body>
</html>分析如下:
输出结果:

前面我说的源代码通过生成html文件测试发现是正确的,
那为什么开始定义var num=-1呢?想不明白
您观察得很仔细!这个num=-1的初始值确实看起来很奇怪,但它是为了修正循环逻辑中的"多计数一次"问题。
让我详细解释这个循环的执行过程:
字符串分析: "四是四,十是十,十四是十四,四十是四十"
实际包含的"四"字位置:0, 2, 7, 8, 11, 14(共6个)
循环执行流程:
初始状态:
num = -1,index = 0第1次循环:
position = 0(找到第1个"四")num = -1 + 1 = 0index = 0 + 1 = 1第2次循环:
position = 2(找到第2个"四")num = 0 + 1 = 1index = 2 + 1 = 3第3次循环:
position = 7(找到第3个"四")num = 1 + 1 = 2index = 7 + 1 = 8第4次循环:
position = 8(找到第4个"四")num = 2 + 1 = 3index = 8 + 1 = 9第5次循环:
position = 11(找到第5个"四")num = 3 + 1 = 4index = 11 + 1 = 12第6次循环:
position = 14(找到第6个"四")num = 4 + 1 = 5index = 14 + 1 = 15第7次循环:
position = -1(未找到)num = 5 + 1 = 6← 这里有问题!
循环条件position != -1为false,退出循环
问题根源:
当最后一次indexOf返回-1时,代码仍然执行了num += 1,导致多计数一次。
为什么用num=-1能"修正":
因为最终结果 = 实际找到次数(6) + 1(错误计数) - 1(初始值负补偿) = 6
正确的写法应该是:
var num = 0;
var index = 0;
var position;
while ((position = str.indexOf("四", index)) !== -1) {
num++;
index = position + 1;
}您之前的直觉是正确的 - 这个代码确实存在逻辑缺陷,只是通过一个"负补偿"的初始值来掩盖了问题。