For循环检测到非字母字符时会创建一个无限循环

时间:2019-10-17 20:31:09

标签: javascript infinite-loop

如果在if语句中检测到非字母字符,则在for循环迭代期间,i不会递增。

如果字符不是字母,则非数字函数返回true,否则返回false。当我测试for循环内的代码时,我让控制台打印了i的值。每当代码到达非字母字符时,我都不会递增,因此会创建一个无限for循环。

__init__.py

如果字符串中有大写字符,我希望它返回true。如果字符串中没有大写字符,我希望它返回false。

2 个答案:

答案 0 :(得分:1)

结合我认为引起问题的事物:

  1. 您正在分别浏览字符串中的每个字符,然后返回true或false。如果您的目标是确定字符串是否至少包含一个大写字母,则首先需要遍历整个字符串。现在,如果您的第一个字符不是大写字母,则不会返回true,因此会立即返回false。
  2. 遍历字符串时,您会遇到非字母字符,例如空格和标点符号。如果测试“小写”时间段是否等于“大写”时间段,它将评估为true,这可能会导致误报。

解决方案: 我对功能做了一点改动。现在,它遍历整个字符串,并使用正则表达式(“ Regex”)来确定所测试的值是否确实是字母。如果遇到大写字母,则计数会增加,从而使代码可以遍历整个字符串。我们使用逻辑“ &&”运算符在最终的if函数内部完成两个逻辑检查。

如何改进: 您可以通过在计数增加到0以上时立即返回true来使此代码更好,但是如果您愿意,我会把它留给您。

编辑:将第二个If语句移到for循环中,以便一旦满足条件,它就返回true,而不必在检查之前遍历整个字符串。

function isUpper(str) {
  let count = 0;

  for (let i = 0; i < str.length; i++) {
    if (/[a-zA-Z]/.test(str.charAt(i)) && str.charAt(i) == str.charAt(i).toUpperCase()) {
      count += 1;
    }

    if (count > 0) {
      return true;
    }
  }

  return false;

}

让我知道这是否有帮助!

答案 1 :(得分:1)

如果您要检查整个字符串是否为大写,则可以做得简单得多。

function isUpper(str) {
  return /^[A-Z\s\W]+$/.test(str);
}

console.log(isUpper('ALL UPPER CASE'));
console.log(isUpper('ALL UPPER CASE! WITH ~@# STUFF'));
console.log(isUpper('THIS hAS ONE LOWER CASE CHARACTER'));
console.log(isUpper('THIS HAS 1 NUMBER'));

说明

正则表达式检查从开始(^)到结束($)的整个字符串是否与[]内的字符匹配,该字符范围从大写A到大写Z(A-Z,特殊的“空格”字符\s和其他非单词字符\W,匹配一次或多次。您可以对其进行微调以确保其匹配至少一个大写字母,然后可选地跟空格,逗号,感叹号等。所有这些都取决于您的用例以及预期的输入vs.输出

编辑

没有阅读代码下的最后一句话。如果您只想检查字符串中某处的大写字符,则只需

function isUpper(str) {
  return /[A-Z]/.test(str)
}

console.log(isUpper('ALL UPPER CASE'));
console.log(isUpper('ALL UPPER CASE! WITH ~@# STUFF'));
console.log(isUpper('THIS hAS ONE LOWER CASE CHARACTER'));
console.log(isUpper('THIS HAS 1 NUMBER'));
console.log(isUpper('this has no uppercase characters at all'));