代码之家  ›  专栏  ›  技术社区  ›  naivists

javascript中字符串对象的属性值

  •  8
  • naivists  · 技术社区  · 14 年前

    据我所知,每个字符串都是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"
    

    为什么会这样?

    3 回复  |  直到 10 年前
        1
  •  8
  •   Daniel Vassallo    14 年前

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

    引用:

    有两种不同类型的字符串,其行为非常不同。文字是通过在字符串周围使用引号创建的。对象是通过隐式使用new关键字创建的。如果使用string关键字将字符串赋给变量,则在没有新关键字的情况下,括号的内容将被转换为字符串文本。

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

    两者的不同之处在于它们对新特性和新方法的处理。与所有javascript对象一样,您可以将属性和方法分配给任何字符串对象。

    不能向字符串文本添加属性或方法。他们被翻译忽略了。

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

        2
  •  4
  •   Christian C. Salvadó    14 年前

    这是因为 property accessors ,( . [] )转换值 ToObject .

    类似的事情发生在幕后:

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

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

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

    1. 评价 成员表达式 .

    2. 呼叫 GetValue(Result(1)) .

    3. 计算表达式。

    4. 呼叫 GetValue(Result(3)) .

    5. 呼叫 ToObject(Result(2)) .

    6. 呼叫 ToString(Result(4)) .

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

        3
  •  0
  •   Community Egal    7 年前

    这也是有趣的阅读… Are string literals objects or not?