据我了解,每个字符串都是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"
为什么会这样?
答案 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:
制作MemberExpression
:MemberExpression [ Expression ]
(或MemberExpression . Identifier
)评估如下:
评估MemberExpression
。
致电GetValue(Result(1))
。
评估表达。
致电GetValue(Result(3))
。
致电ToObject(Result(2))
。
致电ToString(Result(4))
。
返回Reference类型的值,其基础对象为Result(5),其属性名称为Result(6)
。
答案 2 :(得分:0)
这也很有趣...... Are string literals objects or not?