[英]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.