为什么有两种类型的JavaScript字符串?

16 浏览
0 Comments

为什么有两种类型的JavaScript字符串?

这个问题把我难住了。我不知道所有浏览器是否都是这样(我没有其他能测试的合适的浏览器),但至少Firefox有两种类型的字符串对象。

打开Firebugs控制台,尝试以下操作:

>>> "a"
"a"
>>> new String("a")
String { 0="a"}

正如你可以直观地观察到的那样,Firefox对待new String("a")"a"是不同的。但无论如何,这两种字符串似乎行为相同。例如,有证据表明它们都使用相同的原型对象:

>>> String.prototype.log = function() { console.log("Logged string: " + this); }
function()
>>> "hello world".log()
Logged string: hello world
>>> new String("hello world").log()
Logged string: hello world

所以显然它们是相同的。直到你询问类型为止。

>>> typeof("a")
"string"
>>> typeof(new String("a"))
"object"

我们还可以注意到,当this是一个字符串时,它始终是对象形式:

>>> var identity = function() { return this }
>>> identity.call("a")
String { 0="a"}
>>> identity.call(new String("a"))
String { 0="a"}

进一步地,我们可以看到非对象字符串表示不支持任何额外的属性,但对象字符串支持:

>>> var a = "a"
>>> var b = new String("b")
>>> a.bar = 4
4
>>> b.bar = 4
4
>>> a.bar
undefined
>>> b.bar
4

另外,有趣的事实!你可以使用toString()函数将字符串对象转换为非对象字符串:

>>> new String("foo").toString()
"foo"

从来没想过调用String.toString()会有用!不管怎样。

所以所有这些实验引出了一个问题:为什么JavaScript中有两种类型的字符串?


评论显示每个原始的JavaScript类型(包括数字和布尔值)都是这样的情况。

0