未捕获的类型错误:无法读取未定义的属性“toUpperCase”

Posted

技术标签:

【中文标题】未捕获的类型错误:无法读取未定义的属性“toUpperCase”【英文标题】:Uncaught TypeError: Cannot read property 'toUpperCase' of undefined 【发布时间】:2016-06-09 05:05:06 【问题描述】:

我正在尝试将两个字符串转换为相同的格式,例如 toUpperCase/toLowerCase 以比较两个字符串,而不管 javascript 中是否区分大小写。下面是我的函数。

    function submitForm() 

    var usernames=['one','two','Test'];
    var cpusername = "test";
            var flag = 0;

   if (cpusername !== "")
                
    for (var k = 0; k < usernames.length; k++)
                
        var upperCasecpusername=cpusername.toUpperCase();
        var getusername= usernames[k];
        var upperCaseusername=getusername.toUpperCase();

                    if (upperCasecpusername === upperCaseusername)
                    
                        flag=1;
     console.log(flag);
            //document.getElementById('cpusername').value = '';
                $.messager.alert("Message", "Someone already has username"+cpusername+". Try another!!", '');                    


                    
                
                

我收到此错误 Uncaught TypeError: Cannot read property 'toUpperCase' of undefined 。我也尝试先转换 toString() 然后再转换为 toLowercase() 。这也是错误的(t​​oString() undefined)。也建议我是否有任何其他方法来比较两个字符串,而不管区分大小写。谢谢!

【问题讨论】:

您的 if 条件 k &lt;= usernames.length; 将使其超出数组边界。数组的索引为 0,因此数组的最后一个索引将是 Array length-1 你的代码中toUpperCase在哪里? Javascript array undefined in for loop的可能重复 @PatrickEvans 我已经修改了代码。仍然面临同样的问题 您的代码在编辑时工作正常,不会引发错误。 JSFiddle demo 【参考方案1】:

试试这个:

var getusername= ""+usernames[k];

如果这不起作用,那么这可能是问题所在:

开关

for (var k = 0; k <= usernames.length; k++)

for (var k = 0; k <= usernames.length-1; k++)

【讨论】:

谢谢伙计。它确实有效。但为什么 toUpperCase 不适用于数组。有什么想法吗? 甚至for (var k = 0; k &lt; usernames.length; k++) 您尝试过我的第一个建议吗?这应该使.toUpperCase 工作。如果不是,那我真的不知道错误可能是什么。 @EthanJCRubik 是的,您的第一个建议效果很好。这使得大写字母起作用。我的问题是为什么它不像 java 那样直接转换为大写。 不要使用第一个建议,因为它会将undefined 值转换为字符串"undefined",虽然它会阻止错误被抛出,但它会给人一种错误的印象,即您正在循环使用&lt;= usernames.length 时正确覆盖您的数组【参考方案2】:

试试这个

js 代码

jQuery( document ).ready(function() 

    var usernames=['one','two','Test'];
    var cpusername = "test";
            var flag = 0;

   if (cpusername !== "")
                
    for (var k = 0; k < usernames.length; k++)
     
        var upperCasecpusername=cpusername.toLowerCase();
        var getusername= usernames[k];
        console.log(getusername);
        var upperCaseusername=getusername.toLowerCase();

            if (upperCasecpusername === upperCaseusername)
           
                    console.log(upperCasecpusername);
                    console.log(upperCaseusername);
                        flag=1;
                     console.log(flag);
            //document.getElementById('cpusername').value = '';
                alert( "Someone already has username"+cpusername+". Try another!!", '');                    


             
       
    
);

您可以查看demo here

【讨论】:

【参考方案3】:

使用函数.toLowerCase().toUpperCase() 很好,但是根据其他方式对字符串不区分大小写比较的要求,我建议使用regex。 尝试类似这样的不区分大小写的字符串比较

var str= "TEST";
var result = str.match(/test/i);
if(result)
// Write logic once the match found

【讨论】:

以上是关于未捕获的类型错误:无法读取未定义的属性“toUpperCase”的主要内容,如果未能解决你的问题,请参考以下文章

未捕获的类型错误:无法读取未定义的属性 toLowerCase

JQuery:未捕获的类型错误:无法读取未定义的属性“调用”

NextJS:未捕获的类型错误:无法读取未定义的属性(读取“属性”)

未捕获的类型错误:无法读取文本字段上未定义错误的属性“toLowerCase”

为啥我会收到“未捕获的类型错误:无法读取未定义的属性 'body'”?

反应和流星“未捕获的类型错误:无法读取未定义的属性'createElement'”