繁体   English   中英

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

[英]Capitalize the first letter of each word using

我本学期正在使用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()应用到的相同字母吗?

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

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

不需要修改word ,因为字符串是不可变的。 您不能在字符串中更改单个字符。

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

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/String

首先,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对象是使用引用分配的,因此它将起作用。 使用值分配原始值。 因此,根据我的理解,n始终是数组中项目的副本。 与之相关的任何操作都不应影响数组中的项目。 我提到过字符串是原始值。 另外,我想不出具有属性并且是原始类型的任何变量。 如果您有任何想法,请告诉我。 很高兴学习。 :-) – 拉杰什


当然,您是对的。 这就是为什么我首先要说的是可变的……因为不是,所以无论如何都没有意义。 降低


为了获得理想的效果,您将不得不覆盖数组中的值。

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

参考:

因此,我的代码难道不应该将每个单词的第一个字母替换为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); 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM