假设我有一个包含字符串值的数组,例如:
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
但我很好奇为什么以前的方法不起作用?编辑:做了一些摆弄,显然它根本不用于字符串开头,而不仅仅是数组中的字符串。我想我的错误印象是字符串就像数组一样。我可以通过调用它在字符串中的位置来返回某些字符,类似于调用数组索引的方式,但是更改所述索引并不成立。
答案 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.