Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/467.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript For循环在检测到非字母字符时创建无限循环_Javascript_Infinite Loop - Fatal编程技术网

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

Javascript For循环在检测到非字母字符时创建无限循环,javascript,infinite-loop,Javascript,Infinite Loop,在for循环迭代期间,如果在if语句中检测到非字母字符,则i不会递增 如果字符不按字母顺序排列,则非数字函数返回true,否则返回false。当我在for循环中测试代码时,我让控制台打印出I的值。每当代码到达一个非字母字符时,我不会得到递增,因此会创建一个无限for循环 function isUpper(str){ for(i = 0; i < str.length; i++){ if(str.charAt(i) == str.charAt(i).toUpperCase()){

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

如果字符不按字母顺序排列,则非数字函数返回true,否则返回false。当我在for循环中测试代码时,我让控制台打印出I的值。每当代码到达一个非字母字符时,我不会得到递增,因此会创建一个无限for循环

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;
};
函数isUpper(str){
对于(i=0;i

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

我认为是两个因素导致了这个问题:

  • 您将逐个查看字符串中的每个字符,然后返回true或false。如果您的目标是确定字符串是否包含至少一个大写字母,那么首先需要遍历整个字符串。现在,如果您的第一个字符不是大写,它将不会返回true,因此将立即返回false
  • 当您遍历字符串时,会遇到非字母字符,如空格和标点符号。如果您测试“小写”周期是否等于“大写”周期,它的计算结果将为true,这可能会抛出假阳性 解决方案: 我稍微改变了一下函数。现在,它遍历整个字符串,并使用正则表达式(“Regex”)确定所测试的值是否确实是一个字母。如果遇到大写字母,则计数将增加,从而允许代码遍历整个字符串。我们使用逻辑“&&”运算符在最终if函数内部完成两个逻辑检查

    如何改善: 您可以通过在计数增加到0以上时立即返回true来改进此代码,但如果您愿意,我将留给您决定

    EDIT:将第二个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;
    
    }
    
    函数isUpper(str){
    让计数=0;
    for(设i=0;i0){
    返回true;
    }
    }
    返回false;
    }
    

    让我知道这是否有帮助

    我认为是两件事导致了这个问题:

  • 您将逐个查看字符串中的每个字符,然后返回true或false。如果您的目标是确定字符串是否包含至少一个大写字母,那么首先需要遍历整个字符串。现在,如果您的第一个字符不是大写,它将不会返回true,因此将立即返回false
  • 当您遍历字符串时,会遇到非字母字符,如空格和标点符号。如果您测试“小写”周期是否等于“大写”周期,它的计算结果将为true,这可能会抛出假阳性 解决方案: 我稍微改变了一下函数。现在,它遍历整个字符串,并使用正则表达式(“Regex”)确定所测试的值是否确实是一个字母。如果遇到大写字母,则计数将增加,从而允许代码遍历整个字符串。我们使用逻辑“&&”运算符在最终if函数内部完成两个逻辑检查

    如何改善: 您可以通过在计数增加到0以上时立即返回true来改进此代码,但如果您愿意,我将留给您决定

    EDIT:将第二个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;
    
    }
    
    函数isUpper(str){
    让计数=0;
    for(设i=0;i0){
    返回true;
    }
    }
    返回false;
    }
    

    让我知道这是否有帮助

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

    函数isUpper(str){
    返回/^[A-Z\s\W]+$/.test(str);
    }
    log(isUpper('ALL大写'));
    log(isUpper('ALL大写字母!带~@#STUFF');
    log(isUpper('这有一个小写字符');
    
    log(isUpper('这有一个数字')如果要检查整个字符串是否为大写,可以做一些更简单的事情

    函数isUpper(str){
    返回/^[A-Z\s\W]+$/.test(str);
    }
    log(isUpper('ALL大写'));
    log(isUpper('ALL大写字母!带~@#STUFF');
    log(isUpper('这有一个小写字符');
    
    log(isUpper('这有一个数字')我认为你误解了结果。你能说明你是如何得出无限循环正在发生的结论的吗?said for循环中的任何内容都不会阻止
    i
    在不停止循环的情况下递增。循环将运行N次,其中N是str的长度。要生成此inf,您需要以>=计算每个迭代str.length时的迭代速度向字符串添加。为什么
    非数值()
    如果字符不是字母而不是数字,则返回true?我发现您在这里没有使用
    var
    let
    声明
    I
    ;是否可能是
    非数字
    或其他内容正在覆盖您的全局
    i
    变量?也许摆出你的
    非数字
    函数能帮我们解决这个问题。真不敢相信我做了