为什么有两种类型的JavaScript字符串?
为什么有两种类型的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类型(包括数字和布尔值)都是这样的情况。