代码之家  ›  专栏  ›  技术社区  ›  thr

javascript字符串类型和字符串对象之间的区别?

  •  63
  • thr  · 技术社区  · 15 年前

    我一直在玩弄ECMA-262标准( ECMAScript语言规范, 第三版,如果这很重要的话-我没有发现第三版和第五版在字符串类型/字符串对象上有任何区别)。

    有一件事让我困惑:字符串类型和字符串对象之间的区别。是的,我知道区别在于 字符串类型 是一个16位UTF-16单元的序列, 字符串对象 是内置对象,其内部 等级 属性设置为“string”及其内部 价值 属性设置为 字符串类型 .

    但在阅读规范时,字符串类型似乎没有公开任何方法;也就是说,它只是一个没有任何附加属性的值。以这段代码为例,一切都如预期:

    document.writeln(typeof "foo"); // 'string'
    document.writeln(typeof new String("foo")); // 'object'
    

    第一种类型是实际的 字符串类型 第二个是 对象类型 (这是阶级的对象) ,但其数据类型为对象)。然而,看看这个:

    "foo".charAt(0);
    
    fooStrObj = new String("Foo");
    fooStrObj.charAt(0);
    

    它们似乎都公开了相同的函数,但是 字符串类型 在ECMA-262标准中定义;它所公开的所有函数都来自string.prototype对象(我看不到引用 字符串类型 神奇地公开了ecma-262标准中string.prototype对象的所有属性和函数)。类型的值也是 字符串类型 自动升级为 字符串对象 与原件 字符串类型 内部值 价值 财产?

    如果他们被完全相同的对待(不管他们的意图和目的为何),为什么有两种不同的方式来代表 ?

    2 回复  |  直到 8 年前
        1
  •  44
  •   olliej    15 年前

    字符串是JS中的值类型,因此它们不能有任何附加属性,也不能有原型等。任何试图访问其上属性的尝试都在技术上执行JS[[ToObject]]转换(本质上是新字符串)。

    区别的简单方法是(在浏览器中)

    a = "foo"
    a.b = "bar"
    alert("a.b = " + a.b); //Undefined
    
    A = new String("foo");
    A.b = "bar";
    alert("A.b = " + A.b); // bar
    

    另外,当

    "foo" == new String("foo")
    

    为true,仅由于==运算符的隐式类型转换而为true

    "foo" === new String("foo")
    

    会失败。

        2
  •  12
  •   try-catch-finally zloctb    8 年前

    它类似于 int Integer 在Java中。

    根据标准,字符串自动转换为 String 对象。参见 ECMA 262-3 section 11.2.1 步骤5调用 ToObject (定义见第9.9节)。

    11.2.1属性访问器
    […]
    生产成员表达式:成员表达式[表达式]的计算如下:

    1. 计算MemberExpression。
    2. 调用GetValue(结果(1))。
    3. 计算表达式。
    4. 调用GetValue(结果(3))。
    5. 调用toObject(结果(2))。
    6. 调用ToString(结果(4))。
    7. 返回类型引用的值,其基对象是结果(5),属性名是结果(6)。


    9.9对象

    运算符to object根据下表将其参数转换为object类型的值:
    […]
    创建一个新的字符串对象,其[[值]]属性设置为 字符串。有关字符串对象的描述,请参见15.5。

    作为一种规范技术,这是一个用来解释字符串如何看起来有方法的黑客,即使它们不是真正的对象。

    除此之外,包装器对象不是很有用。我不知道他们为什么用这种语言。我真希望他们不是。:)