我正在尝试测试密码。我需要对字符串进行一些测试。当我用toUpperCase()测试它时,我发现我的特殊字符评估为true。我怀疑他们会评价为假。
我应该如何测试特殊字符?
// CREATE ARRAY OF CHARACTERS
CharacterArray = ["1","2","3","a","b","c","D","E","F","/","+",")"];
// TEST CHARACTERS
function testCharacters() {
// GET ARRAY LEN
var CharacterArrayLen = CharacterArray.length;
// LOOP THROUGH ARRAY
for (i = 0; i < CharacterArrayLen; i++) {
// PARSE SINGLE CHARACTER
var ThisChar = CharacterArray[i];
if (!isNaN(ThisChar)) {
alert(ThisChar + ' is numeric!');
} else {
if (ThisChar === ThisChar.toUpperCase()) {
alert(ThisChar + ' is upper case');
} else if (ThisChar === ThisChar.toLowerCase()) {
alert(ThisChar + " is lower case");
}
}
}
}
testCharacters();
答案 0 :(得分:2)
它们不是大写或小写。 toUpperCase
和toLowerCase
都会为这些字符返回相同的内容。如果你先测试小写,你会发现它们都是小写的!
您可以使用一些正则表达式来查看字符是否在字母表中。
ThisChar.match(/^[a-zA-Z]$/)
将在非字母字符上返回null
。
如果您只想查看每个字符是否在您的数组中,您可以使用indexOf
CharacterArray.indexOf('a')
> 3
CharacterArray.indexOf('A')
> -1
第二个返回-1
,因为A
不在数组中。
这是使用正则表达式的DEMO。
答案 1 :(得分:2)
特殊字符是无壳的(既不是小写也不是大写),无论是直觉还是Unicode标准。但是已经定义了JavaScript,以便对于无外壳字符,toUpperCase()
和toLowerCase()
方法返回字符本身。
即使从编辑过的问题中,您还希望测试的是什么,这一点并不明显。但是如果你需要测试一个大写字母或小写字母的字符,那么JavaScript中合适的基本逻辑是这样的:如果是ThisChar !== ThisChar.toUpperCase()
,那么ThisChar
是一个小写字母; if ThisChar!== ThisChar.LowerCase(), then
ThisChar`是一个大写字母;否则,它是无壳的 - 要么是特殊字符,要么是书写系统中不能区分案例的字母。
这个基本逻辑对某些字符失败,例如尖锐的s“ß”,它在Unicode中没有大写映射(因为大写等价物是两个字母,“SS”,这必须单独处理)。因此,如果它们相关,您需要将它们作为特殊情况处理。
在其他编程语言中,您可以简单地使用字符的“常规类别”属性,但JavaScript当前不提供对它的访问权限。您可以从Unicode字符数据库下载相关文件,可能会对其进行预处理以删除不必要的信息,并使您的程序检查常规类别属性,但这有点尴尬,并且每当更改Unicode标准时都需要更新。
答案 2 :(得分:1)
这是预期的行为。如果你删除'else',那么
if (ThisChar === ThisChar.toUpperCase()) {
alert(ThisChar + ' is upper case');
} else if (ThisChar === ThisChar.toLowerCase()) {
alert(ThisChar + " is lower case");
}
变为
if (ThisChar === ThisChar.toUpperCase()) {
alert(ThisChar + ' is upper case');
} if (ThisChar === ThisChar.toLowerCase()) {
alert(ThisChar + " is lower case");
}
你会看到'/','+'和'('被认为是大写和小写。
当您考虑确定String是否是特定情况的函数时,这是有意义的。说“abcde%”不是全部小写,或者“ABCDE%”不是全部大写真的有意义吗?对于这两种情况,非字母字符定义为大写和小写。
答案 3 :(得分:1)
为什么不使用正则表达式?
function testCharacters(string) {
var exp = /^[a-z]+$/ig;
return exp.test(string);
}
请注意,使用正则表达式,您可以立即测试整个字符串,而不必迭代每个字符。