【发布时间】:2013-11-28 01:15:52
【问题描述】:
这似乎是真的:
var s = 'asdf';
s.foo = 2;
s.foo; // 2
但它不是,而函数是一样的,就像 jQuery 一样。
【问题讨论】:
-
似乎是原始字符串和字符串对象的区别。见this MDN post。
标签: javascript string object
这似乎是真的:
var s = 'asdf';
s.foo = 2;
s.foo; // 2
但它不是,而函数是一样的,就像 jQuery 一样。
【问题讨论】:
标签: javascript string object
他们不是,至少并非总是如此。引用MDN article on JS strings:
请注意,JavaScript 区分 String 对象和 原始字符串值。 (布尔值和数字也是如此。)
字符串字面量(用双引号或单引号表示)和字符串 从非构造函数上下文中的 String 调用返回(即,没有 使用 new 关键字)是原始字符串。 JavaScript 自动 将原语转换为 String 对象,以便可以使用 原始字符串的字符串对象方法。在上下文中 方法将在原始字符串或属性查找上调用 发生时,JavaScript 将自动包装字符串原语并 调用方法或执行属性查找。
【讨论】:
如果 javascript 中的 everything 是一个对象,那么:
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'];
但这种强制转换只是为了评估表达式,它不会改变标识符的值。
【讨论】: