如何在 JavaScript 中检查元音?

IT技术 javascript regex
2021-03-16 17:56:35

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

没有正则表达式:

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);
  }
}
6个回答

基准

我认为您可以安全地说 for 循环更快。

我承认正则表达式在代码方面看起来更清晰。如果这是一个真正的瓶颈,则使用 for 循环,否则出于“优雅”的原因坚持使用正则表达式

如果你想要简单,那么只需使用

function isVowel(c) {
    return ['a', 'e', 'i', 'o', 'u'].indexOf(c.toLowerCase()) !== -1
}
@Max 有趣的是 Firefox 如何优化字符串的索引。
2021-04-27 17:56:35
在 Firefox 4 中 indexOf() 是最快的。顺便说一句,很酷的测试基准站点!!
2021-05-03 17:56:35
我知道了。它有时是正则表达式的两倍。有趣的!:)
2021-05-15 17:56:35
@Pointy 仅在曲轴中。字符串索引在 jagermonkey 中进行了更优化,在 IE8 中索引和表达式是颈部和颈部。Tbh 在此级别上针对特定 javascript 引擎进行优化。坚持使用简短、可读和可维护的内容。硝基也喜欢指数。不过我周围没有carakan可以测试。
2021-05-18 17:56:35

有很多可用的答案,速度与这些小功能无关,除非您在短时间内调用它们几十万次。对我来说,正则表达式是最好的,但是把它放在一个闭包中,这样你就不会每次都构建它:

简单版:

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

更高效的版本:

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

返回trueifs是单个元音(大写或小写)和false其他所有内容。

我认为它更有效,因为正则表达式创建一次并重用,而不是每次都创建。封闭的“()”将函数声明转换为函数表达式,因此可以省略名称。它也可以开始!但分组也有语义说“所有这些都属于一起”而“!” 似乎在说“不是什么……”。尾随的“()”导致函数被调用并且可以在关闭的“)”内部或外部,许多人更喜欢在内部(再次语义)。
2021-04-26 17:56:35
你开始说速度无关紧要,为什么使用闭包会被认为是一个重要的优化?
2021-05-08 17:56:35
你能详细说明更有效的版本吗?我运行了它,它的工作原理与简单版本一样,但是 (1) 为什么它被认为更有效?(2)最外面的括号是什么意思?乍一看,我会说这是一个返回函数的函数(闭包(?)函数)。外部 (...)() 会改变什么吗?
2021-05-10 17:56:35
@JoséSalgado,因为有时速度的确事。:-)
2021-05-12 17:56:35

循环、数组、正则表达式……为了什么?它可以更快:)

function isVowel(char)
{
    return char === 'a' || char === 'e' || char === 'i' || char === 'o' || char === 'u' || false;
}
@Emmerman 这是一个正确的简单解决方案。这很有趣:)
2021-04-22 17:56:35
String.prototype.index在 Firefox 中比这个更快。这也很丑。
2021-05-13 17:56:35
如果 char.length > 1 它将返回 false 并且我认为这是正确的
2021-05-14 17:56:35
@Raynos 不像周期那么难看(对于这个问题):) 是的,也许索引更快。我发布这个只是为了好玩和另一个解决方案。
2021-05-17 17:56:35
如果 char 是字符串,这将中断。
2021-05-19 17:56:35
function findVowels(str) {
  return str.match(/[aeiou]/ig);
}

findVowels('abracadabra'); // 'aaaaa'

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

这是我想出的一个粗略的 RegExp 函数(未经测试)

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

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