无法覆盖";这";在javascript中使用String.prototype扩展字符串时

无法覆盖";这";在javascript中使用String.prototype扩展字符串时,javascript,string,prototype,immutability,Javascript,String,Prototype,Immutability,我想为javascript字符串创建一个可变的reverse方法 TL;医生: 以下是我的尝试,但没有成功: String.prototype.reverse = function() { var reversed = {}; j = 0; for (i = this.length - 1; i >= 0; i--) { reversed[j++] = this[i]; } for (i in reversed)

我想为javascript字符串创建一个可变的
reverse
方法

TL;医生:

以下是我的尝试,但没有成功:

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];
    }
};

它根本不会改变字符串,这个小测试进一步证明了这一点:

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];
        }
    };

但是如果我在一个“真正的”javascript字符串上尝试同样的方法,它就不起作用了。

括号符号不起作用。发件人:

对于使用括号表示法的字符访问,尝试删除或 为这些属性赋值将不会成功。属性 所涉及的内容既不可写也不可配置。(见 Object.defineProperty以获取更多信息。)


字符串在Javascript中是不可变的,因此您无法通过任何方式更改它们。

括号表示法不起作用。发件人:

对于使用括号表示法的字符访问,尝试删除或 为这些属性赋值将不会成功。属性 所涉及的内容既不可写也不可配置。(见 Object.defineProperty以获取更多信息。)

字符串在Javascript中是不可变的,因此您无法通过任何方式更改它们。

从:

在JavaScript中,字符串是不可变的对象,这意味着 其中的字符不能更改,并且对其执行任何操作 字符串实际上创建新字符串。字符串由 引用,而不是按值。通常,当对象由指定时 引用,通过一个引用对对象所做的更改将被删除 通过对对象的所有其他引用可见。因为弦 无法更改,但是,您可以有多个对 字符串对象,不必担心字符串值会在没有 你知道吗

还有Javascript。这意味着您不会在任何地方修改原始字符串。你必须归还一些东西

下面是反向函数的一个简单实现:

function reverse(s) {
  var reversed = '';
  for (var i = s.length - 1; i >= 0; i--)
    reversed += s[i];
  return reversed;
}
您必须重新分配原始变量

var original = 'original';
original = reverse(original);

从:

在JavaScript中,字符串是不可变的对象,这意味着 其中的字符不能更改,并且对其执行任何操作 字符串实际上创建新字符串。字符串由 引用,而不是按值。通常,当对象由指定时 引用,通过一个引用对对象所做的更改将被删除 通过对对象的所有其他引用可见。因为弦 无法更改,但是,您可以有多个对 字符串对象,不必担心字符串值会在没有 你知道吗

还有Javascript。这意味着您不会在任何地方修改原始字符串。你必须归还一些东西

下面是反向函数的一个简单实现:

function reverse(s) {
  var reversed = '';
  for (var i = s.length - 1; i >= 0; i--)
    reversed += s[i];
  return reversed;
}
您必须重新分配原始变量

var original = 'original';
original = reverse(original);

简短回答:javascript中的字符串是不可变的简短回答:javascript中的字符串是不可变的谢谢,这至少解释了为什么覆盖它会自动失败。谢谢,这至少解释了为什么覆盖它会自动失败。