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.
我认为有几件事导致了这个问题:
- 您正在逐一查看字符串中的每个字符,然后 return判断真假。如果您的目标是确定字符串是否包含至少一个大写字母,那么您首先需要遍历整个字符串。现在,如果您的第一个字符不是大写字母,它就不会 return true,因此会立即 return false。
- 当您遍历字符串时,您会遇到非字母字符,例如空格和标点符号。如果您测试 "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'));
在 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.
我认为有几件事导致了这个问题:
- 您正在逐一查看字符串中的每个字符,然后 return判断真假。如果您的目标是确定字符串是否包含至少一个大写字母,那么您首先需要遍历整个字符串。现在,如果您的第一个字符不是大写字母,它就不会 return true,因此会立即 return false。
- 当您遍历字符串时,您会遇到非字母字符,例如空格和标点符号。如果您测试 "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'));