2010-04-29 41 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類型的值。