更改数组字符串值的第一个(或任何)字符

时间:2017-03-21 20:04:31

标签: javascript arrays string set return

假设我有一个包含字符串值的数组,例如:

var foo = ["Hello", "World"];

我可以通过执行以下操作返回每个数组元素的第一个字符:

foo[0][0]; // Will return "H"
foo[1][0]; // Will return "W"

但是,尝试使用类似方法更改这些字符的值时,它不起作用。我的意思是这样做不起作用:

foo[0][0] = "J"; // Will not change "H" to "J".

这不是一个大问题,因为我知道其他方法,例如:

foo[0] = "J"+foo[0].substsring(1); // Hello --> Jello

但我很好奇为什么以前的方法不起作用?编辑:做了一些摆弄,显然它根本不用于字符串开头,而不仅仅是数组中的字符串。我想我的错误印象是字符串就像数组一样。我可以通过调用它在字符串中的位置来返回某些字符,类似于调用数组索引的方式,但是更改所述索引并不成立。

4 个答案:

答案 0 :(得分:1)

字符串是不可变的,也就是说,它们不能被改变。

此:

foo[0][0] = "J";

无法正常工作,因为您正在尝试修改foo数组中位置0处存储的字符串。

这:

foo[0] = "J"+foo[0].substsring(1);

确实有效,因为您没有尝试修改字符串,您试图替换 foo数组中位置0处的元素,其中全新字符串。

答案 1 :(得分:1)

来自Javascript String参考:

  

对于使用括号表示法的字符访问,尝试删除或   为这些属性分配值不会成功。属性   涉及既不可写也不可配置。 (看到   Object.defineProperty()了解更多信息。)

答案 2 :(得分:0)

JavaScript中的所有原始数据类型都是不可变的。

引自MDN

  

与C语言不同,JavaScript字符串是不可变的。这意味着一旦创建了一个字符串,就无法对其进行修改。但是,仍然可以根据对原始字符串的操作创建另一个字符串。

答案 3 :(得分:0)

字符串是不可变的,因此除非您创建新字符串并将新值存储在该字符串中,否则不能更改它们。你不能改变字符串中的字符,字符串操作方法,如trim,substring等。

从substring方法 - 结果是String值,而不是String对象。 var foo = [“你好”,“世界”];

foo [0] [0] =“J”; 的console.log(FOO);

foo [0] =“J”+ foo [0] .substring(1);

的console.log(FOO);

请注意,如果您更改 var foo = [1,“World”]; foo [0] [0] =“J”; 它有效,因为它不是一个字符串

检查出来:https://tc39.github.io/ecma262/#sec-string.prototype.substring

如果start大于end,则交换它们。

采取以下步骤:从上面的链接

Let O be ? RequireObjectCoercible(this value).
Let S be ? ToString(O).
Let len be the number of elements in S.
Let intStart be ? ToInteger(start).
If end is undefined, let intEnd be len; else let intEnd be ? ToInteger(end).
Let finalStart be min(max(intStart, 0), len).
Let finalEnd be min(max(intEnd, 0), len).
Let from be min(finalStart, finalEnd).
Let to be max(finalStart, finalEnd).
Return a String whose length is to - from, containing code units from S, namely the code units with indices from through to - 1, in ascending order.