使用每个单词的首字母大写

时间:2017-11-22 13:01:04

标签: javascript

我本学期在javascript上上课,本周的练习之一是取一串单词,并将每个单词的第一个字母大写。 我使用.map()做到了,代码在这里:



let t1 = "hello how are you doing".split(" ");

let t2 = t1.map(function(word) {
  return word[0].toUpperCase() + word.slice(1);
});
console.log(t2.join(" "));




它完美无缺。但是,我想知道为什么,当我尝试使用forEach()时,我无法使其发挥作用。这是我的代码:



let t1 = "hello how are you doing".split(" ");


t1.forEach(function(word) {
  word[0] = word[0].toUpperCase();
})
console.log(t1.join(" "));




我对forEach()的理解是它循环遍历表的每个元素,就像一个简单的for循环。那么,我的代码不应该取每个单词的第一个字母,并将其替换为应用toUpperCase()的相同字母吗?

编辑:我已经知道如何将每个单词的第一个字母大写,我只是询问不同的方法

3 个答案:

答案 0 :(得分:2)



let word = 'foo';
word[0] = 'F';
console.log(word);




由于字符串是不可变的,word的修改不会。您无法更改字符串中的单个字符。

  

对于使用括号表示法的字符访问,尝试删除或为这些属性赋值将不会成功。涉及的属性既不可写也不可配置。

     

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String

答案 1 :(得分:2)

首先,JS中的字符串是不可变的。

var str = 'hello World';
str[0] = 'H';
console.log(str)

所以word[0] =不会有任何影响。

其次,即使它是,你要更新参数变量的值而不是数组中的值。

var a = [1, 2, 3];

a.forEach(function(n) {
  n = n * 2;
});

console.log(a)

根据@ deceze的讨论,这一点并不准确。

  

如果一个字符串是可变的,那就可以了。你的“第二”并不适用。 - deceze

           

@deceze使用引用分配对象,因此它将具有效果。使用值分配原始值。因此,在我的理解中,n将始终是数组中项目的副本。与之相关的任何操作都不应影响数组中的项目。而字符串是一个原始值,我提到它。此外,我想不出任何具有属性且具有原始类型的变量。如果您有任何想法,请告诉我。很高兴学习。 :-) - Rajesh

           

当然,你是对的。这就是为什么我说首先它是否可变......既然不是,那么这一点无论如何都是没有意义的。 - deceze

要获得所需的效果,您必须覆盖数组中的值。

let t1 = "hello how are you doing".split(" ");


t1.forEach(function(word, index) {
  t1[index] = word[0].toUpperCase() + word.substring(1);
})
console.log(t1.join(" "));

参考:

答案 2 :(得分:1)

  

那么我的代码不应该是每个单词的第一个字母,而且   用替换为toUpperCase()的相同字母替换它?

因为 word是原始值因此当您将新值设置为word时,它不会将引用传回数组。

但是,如果forEach的参数不是原始值,那么原始参数会发生变异,请参阅下面的演示



var arr = [[1,2,3],[4,5,6],[7,8,9]];
arr.forEach(function(item){
  item.push(1);
})
console.log(arr);