Javascript 将每个单词的第一个字母大写
在if语句之后,并注释掉其余语句,它将打印“e”,这样它就可以像应该的那样识别字符(i+1)。。。我只是无法将第二个单词的第一个字母大写。您的代码示例有两个问题。我会逐一检查 字符串是不可变的 这不是你想象的那样: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中,字符
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));