我一直在努力解决一些我遇到资本元音问题的coderbyte问题。当我在if语句中包含变量“matchTheChar”时,代码给了我一个奇怪的值
function VowelCount(str) {
var results=0;
var str=str.toLowerCase();
var matchTheChar= str.charAt(i);
myRegExp=/[aeiou]/;
for (var i=0; i<str.length; i++){
if (myRegExp.test(matchTheChar)){
results=results+1;
}
}
return results;
}
但是当我删除变量并将“str.charAt(i)”直接包含在if语句中时,代码工作正常。
function VowelCount(str) {
var results=0;
var str=str.toLowerCase();
//var matchTheChar= str.charAt(i);
myRegExp=/[aeiou]/;
for (var i=0; i<str.length; i++){
if (myRegExp.test(str.charAt(i))){
results= results+1;
}
}
return results;
}
为什么这会发生在代码中?
感谢您的帮助。
答案 0 :(得分:2)
在您的第一个代码段中,您只运行str.charAt(i)
一次,此时i
未定义。在你的第二个片段中,你在循环内的每个角色都会调用一次。
答案 1 :(得分:1)
你有你的
var matchTheChar= str.charAt(i);
在之前 ,您将任何值分配给i
,并在循环之外。这意味着它基本上是:
var matchTheChar= str.charAt(undefined);
...会给你第一个字符*。然后你会反复测试循环中的第一个字符,因为你永远不会为matchTheChar
分配新值。
只需在循环中设置matchTheChar
:
function VowelCount(str) {
var results=0;
var str=str.toLowerCase();
var matchTheChar;
myRegExp=/[aeiou]/;
for (var i=0; i<str.length; i++){
matchTheChar= str.charAt(i); // <===
if (myRegExp.test(matchTheChar)){
results=results+1;
}
}
return results;
}
*为什么它会返回第一个字符?因为charAt
通过规范操作ToInteger
传递了它的参数,后者通过ToNumber
将其转换为NaN
,然后将其视为0。
旁注:还有其他一些问题需要解决:
除非您已将某个地方定义为myRegExp
,否则您的代码将成为The Horror of Implicit Globals的牺牲品。请务必在使用之前声明变量。
您收到str
作为参数,因此不应使用var str
将其声明为本地变量。 (这不重要,但它仍然是一个坏主意。)
results=results+1;
很好,但请注意,您也可以使用++results;
或results++;
或results += 1;
。