无法覆盖"这个"在使用String.prototype扩展String时在javascript中

时间:2014-07-27 23:50:30

标签: javascript string prototype immutability

我想为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字符串上尝试相同的操作,它就不起作用。

2 个答案:

答案 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中是不可变的,因此您无法以任何方式更改它们。