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中的int
和Integer
之间的区别。
根据标准,当您尝试调用方法时,string会自动转换为String
对象。 见ECMA 262-3第11.2.1节 ; 第5 ToObject
(在第9.9节中定义)。
11.2.1属性访问器
[…]
生成MemberExpression:MemberExpression [Expression]的计算方法如下:
- 评估MemberExpression。
- 调用GetValue(Result(1))。
- 评估expression。
- 调用GetValue(Result(3))。
- 调用ToObject(Result(2))。
- 呼叫ToString(结果(4))。
- 返回基类对象为Result(5),属性名称为Result(6)的Referencetypes的值。
9.9 ToObject
运算符ToObject根据下表将其参数转换为Objecttypes的值:
[…]
创build一个新的String对象,其[[value]]属性被设置为string的值。 有关string对象的描述,请参阅15.5。
作为一个规范技术,这是一个黑客来解释如何string似乎有方法,即使他们不是真正的对象。
除此之外,包装对象不是很有用。 我不知道他们为什么在语言中。 我宁愿他们不是。 🙂