0

这学期我正在上javascript课程,本周的练习之一是取一系列单词,并将每个单词的第一个字母大写。我用了.map(),代码如下:

让t1=“你好,你好”.split(“”);设t2=t1.map(函数(字){return word[0].toUpperCase()+word.slice(1);});控制台.log(t2.join(“”));

它工作得很好。然而,当我尝试用于每个(),我无法工作。这是我的代码:

让t1=“你好,你好”.split(“”);t1.forEach(函数(单词){单词[0]=单词[0].toUpperCase();})console.log(t1.join(“”));

我对用于每个()它循环遍历表中的每个元素,很像一个简单的for循环。因此,我的代码不应该取每个单词的第一个字母,并用相同的字母替换它至UpperCase()是否应用?

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

2

3个答案

重置为默认值
2

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

var str='hello World';str[0]=“H”;控制台.log(str)

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

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

变量a=[1,2,3];a.forEach(函数(n){n=n*2;});控制台.log(a)

根据与@减少,这一点不准确。

如果一个字符串是可变的,那就很好了。你的“第二个”并不适用减少


@deceze对象是使用引用指定的,因此会产生效果。使用值指定基本体值。所以在我的理解中,n永远是数组中项的副本。任何与之相关的操作都不应影响数组中的项。字符串是一个原语值,我提到过。而且,我想不出任何具有属性并且是原语类型的变量。如果你有什么想法,请告诉我。很乐意学习。:-)-拉杰什


当然,你说得对。这就是为什么我要说,如果它一开始是可变的……既然它不是,那么这一点无论如何都是无意义的减少


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

让t1=“你好,你好”.split(“”);t1.forEach(函数(单词、索引){t1[索引]=单词[0].toUpperCase()+单词.substring(1);})console.log(t1.join(“”));

参考:

4
  • 如果一个字符串是可变的,那就很好了。你的“第二个”并不适用。
    – 减少
    评论 2017年11月22日13:12
  • 这段代码没有证明什么,因为它没有做同样的事情。n个=(赋值给局部变量)不同于编号[0]=(对象属性的赋值)。
    – 减少
    评论 2017年11月22日13:16
  • @deceze对象是使用引用指定的,因此会产生效果。使用值指定基本体值。所以n个在我看来,数组中的项总是一个副本。任何与之相关的操作都不应影响数组中的项。字符串是一个基元值,我提到过。此外,我想不出任何具有属性和基元类型的变量。如果你有什么想法,请告诉我。很高兴学习。:-)
    – 拉杰什
    评论 2017年11月22日13:22
  • 当然,你说得对。这就是为什么我要说如果它是可变的首先……既然不是这样,这一点无论如何都是没有意义的。
    – 减少
    评论 2017年11月22日13:25
2

let word='foo';单词[0]=“F”;console.log(字);

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

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

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

1

那么,我的代码不应该取每个单词的第一个字母吗用相同的字母替换它,适用于哪个toUpperCase()?

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

但是,如果参数为对于每个不是原语值,则原始值发生变异,请参见演示在下面

var arr=[[1,2,3],[4,5,6],[7,8,9]];arr.forEach(功能(项){物品推送(1);})console.log(arr);

您的答案

单击“发布您的答案”,表示您同意我们的服务条款并确认您已阅读我们的隐私政策.

不是你想要的答案吗?浏览标记的其他问题问你自己的问题.