【问题标题】:Changing the Primitive-String a String-Object References将原始字符串更改为字符串对象引用
【发布时间】:2016-05-27 11:51:59
【问题描述】:

忽略所有最佳实践,我有一个相当学术的问题,出于好奇,我会问。

如您所知,您可以为字符串对象添加自定义属性:

var s = new String("initial string");
var s.customProperty = "Please Don't Forget about me";

是否可以(不创建新的字符串对象)更改 "s" 引用的字符串原语?

具体来说,我想更改 "s"(上图),以便 s == "new string",但在进行此更改后,我想要 s.customProperty 仍然指向原始字符串:“请不要忘记我”。同样,我想在不必创建任何新字符串对象的情况下实现这一点。

var s = new String("initial string");
var s.customProperty = "Please Don't Forget about me";

// What code must preceed the following "if statement" in order
// for it to return "true" (giving the restrictions I described
// in the paragraphs of this post)?

if(s == "new string" && s.customProperty == "Please Don't Forget about me")
{
    console.log("true");
}
else
{
    console.log("false");
}

换句话说,是否可以在不丢失或克隆已添加到该字符串对象的所有自定义属性的情况下更改字符串对象的引用指针?

【问题讨论】:

    标签: javascript string ecmascript-6 ecmascript-5


    【解决方案1】:

    是否可以更改“s”引用的字符串原语?

    没有。它包含的[[StringData]] (ES6) / [[PrimitiveValue]] (ES5) 是一个internal slot,不能被变异。

    …无需创建任何新的字符串对象。

    没有办法。

    您可以做的是将String 子类化并覆盖所有方法以引用可变属性,但该建议与“不要使用String 对象”一样好。另请参阅逆问题的答案Is there a way to Object.freeze() a JavaScript Date?

    【讨论】:

    • 感谢您提供的信息丰富的回答。转瞬即逝的思绪。 . . : 如果字符串对象引用类似于对象属性而不是内部槽的东西,那么字符串对象会更灵活。
    • @LonnieBest:不变性决定了一切 :-) 如果你想要有状态的实例,只需使用标准对象和 toString 方法。
    【解决方案2】:

    String prototype 来救援!

    所以基本上是这样的:

    String.prototype.customProperty = "Please Don't Forget about me";
    

    那么你可以这样称呼它:

    "Your string".customProperty
    

    【讨论】:

    • 现在 all 你的 String 对象具有该属性,我认为这不是 OP 所追求的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-29
    • 2020-07-12
    • 2011-05-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多