JavaScript中String对象的属性值

时间:2010-04-29 17:43:01

标签: javascript string

据我了解,每个字符串都是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 个答案:

答案 0 :(得分:8)

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

引用:

  

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

     

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

     

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

     

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

     

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

答案 1 :(得分:4)

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

在幕后发生了与此类似的事情:

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

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

制作MemberExpressionMemberExpression [ 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)

答案 2 :(得分:0)

这也很有趣...... Are string literals objects or not?