我一直在搞弄 ECMA-262 标准(ECMAScript 语言规范,第 3 版,如果这很重要的话 - 我没有发现第 3 版和第 5 版在字符串类型/字符串对象上有任何区别)。
有一件事让我感到困惑:字符串类型和字符串对象之间的区别。是的,我知道字符串类型是一个 16 位 UTF-16 单元的序列,而字符串对象是一个内置对象,其内部类属性设置为“字符串”,其内部值属性设置为字符串类型的值。
但是看了规范,string类型好像没有暴露任何方法;也就是说,它只是一个没有任何附加属性的值。拿这段代码,一切都和预期的一样:
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 Type上没有函数;它公开的所有函数都来自 String.prototype 对象(并且我看不到字符串类型神奇地公开了 ECMA-262 标准中 String.prototype 对象的所有属性和函数的事实)。那么String Type 类型的值是否会自动提升为一个String Object,并将原始String Type值作为其内部Value属性?
如果它们的处理方式完全相同(就所有意图和目的而言,它们似乎都是如此),为什么要用两种不同的方式来表示String?