Javascript 字符串对象和基本字符串之间的差异

Javascript 字符串对象和基本字符串之间的差异,javascript,Javascript,下面用一个例子来描述我的问题 1号: var myString = new String('foo'); 如果我使用console.log(myString) 输出是字符串{0=“f”,1=“o”,2=“o”} 第二条: var myString = new String(); myString = "foo"; 这里console.log(mystring)仅打印foo 这里是数字1和数字2的区别是什么?为什么输出不同 最好的理解方法是运行以下两条语句 console.log(typeo

下面用一个例子来描述我的问题 1号:

 var myString = new String('foo');
如果我使用
console.log(myString)
输出是
字符串{0=“f”,1=“o”,2=“o”}

第二条:

var myString = new String();
myString = "foo";
这里
console.log(mystring)仅打印
foo


这里是数字1和数字2的区别是什么?为什么输出不同

最好的理解方法是运行以下两条语句

console.log(typeof 'foo'); // -> "string"

console.log(typeof new String('foo')); // -> "object"
还有第二条语句,您正在将myString重新指定给“string”而不是string对象

此语句:

var myString = new String('foo');
var myString = new String();
myString = "foo";
…创建一个字符串对象,用字符
f
o
o
初始化

本声明:

var myString = new String('foo');
var myString = new String();
myString = "foo";
…创建不含字符的字符串对象,但这并不重要,因为以下语句:

var myString = new String('foo');
var myString = new String();
myString = "foo";
…将该字符串对象丢弃,并用新的原语字符串替换该变量的值。最终结果与以下结果完全相同:

var myString = "foo";
console.log
的输出不同的原因是提供
console.log
的浏览器试图明确其中一个是对象,另一个是原语

有点令人困惑的是,JavaScript既有字符串对象也有字符串原语。(它也有数字对象和数字原语。)几乎没有任何理由使用创建字符串对象的
新字符串
;只需使用原语(在您的例子中是一个文本)即可。相反,有很好的理由不使用字符串对象,例如:

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()
这类工作是如何进行的呢

好问题:答案是原语自动升级为对象,这样我们就可以进行函数调用。(在理论上;在实践中,实现比这更聪明。)

区别是微妙的,特别是因为调用字符串原语的方法由字符串对象方法包装,所以它们在功能上几乎相同


正如中所指出的,这可能会影响eval()调用。如果对字符串对象调用Eval,则返回对象“2+2”,如果对原语调用Eval,则返回4

new String()
第二部分是冗余注意,在数字2中,您将覆盖第一个赋值。一个是对象,另一个是基元。+1表示实际引用。它几乎解释了所有需要知道的事情。“有点令人困惑”——如果没有字符串对象,就不会有
'str'.length
和其他与包装器相关的东西working@zerkms:虽然这是事实,但这只是一种语言机制。在一天结束时,99.9%的时间里,你可以(也应该)在必要时使用自动升级的原语。说得好,@zerkms,但也许他建议它们都应该是自动升级的对象。@T.J.Crowder:谢谢你,先生。我是JS的初学者。我几乎完成了JavaScript的基本内容。但我不明白我该怎么做。我很困惑我该如何提高我的技能和感觉。请告诉我一个合适的结构化方法,这样我就能更好地使用javaScript。如果你提出建议,那会很有帮助的。谢谢你again@skipperkhan:不用担心。我不确定我能不能,但读一些关于JavaScript的好书(比如大卫·弗拉纳根的JavaScript:权威指南)和一些在线材料(可能包括——非常小的类别——)是非常值得的。JavaScript的一大特点是它的类型松散,这一点您可能并不清楚(基于这个问题)。一个变量就是一个变量,它可以包含任何东西,它可以在不同的时间包含不同的东西(对象、数字等等)。