我的forEach功能不起作用

时间:2015-08-10 15:39:38

标签: javascript

这个javascript代码应该接受一个字符串并返回数组中元音的数量,但是当我运行它时,我得到一条消息,我的s.split不是一个函数。有谁知道我做错了什么?

function countVowels(s){
    var vowels = /[aeiou]/i;
    var count = 0
    var array = s.split('');

    array.forEach(function(v){
        if(v == vowels)
            count++;
    })
    return count;   
}

2 个答案:

答案 0 :(得分:1)

  

我收到一条消息,说我的s.split不是函数。

请参阅String.prototype.split()

  

split()方法通过将字符串分隔为子字符串,将 String 对象拆分为字符串数组。

因此,如果param不是字符串类型(如'abcdef'),它会让你遇到这个问题。

v === vowels是正则表达式时,您不应该使用vowels。当您使用===时,您试图比较vvowels是否是同一个对象。有关详细信息,请参阅Equality comparisons and sameness

请参阅RegExp.prototype.test()

  

只要您想知道字符串中是否找到模式,请使用test()

function countVowels(s) {
    var vowels = /[aeiou]/i;
    var count = 0;
    var array = s.split('');

    array.forEach(function(v) {
        if (vowels.test(v)) {
            count++;
        }
    });

    return count;
}

console.log(countVowels('abcdefg'));

答案 1 :(得分:0)

最重要的是:s必须是字符串,否则s.split将不存在。

此外,正如其他人所说,您的测试将无效,因为v == vowels会尝试将字符串等同于正则表达式。您想要使用RegExp.prototype.test()方法:

if(vowels.test(v)) { ... }

最后,有一种更简洁的方法来计算字符串中的元音。您可以使用String.prototype.match()返回所有匹配项并使用该数组的长度:

function countVowels(str) {
  return str.match(/[aeiou]/gi).length;
}