一尘不染

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

javascript

我一直在纠缠于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 呢?


阅读 392

收藏
2020-05-01

共1个答案

一尘不染

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

将失败。

2020-05-01