这简直是狠狠地刺伤了我。我不知道是否所有浏览器都是如此(我没有任何其他有能力的浏览器可以测试),但至少 Firefox 有两种字符串对象。
打开 Firebugs 控制台并尝试以下操作:
>>> "a"
"a"
>>> new String("a")
String { 0="a"}
正如您可以直观地观察到的,Firefox 对待new String("a")
and "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 类型(包括数字和书籍)也是如此。