For 循环在检测到非字母字符时创建无限循环

For Loop Creates An Infinite Loop When It Detects A Non-Alphabetical Character

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

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

function isUpper(str){
  for(i = 0; i < str.length; i++){
    if(str.charAt(i) == str.charAt(i).toUpperCase()){
      if(!nonnumeric(str.charAt(i))){
        return true;
      };
    };
  };
  return false;
};

如果字符串中有大写字符,我希望它 return 为真。如果字符串中没有大写字符,我希望它是 return false.

我认为有几件事导致了这个问题:

  1. 您正在逐一查看字符串中的每个字符,然后 return判断真假。如果您的目标是确定字符串是否包含至少一个大写字母,那么您首先需要遍历整个字符串。现在,如果您的第一个字符不是大写字母,它就不会 return true,因此会立即 return false。
  2. 当您遍历字符串时,您会遇到非字母字符,例如空格和标点符号。如果您测试 "lower case" 句点是否等于 "upper case" 句点,它将计算为真,这可能会引发误报。

解决方法: 我稍微改变了这个功能。现在,它遍历整个字符串并使用正则表达式 ("Regex") 来确定被测试的值是否确实是一个字母。如果它遇到一个大写字母,计数就会增加,从而允许代码遍历整个字符串。我们使用逻辑“&&”运算符在我们的最终 if 函数中完成两个逻辑检查。

如何改进: 一旦计数增加到 0 以上,您可以通过 return 为 true 来改进此代码,但如果您愿意,我会把它留给您。

编辑:将第二个 If 语句移到 for 循环中,以便在满足条件时立即 return 为真,而不必在检查之前循环遍历整个字符串。

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;

}

如果有帮助请告诉我!

如果您要检查整个字符串是否为大写,您可以做一些更简单的事情。

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,特殊"space"字符\s,和其他非单词字符\W,匹配一次或多次。你可以微调这个使确保它至少匹配一个大写字母,后跟可选的空格、逗号、感叹号等。这完全取决于您的用例以及预期的输入与输出是什么

编辑

代码下的最后一句没看懂。如果您只想检查字符串中某处的大写字符,您可以简单地使用

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'));