【发布时间】:2011-04-01 13:54:36
【问题描述】:
这个只是狠狠地刺了我一刀。我不知道是不是所有浏览器都是这样(我没有任何其他能胜任的浏览器可以测试),但至少 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 类型(包括数字和布尔值)也是如此。
【问题讨论】:
-
数字也有两种……
-
还有两种布尔值
true === new Boolean(true); // false -
假设 JavaScript 是一种二进制类型的语言...
-
换句话说,每个原语都有一个包装类型(我觉得完全没用)
标签: javascript string