这个问题困扰我很久了。我不知道所有浏览器是否都是这种情况(我没有其他可测试的浏览器),但至少Firefox有两种字符串对象。
打开Firebug控制台,尝试以下操作:
>>> "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类型(包括数字和布尔值)也是如此。
true === new Boolean(true); // false
。 - Raynos