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

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (14)

我一直在使用ECMA-262标准(ECMAScript语言规范,第3版,如果这很重要 - 我没有发现第3版和第5版的字符串类型/字符串对象之间有任何区别)。

有一件事让我感到困惑:字符串类型和字符串对象之间的区别。是的,我知道区别在于字符串类型是16位UTF-16单元的序列,而字符串对象是内部对象,其内部Class属性设置为“String”,其内部Value属性设置为字符串类型的值。

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

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

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

"foo".charAt(0);

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

它们似乎都暴露了相同的功能,但ECMA-262标准中定义的字符串类型没有功能; 它所公开的所有功能都来自于String.prototype对象(并且我没有看到字符串类型神奇地公开了ECMA-262标准中String.prototype对象的所有属性和功能)的事实。所以,在类型的值的字符串类型自动提升到一个String对象与原始的字符串类型的值作为其内部价值的财产?

如果对它们的处理方式完全相同(对于所有意图和目的,它们似乎都是这样),为什么有两种不同的方式来表示字符串

提问于
用户回答回答于

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

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

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")

是真的,只是因为==运算符的隐式类型转换才是真的

"foo" === new String("foo")
用户回答回答于

这与Java intIntegerJava 之间的区别类似。

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

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

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

9.9 ToObject 运算符ToObject根据下表将其参数转换为Object类型的值: [...] 创建一个新的String对象,其[[value]]属性设置为字符串的值。关于String对象的描述见15.5。

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

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

扫码关注云+社区