2010-04-29 75 views
8

据我所知,每个字符串都是Javascript中的一个对象。尽管如此,“不工作”,因为我希望它是:JavaScript中String对象的属性值

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" 

为什么是这样吗?

回答

8

你可能有兴趣在检查出这篇文章的第一部分:

报价:

有两种不同类型的字符串和表现相当不同。文字是通过在字符串周围使用引号来创建的。一个对象是通过隐式使用new关键字创建的。如果使用String关键字将一个字符串赋给一个变量,如果没有new关键字,则括号内容将被转换为字符串文字。

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

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

您不能将属性或方法添加到字符串文字。他们被翻译忽视。

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

+0

明白了,谢谢 - “你不能将属性或方法添加到字符串文字的原因是,当你尝试访问文字的属性或方法时,Javascript解释器会临时将字符串的值复制到一个新的对象,然后使用该对象的属性或方法。“ ;-) – naivists 2010-04-29 17:49:57

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. 返回基类对象为Result(5)且属性名称为Result(6)的Reference类型的值。