【问题标题】:If "Strings are objects," then why can't I store properties on them?如果“字符串是对象”,那么为什么我不能在它们上存储属性?
【发布时间】:2013-11-28 01:15:52
【问题描述】:

这似乎是真的:

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

s.foo; // 2

但它不是,而函数是一样的,就像 jQuery 一样。

【问题讨论】:

  • 似乎是原始字符串和字符串对象的区别。见this MDN post

标签: javascript string object


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    如果 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'];
    

    但这种强制转换只是为了评估表达式,它不会改变标识符的值。

    【讨论】:

      猜你喜欢
      • 2011-01-01
      • 1970-01-01
      • 2018-04-27
      • 2019-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多