0

我正在尝试测试密码。我需要对字符串进行一些测试。当我使用 toUpperCase() 测试我的特殊字符时,我发现它们的评估结果为真。我怀疑他们会评估为假。

我应该如何测试特殊字符?

// 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();
4

4 回答 4

2

根据直觉和 Unicode 标准,特殊字符是无大小写的(既不是小写也不是大写)。但是 JavaScript 已被定义为对于无大小写字符,toUpperCase()andtoLowerCase()方法返回字符本身。

即使从已编辑的问题中也不清楚您到底想测试什么。但是如果你需要测试一个字符是大写字母还是小写字母,那么 JavaScript 中合适的基本逻辑是这样的: if ThisChar !== ThisChar.toUpperCase(), thenThisChar是小写字母;if ThisChar !== ThisChar.LowerCase() , thenThisChar`是大写字母;否则,它是不区分大小写的——要么是特殊字符,要么是书写系统中不区分大小写的字母。

对于某些字符,这个基本逻辑是失败的,例如尖 s “ß”,它在 Unicode 中没有大写映射(因为大写等效是两个字母,“SS”,这必须单独处理)。因此,如果它们相关,您需要将它们作为特殊情况处理。

在其他编程语言中,您可以简单地使用字符的 General Category 属性,但 JavaScript 当前无法访问它。您可以从 Unicode 字符数据库下载相关文件,可能对其进行预处理以删除不必要的信息,并让您的程序检查 General Category 属性,但这会有些尴尬,并且在 Unicode 标准更改时需要更新。

于 2012-06-21T05:13:39.520 回答
2

它们不是大写或小写。两者都toUpperCasetoLowerCase这些角色返回相同的东西。如果您先测试小写字母,您会发现它们都是小写字母!

您可以使用一些正则表达式来查看字符是否在字母表中。

ThisChar.match(/^[a-zA-Z]$/)

将返回null非字母字符。

如果您只是想查看这些字符中的每一个是否都在您的数组中,您可以使用indexOf

CharacterArray.indexOf('a')
> 3
CharacterArray.indexOf('A')
> -1

第二个返回-1,因为A不在数组中。

这是一个使用正则表达式的演示

于 2012-06-20T20:42:37.933 回答
1

这是预期的行为。如果您删除“其他”,那么

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");
}

你会看到'/'、'+'和'('被认为是大写和小写。

当您考虑确定字符串是否全部为特定情况的函数时,这是有道理的。说“abcde%”不全是小写,或者“ABCDE%”不全是大写真的有意义吗?对于这两种情况,非字母字符被定义为大写和小写。

于 2012-06-20T20:43:11.117 回答
1

为什么不使用正则表达式?

function testCharacters(string) {
    var exp = /^[a-z]+$/ig;
    return exp.test(string);
}

请注意,使用正则表达式,您可以一次测试整个字符串,而不必迭代每个字符。

于 2012-06-20T20:43:41.897 回答