为什么有两种JavaScript字符串?

zne*_*eak 37 javascript string

这个只是刺伤了我.我不知道所有浏览器是否都是这种情况(我没有任何其他有能力的浏览器进行测试),但至少Firefox有两种字符串对象.

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

>>> "a"
"a"
>>> new String("a")
String { 0="a"}
Run Code Online (Sandbox Code Playgroud)

正如你可以直观地观察,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
Run Code Online (Sandbox Code Playgroud)

显然,两者都是一样的.也就是说,直到你问这种类型.

>>> typeof("a")
"string"
>>> typeof(new String("a"))
"object"
Run Code Online (Sandbox Code Playgroud)

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

>>> var identity = function() { return this }
>>> identity.call("a")
String { 0="a"}
>>> identity.call(new String("a"))
String { 0="a"}
Run Code Online (Sandbox Code Playgroud)

更进一步,我们可以看到非对象字符串表示不支持任何其他属性,但对象字符串执行:

>>> var a = "a"
>>> var b = new String("b")
>>> a.bar = 4
4
>>> b.bar = 4
4
>>> a.bar
undefined
>>> b.bar
4
Run Code Online (Sandbox Code Playgroud)

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

>>> new String("foo").toString()
"foo"
Run Code Online (Sandbox Code Playgroud)

没想到打电话可能有用String.toString()!无论如何.

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


注释显示每种原始JavaScript类型(包括数字和bool)也是如此.

Kel*_*lly 14

Javascript中有两种类型的字符串 - 文字字符串和String对象.他们的行为有点不同.两者之间的主要区别是您可以向String对象添加其他方法和属性.例如:

var strObj = new String("object mode");
strObj.string_mode = "object"
strObj.get_string_mode = function() { return this.string_mode; }

// this converts it from an Object to a primitive string:
str = strObj.toString();
Run Code Online (Sandbox Code Playgroud)

字符串文字只是暂时转换为String对象以执行任何核心方法.

同样的概念也适用于其他数据类型.这里有更多关于原始数据类型和对象的信息.

编辑

如注释中所述,字符串文字不是原始字符串,而是"文字常量,其类型是内置基元[字符串]值",引用此源.

  • 它是字符串*原语*而不是文字.请参阅我对Raynos答案的评论. (4认同)