2011-03-30 22 views
15

我应该编写一个带有字符的函数(即长度为1的字符串),如果是元音则返回true,否则返回false。我想出了两个功能,但不知道哪一个功能更好,哪种方式更适合我。使用RegEx的方式更简单,但我不确定是否应该尽量避免使用RegEx?如何检查JavaScript中的元音?

我没有正则表达式的尝试:

function isVowel(char) 
{ 
    if (char.length == 1) 
    { 
    var vowels = new Array('a','e','i','o','u'); 
    var isVowel = false; 

    for(e in vowels) 
    { 
     if(vowels[e] == char) 
     { 
     isVowel = true; 
     } 
    } 

    return isVowel; 
    } 
} 

用正则表达式:

function isVowelRegEx(char) 
{ 
    if (char.length == 1) 
    { 
    return /[aeiou]/.test(char); 
    } 
} 
+2

只是出于好奇 - 如果字符串长度不是1,你的函数应该返回什么? – 2011-03-30 14:57:42

+2

[基准](http://jsperf.com/regex-vs-for-loop) – Raynos 2011-03-30 15:00:21

+3

我不确定上下文是什么,但是在处理不同的语言时会遇到问题。你会如何以Zoë这个名字来对待字母“ë”?即使它自己存在,它仍然是一个元音。 你能提供更多信息吗? – T9b 2011-03-30 15:02:24

回答

1
function isVowel(char) 
{ 
    if (char.length == 1) 
    { 
    var vowels = "aeiou"; 
    var isVowel = vowels.indexOf(char) >= 0 ? true : false; 

    return isVowel; 
    } 
} 

基本上它检查元音的字符串中的字符的索引。如果是辅音,而不是字符串,indexOf将返回-1。

+0

如果'char.length!= 1'会怎么样? – 2011-03-30 15:03:13

+0

@ TheEliteGentleman然后undefined'返回 – Raynos 2011-03-30 15:04:22

+0

@Raynos,有人可能会说,是否有必要返回undefined? – 2011-03-30 15:07:03

35

benchmark

我觉得你可以有把握地说一个for循环更快。

我的确承认正则表达式在代码方面看起来更干净。如果它是一个真正的瓶颈,然后使用一个for循环,否则正则表达式坚持的“优雅”的原因

如果你想要去的简单就用

function isVowel(c) { 
    return ['a', 'e', 'i', 'o', 'u'].indexOf(c.toLowerCase()) !== -1 
} 
+1

indexOf()是最快的。顺便说一句,酷基准测试网站! – Max 2011-03-30 15:11:58

+0

@Max有趣的是如何在字符串上优化Firefox的索引。 – Raynos 2011-03-30 15:13:40

+1

[这很快,只要有一个明确的if语句来检查char ==='a'||就快得多了。 char ==='e'' etc](http://jsperf.com/regex-vs-for-loop/2) - whoa除非不在Firefox! – Pointy 2011-03-30 15:18:54

2

个人而言,我把它定义这种方式:

function isVowel(chr){ return 'aeiou'.indexOf(chr[0].toLowerCase()) !== -1 } 

你也可以使用['a','e','i','o','u']并跳过长度测试,但你要创建一个阵列中的每个调用该函数的时间。 (有通过关闭模仿这种方式,但那些都有点晦涩阅读)

+1

正则表达式更好,不会慢得多'/ [aeiou] /。text(chr.toLowerCase())' – Raynos 2011-03-30 15:05:30

1

这是一个粗略的正则表达式的功能,我会拿出(这是未经测试)

function isVowel(char) { 
    return /^[aeiou]$/.test(char.toLowerCase()); 
} 

这意味着,if (char.length == 1 && 'aeiou' is contained in char.toLowerCase()) then return true

6

周期,数组,正则表达式...为什么?它可以更快:)

function isVowel(char) 
{ 
    return char === 'a' || char === 'e' || char === 'i' || char === 'o' || char === 'u' || false; 
} 
+0

如果char是一个字符串,这将会中断。 – 2011-03-30 15:21:22

+0

它会返回假如果char.length> 1,我认为这是正确 – Emmerman 2011-03-30 15:24:07

+0

...和超快:) – Max 2011-03-30 15:24:51

10

答案在这里的失落,速度无关这样的小功能,除非你是在很短的时间段打电话给他们几十万次。对我来说,正则表达式是最好的,但把它放在一个封闭,所以你不要每次都建立它:

简易版:

function vowelTest(s) { 
    return (/^[aeiou]$/i).test(s); 
} 

更高效的版本:

var vowelTest = (function() { 
    var re = /^[aeiou]$/i; 
    return function(s) { 
    return re.test(s); 
    } 
})(); 

如果s是单个元音(大写或小写),则返回true;如果s是其他所有元素,则返回false

+0

您能否详细说明更高效的版本?我运行它,它就像简单的版本一样工作,但(1)为什么它被认为更有效率? (2)最外括号表示什么?在第一次看,我会说,这是一个函数,返回一个函数(封闭(?)函数(S))。做外(...)()改变什么? – thetrystero 2014-05-19 03:42:58

+0

我认为它更有效率,因为正则表达式只创建一次,并且每次都重复使用而不是创建。封闭的“()”将函数声明转换为函数表达式,因此名称可以省略。它也可以用'!'开始,但是分组也具有“所有这些都属于”的语义,而“!”似乎在说“不是......”。尾随的“()”导致函数被调用,并且可以在关闭“)”的内部或外部,许多人更喜欢内部(语义再次)。 – RobG 2014-05-19 03:55:23

0
​​

基本上它返回给定字符串中的所有元音。