Javascript 将每个单词的第一个字母大写

Javascript 将每个单词的第一个字母大写,javascript,string,Javascript,String,在if语句之后,并注释掉其余语句,它将打印“e”,这样它就可以像应该的那样识别字符(i+1)。。。我只是无法将第二个单词的第一个字母大写。您的代码示例有两个问题。我会逐一检查 字符串是不可变的 这不是你想象的那样: console.log(finalName.charAt(i+1)); 您需要将其更改为: finalName.replace(finalName.charAt(i+1), finalName.charAt(i+1).toUpperCase()); 在JavaScript中,字符

在if语句之后,并注释掉其余语句,它将打印“e”,这样它就可以像应该的那样识别字符(i+1)。。。我只是无法将第二个单词的第一个字母大写。

您的代码示例有两个问题。我会逐一检查

字符串是不可变的

这不是你想象的那样:

console.log(finalName.charAt(i+1));
您需要将其更改为:

finalName.replace(finalName.charAt(i+1), finalName.charAt(i+1).toUpperCase());
在JavaScript中,字符串是不可变的。这意味着一旦创建了字符串,就不能对其进行更改。这听起来可能很奇怪,因为在代码中,似乎您正在使用
replace()
等方法在整个循环中更改字符串
finalName

但实际上,你并没有真正改变它!
replace()
函数接受一个输入字符串,进行替换,并生成一个新的输出字符串,因为实际上不允许它更改输入字符串(不变性)。因此,tl;dr,如果您没有通过将
replace()
的输出赋给变量来捕获该输出,则替换的字符串将丢失

顺便说一句,可以将其分配回原始变量名,这就是为什么可以执行
finalName=finalName.replace(…)


替换是贪婪的

您将遇到的另一个问题是,当您使用
replace()
时,您将替换字符串中的所有匹配字符,而不仅仅是检查位置处的字符。这是因为
replace()

基本上,您需要做的是:

  • 查找空格字符(您已经这样做了)
  • 抓住所有的线,包括空间;绳子的这一面很好
  • 将下一个字母转换为大写,但仅转换该字母
  • 抓取字符串的其余部分,超过您转换的字母
  • 将所有三段放在一起(字符串开头、大写字母、字符串结尾)
  • slice()
    方法将执行您想要的操作:

    finalName = finalName.replace(finalName.charAt(i+1), finalName.charAt(i+1).toUpperCase());
    

    另一个选项是正则表达式(regex),其他答案也提到了它。这可能是一个更好的选择,因为它更干净。但是,如果您是第一次学习编程,那么通过编写原始循环更容易理解这个手动字符串工作。以后你可以用有效的方法来做这件事

    工作区:

    进一步阅读:

    难道不是吗

    if (finalName.charAt(i) === " ")
    

    不===检查对象类型是否相等,因为一个是字符,另一个是字符串。

    如果将RegExp
    /pattern/flags
    和函数传递到中,而不是使用子字符串,则可以大大简化此过程

    if (finalName.charAt(i) == " ")
    

    在本例中,我已将更改应用于a之后的任何字符,但您可能需要更具体的
    /(^ |)/g

    这个问题的另一个好答案是使用RegEx为您执行此操作

    function nameChanger(oldName) {
        var lowerCase = oldName.toLowerCase(),
            titleCase = lowerCase.replace(/\b./g, function ($0) {return $0.toUpperCase()});
        return titleCase;
    };
    
    所使用的正则表达式可能需要稍微修改一下,但这会让您了解如何使用正则表达式


    问题有两方面:

    1) 您需要为finalName.replace返回一个值,因为该方法返回一个元素,但不改变它的谓词

    2) 您没有遍历字符串值,因此只更改第一个单词。你不想把每个单词都改成小写大写吗

    此代码将更好地为您服务:

    var re = /(\b[a-z](?!\s))/g;
    var s = "fort collins, croton-on-hudson, harper's ferry, coeur d'alene, o'fallon"; 
    s = s.replace(re, function(x){return x.toUpperCase();});
    console.log(s); // "Fort Collins, Croton-On-Hudson, Harper's Ferry, Coeur D'Alene, O'Fallon"
    

    你确定charAt(i)返回的是字符串而不是字符吗?这并不能以任何方式回答这个问题。这是错误的,因为JavaScript中没有
    char
    类型,
    charAt
    只返回长度为1的字符串。charAt应该是char,而“”应该是字符串。但由于它是javascript,由于键入能力弱,不记得是否“==”。@JustinChou javascript没有字符类型,它使用长度为
    1
    的字符串(或者可能在某些边缘情况下使用
    2
    的USC-16字符,不确定是否需要读取规范)。。。因为??你至少应该解释一下为什么这个改变是必要的,特别是因为这个问题看起来像是家庭作业。我试过这个,它返回“阿尔伯特·爱因斯坦”。不知道为什么它会抢占第一个“E”,而不是在“空间”之后?“XdMaimin,我同意,当你评论时,我正在扩大解释的范围:”好的不可改变的解释!马德隆,绝对!很乐意帮忙。我可以说你在寻找一个基本的解释。我们都曾为这些东西挣扎过。不断学习的人!这是相当神秘的,特别是对于初学者。@xdumaine哪一部分是特别的?我把它分成三行,试图让它更清楚。我在一些参考资料中编辑过,我怀疑OP是否会认识到这种替换语法意味着它使用正则表达式,更不用说你是如何想出这些正则表达式的,或者它们的意思了。对于“你的代码就在这里”的字符串操作问题来说,这是相当高级的。
    function nameChanger(oldName) {
        var lowerCase = oldName.toLowerCase(),
            titleCase = lowerCase.replace(/\b./g, function ($0) {return $0.toUpperCase()});
        return titleCase;
    };
    
    var re = /(\b[a-z](?!\s))/g;
    var s = "fort collins, croton-on-hudson, harper's ferry, coeur d'alene, o'fallon"; 
    s = s.replace(re, function(x){return x.toUpperCase();});
    console.log(s); // "Fort Collins, Croton-On-Hudson, Harper's Ferry, Coeur D'Alene, O'Fallon"
    
       var name = "AlbERt EINstEiN";
    
    function nameChanger(oldName) {
    
        // Your code goes here!
    
        var finalName = [];
        oldName.toLowerCase().split(" ").forEach(function(word) {
            newWord = word.replace(word.charAt(0), word.charAt(0).toUpperCase());
            finalName.push(newWord);
        });
    
    
        // Don't delete this line!
        return finalName.join(" ");
    };
    
        // Did your code work? The line below will tell you!
        console.log(nameChanger(name));