我想为javascript字符串创建一个可变的reverse
方法。
TL; DR:
这是我的尝试无效:
String.prototype.reverse = function() {
var reversed = {};
j = 0;
for (i = this.length - 1; i >= 0; i--)
{
reversed[j++] = this[i];
}
for (i in reversed)
{
this[i] = reversed[i];
}
};
...
str1 = "hello";
str1.reverse();
console.log(str1); //hello, not olleh
它根本不会改变字符串,正如这个小测试所证明的那样:
String.prototype.makeFirstCharX = function() {
console.log(this[0]); //h
this[0] = 'x'; //no error
console.log(this[0]); //h ??
};
str1.makeFirstCharX();
console.log(str1); //hello, not xello
无论如何都要在原始JS类型的新原型函数中覆盖this
的值?为什么this[0]='x'
之类的内容不会出现错误而不是默默地失败?
---这是我在 按预期工作的自定义JS对象上尝试过的,这就是我基于以上内容的方法:
我可以创建一个自定义可恢复字符串,其行为类似于本机字符串,如下所示:
function MyString(str) {
//set string content and length
var l = 0;
for (i in str)
{
this[i] = str[i];
l++;
}
this.length = l;
}
MyString.prototype.toString = function()
{
var retVal = '';
for (i = 0; i < this.length; i++)
{
retVal += this[i];
}
return retVal;
};
MyString.prototype.reverse = function()
{
var reversed = {};
j = 0;
for (i = this.length - 1; i >= 0; i--)
{
reversed[j++] = this[i];
}
for (i in reversed)
{
this[i] = reversed[i];
}
};
正如所料:
str = new MyString('string');
console.log(str); // MyString { 0="s", 1="t", 2="r", more...}
console.log("" + str); //string
console.log(str.length); //6
str.reverse();
console.log(str); // MyString { 0="g", 1="n", 2="i", more...}
console.log("" + str); //gnirts
但如果我在“真正的”javascript字符串上尝试相同的操作,它就不起作用。
答案 0 :(得分:4)
First Strings aren't mutable in Javascript.
来自rhino book:
在JavaScript中,字符串是不可变对象,这意味着 其中的字符可能无法更改,也不能进行任何操作 字符串实际上创建新字符串字符串由。分配 参考,而不是价值。通常,当分配对象时 引用,通过一个引用对对象进行的更改将是 通过对象的所有其他引用可见。因为字符串 但是,您可以对a进行多次引用 字符串对象并不担心字符串值会在没有的情况下发生变化 你知道吗
还有Javascript passes it by value。这意味着您不会在任何地方修改原始字符串。你必须归还一些东西。
这是反向函数的简单实现:
function reverse(s) {
var reversed = '';
for (var i = s.length - 1; i >= 0; i--)
reversed += s[i];
return reversed;
}
你必须重新分配原始的var。
var original = 'original';
original = reverse(original);
答案 1 :(得分:1)
括号表示法不起作用。来自String:
对于使用括号表示法的字符访问,尝试删除或 为这些属性赋值不会成功。属性 涉及既不可写也不可配置。 (看到 Object.defineProperty以获取更多信息。)
字符串在Javascript中是不可变的,因此您无法以任何方式更改它们。