javascriptstringtypes和string对象之间的区别?

我一直在搞ECMA-262标准( ECMAScript语言规范,第三版,如果这很重要 – 我没有发现第三版和第五版的stringtypes/string对象之间的任何区别)。

有一件事让我感到困惑:stringtypes和string对象之间的区别。 是的,我知道在stringtypes是16位UTF-16单元序列的意义上的区别,而string对象是一个内部对象,其内部属性设置为“string”,其内部属性设置为stringtypes的值。

但是阅读规范,stringtypes似乎没有公开任何方法; 也就是说,这只是一个没有任何附加属性的值。 拿这个代码,一切都和预期完全一样:

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

第一种types是实际的stringtypes ,第二种是对象types (它是String类的一个对象,但其数据types是对象)。 但是,看这个:

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

它们似乎都暴露了相同的function,但ECMA-262标准中定义的stringtypes没有function; 所有它暴露的函数都来自于String.prototype对象(我没有看到stringtypes神奇地暴露了ECMA-262标准中的String.prototype对象的所有属性和函数)。 那么String Typetypes的值是否会自动提升为一个Stringtypes值为其内部Value属性的String对象呢?

如果他们的待遇完全一样(为了所有的目的和目的,他们似乎是),为什么有两种不同的方式来表示一个string

string是JS中的一个值types,所以他们不能有任何附加的属性,没有原型等。任何尝试访问它们的属性在技术上执行JS [[ToObject]]转换(本质上是新的string) 。

区分差异的简单方法是(在浏览器中)

 a = "foo" ab = "bar" alert("ab = " + ab); //Undefined A = new String("foo"); Ab = "bar"; alert("Ab = " + Ab); // bar 

另外,

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

是真的,只是由于==运算符的隐式types转换才是真实的

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

会失败。

这类似于Java中的intInteger之间的区别。

根据标准,当您尝试调用方法时,string会自动转换为String对象。 见ECMA 262-3第11.2.1节 ; 第5 ToObject (在第9.9节中定义)。

11.2.1属性访问器
[…]
生成MemberExpression:MemberExpression [Expression]的计算方法如下:

  1. 评估MemberExpression。
  2. 调用GetValue(Result(1))。
  3. 评估expression。
  4. 调用GetValue(Result(3))。
  5. 调用ToObject(Result(2))。
  6. 呼叫ToString(结果(4))。
  7. 返回基类对象为Result(5),属性名称为Result(6)的Referencetypes的值。

9.9 ToObject

运算符ToObject根据下表将其参数转换为Objecttypes的值:
[…]
创build一个新的String对象,其[[value]]属性被设置为string的值。 有关string对象的描述,请参阅15.5。

作为一个规范技术,这是一个黑客来解释如何string似乎有方法,即使他们不是真正的对象。

除此之外,包装对象不是很有用。 我不知道他们为什么在语言中。 我宁愿他们不是。 🙂