我一直在摆弄ECMA-262标准(ECMAScript语言规范,第三版,如果对此很重要的话--我没有发现第三版和第五版在字符串类型/字符串对象上有任何区别)。
有一件事让我感到困惑: String类型和String对象之间的区别。是的,我知道不同之处在于String Type是一个16位UTF-16单元序列,而String对象是一个内置对象,其内部Class属性设置为" String“,其内部Value属性设置为String Type的值。
但是从规范中可以看出,string类型似乎并不公开任何方法;也就是说,它只是一个没有任何附加属性的值。看看这段代码,一切都和预期的完全一样:
document.writeln(typeof "foo"); // 'string'
document.writeln(typeof new String("foo")); // 'object'
第一个类型是实际的String type,第二个是Object Type (它是String类的对象,但它的数据类型是object)。然而,看看这个:
"foo".charAt(0);
fooStrObj = new String("Foo");
fooStrObj.charAt(0);
它们似乎都公开了相同的函数,但是在ECMA-262标准中定义的String类型上没有函数;它公开的所有函数都来自String.prototype对象(我看不到String类型神奇地公开了ECMA-262标准中String.prototype对象的所有属性和函数)。那么,是否将String type类型的值自动提升为String对象,并将原始String Type值作为其内部value属性?
如果它们被完全相同地对待(在所有的意图和目的中,它们似乎是相同的),为什么要有两种不同的方式来表示一个字符串
发布于 2010-01-13 03:54:21
字符串是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")
都会失败。
https://stackoverflow.com/questions/2051833
复制相似问题