如果“字符串是对象”,那么为什么我不能在它们上存储属性?

时间:2013-11-28 01:15:53

标签: javascript string object

似乎真的会使这成为可能:

var s = 'asdf';
s.foo = 2;

s.foo; // 2

但它不是,而与函数相同,就像jQuery一样。

2 个答案:

答案 0 :(得分:4)

他们不是,至少不总是如此。引用 MDN article on JS strings

  

请注意,JavaScript区分String对象和   原始字符串值。 (布尔和数字也是如此。)

     

字符串文字(用双引号或单引号表示)和字符串   在非构造函数上下文中从String调用返回(即,没有   使用new关键字)是原始字符串。 JavaScript自动   将基元转换为String对象,以便可以使用它   原始字符串的字符串对象方法。在某种情况下   方法将在原始字符串或属性查找上调用   发生时,JavaScript会自动换行字符串原语和   调用方法或执行属性查找。

答案 1 :(得分:1)

如果 javascript中的所有内容都是一个对象,那么:

var a = new String('foo');
var b = new String('foo');

a == b; // false since objects are never equal

a.valueOf() == b.valueOf();  // true, since the values are equal

因此,为方便起见,有一些基元被强制转换为对象,这样做是有意义的:

// a and b are string primitives
var a = 'foo';
var b = 'foo';

a == b;        // true, a and b treated a primitives
a.length == 3; // true, a is treated as a String ojbect
a.split('');   // ['f', 'o','o'];

但该coersion仅用于评估表达式,它不会更改标识符的值。