【问题标题】:Property value of a String object in JavaScriptJavaScript 中 String 对象的属性值
【发布时间】:2010-04-29 17:43:00
【问题描述】:

据我了解,每个字符串都是 Javascript 中的一个对象。尽管如此,它仍然像我预期的那样“不起作用”:

var a="abc";  //here we get a new string object
a.b = 123;    //I seem to declare a property "b" of that object
alert(a.b);   //alerts "undefined"

但是,如果我尝试以“错误的方式”定义字符串,一切都会按预期进行

var a=new String("abc"); //
a.b = 123;
alert(a.b);    //alerts "123"

为什么会这样?

【问题讨论】:

    标签: javascript string


    【解决方案1】:

    您可能有兴趣查看本文的第一部分:

    引用:

    有两种不同类型的字符串,它们的行为完全不同。只需在字符串周围使用引号即可创建文字。对象是通过隐式使用 new 关键字创建的。如果使用 String 关键字将字符串分配给变量,如果没有 new 关键字,括号的内容将被转换为字符串文字。

    字符串文字可以访问字符串的所有对象和方法,因为 javascript 会临时将字符串文字转换为字符串对象,以便运行所需的方法。

    两者的不同之处在于它们对新属性和方法的处理。像所有 Javascript 对象一样,您可以将属性和方法分配给任何 String 对象。

    您不能向字符串文字添加属性或方法。解释器会忽略它们。

    您不能向字符串文字添加属性或方法的原因是,当您尝试访问文字的属性或方法时,Javascript 解释器会临时将字符串的值复制到新对象中,然后使用该对象的属性或方法。这意味着字符串字面量只能访问字符串的默认属性或方法以及那些已作为原型添加的属性或方法。

    【讨论】:

    • 知道了,谢谢 - “你不能向字符串文字添加属性或方法的原因是,当你尝试访问文字的属性或方法时,Javascript 解释器会临时复制将字符串插入一个新对象,然后使用该对象的属性或方法。” ;-)
    【解决方案2】:

    发生这种情况是因为 property accessors、(.[])转换了值 ToObject

    幕后发生了与此等价的事情:

    var a="abc";
    new Object(a).b = 123;  
    alert(a.b); // undefined
    

    基本上,一个对象是由属性访问器动态创建的,参见第 5 步:

    产生式MemberExpression : MemberExpression [ Expression ](或MemberExpression . Identifier)评估如下:

    1. 评估MemberExpression

    2. 致电GetValue(Result(1))

    3. 评估表达式。

    4. 致电GetValue(Result(3))

    5. 致电ToObject(Result(2))

    6. 致电ToString(Result(4))

    7. 返回一个 Reference 类型的值,其基对象为 Result(5),其属性名称为 Result(6)

    【讨论】:

      【解决方案3】:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-02-11
        • 1970-01-01
        • 1970-01-01
        • 2019-05-02
        • 1970-01-01
        • 1970-01-01
        • 2013-12-02
        • 2010-10-12
        相关资源
        最近更新 更多