Capital Vowel:包含变量使得If语句表现得很奇怪

时间:2015-12-01 17:13:03

标签: javascript if-statement

我一直在努力解决一些我遇到资本元音问题的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; 

    }

为什么这会发生在代码中?

感谢您的帮助。

2 个答案:

答案 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;