繁体   English   中英

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

[英]Difference between the javascript String Type and String Object?

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

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

但是,阅读规范后,字符串类型似乎没有公开任何方法。 也就是说,它只是一个没有任何其他属性的值。 采取以下代码,一切都完全符合预期:

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

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

"foo".charAt(0);

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

它们似乎都公开了相同的功能,但是ECMA-262标准中定义的String Type上没有任何功能。 它公开的所有功能均来自String.prototype对象(并且我看不到任何有关String Type神奇地公开ECMA-262标准中String.prototype对象的所有属性和功能的事实的参考)。 那么,是否将字符串类型类型的值自动提升为以原始字符串类型值作为其内部Value属性的字符串对象

如果将它们完全一样地对待(出于所有意图和目的,它们似乎都一样),为什么要用两种不同的方式来表示String呢?

字符串是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")

将失败。

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

根据标准,当您尝试调用方法时,字符串会自动转换为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(Result(2))。
  6. 调用ToString(Result(4))。
  7. 返回类型为Reference的值,其基础对象为Result(5),其属性名称为Result(6)。


9.9目的

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

作为一种规范技术,这是一种技巧,可以解释即使字符串不是真正的对象,字符串也可能具有方法。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM