字符串对象和原始字符串之间的区别

Sad*_*han 8 javascript

下面用示例数字1描述我的问题:

 var myString = new String('foo');
Run Code Online (Sandbox Code Playgroud)

如果我使用console.log(myString); 输出是String { 0="f", 1="o", 2="o"}

和数字2:

var myString = new String();
myString = "foo";
Run Code Online (Sandbox Code Playgroud)

这里console.log(mystring);只打印foo

这里number-1和number-2有什么区别?为什么输出不同?

T.J*_*der 13

这个说法:

var myString = new String('foo');
Run Code Online (Sandbox Code Playgroud)

......创建一个字符串对象以字符初始化f,oo.

这个说法:

var myString = new String();
Run Code Online (Sandbox Code Playgroud)

...创建一个没有字符的字符串对象,但这并不重要,因为这句话:

myString = "foo";
Run Code Online (Sandbox Code Playgroud)

...抛出该字符串对象并将该变量的值替换为带有这些字符的新原始字符串.最终结果完全相同:

var myString = "foo";
Run Code Online (Sandbox Code Playgroud)

输出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"
Run Code Online (Sandbox Code Playgroud)

因为字符串对象是对象,==并且===比较对象引用,而不是字符序列.虽然可能有一些边缘情况,这是你想要的,99.9%的时间,你真正想要的是比较值.好消息是:

console.log("foo" == new String("foo")); // "true"
Run Code Online (Sandbox Code Playgroud)

......但如果你使用===,那就不会是真的,这不会做任何类型的强制.


你可能会问:

因此,如果var myString = "foo"返回一个原语,而不是一个对象,那么它是如何myString.toUpperCase()工作的呢?

好问题:答案是原语被自动提升为一个对象,以便我们可以进行函数调用.(理论上讲,在实践中,实现比这更聪明.)