这个说法:
var myString = new String('foo');
...创建一个用字符、和初始化的字符串对象。f
o
o
这个说法:
var myString = new String();
...创建一个没有字符的字符串对象,但这并不重要,因为这个语句:
myString = "foo";
...丢弃该字符串对象,并用具有这些字符的新原始字符串替换该变量的值。最终结果与以下内容完全相同:
var myString = "foo";
输出console.log
不同的原因是提供 的浏览器console.log
试图明确其中一个是对象,另一个是原语。
有点令人困惑的是,JavaScript 既有字符串对象又有字符串原语。(它也有数字对象和数字原语。)几乎没有任何理由使用new String
,它创建了一个字符串对象;只需使用原语(在您的情况下为文字)即可。相反,有很好的理由不使用字符串对象,例如:
console.log(new String("foo") === new String("foo")); // "false"
console.log(new String("foo") == new String("foo")); // "false"
console.log("foo" === "foo"); // "true"
因为字符串对象是对象,==
并且===
比较的是对象引用,而不是字符序列。虽然可能有一些边缘情况是您想要的,但在 99.9% 的情况下,您真正想要的是比较这些值。好消息是:
console.log("foo" == new String("foo")); // "true"
...但是如果您使用===
不会进行任何类型强制,那将是不正确的。
你可能会问:
因此,如果var myString = "foo"
返回一个原语,而不是一个对象,那么它是如何myString.toUpperCase()
工作的呢?
好问题:答案是原语被自动提升为对象,以便我们可以进行函数调用。(理论上;在实践中,实现比这更聪明。)