我的问题在下面举例说明
1号:
1号:
var myString = new String('foo');
如果我使用console.log(myString);
输出为String {0 =“f”,1 =“o”,2 =“o”}
和数字2:
var myString = new String(); myString = "foo";
这里是console.log(mystring);打印只是foo
这里有1号和2号之间有什么区别?为什么输出不一样?
解决方法
这个说法:
var myString = new String('foo');
…创建一个用字符f,o和o初始化的字符串对象.
这个说法:
var myString = new String();
…创建一个没有字符的字符串对象,但这并不重要,因为这个语句:
myString = "foo";
…将该字符串对象抛出,并用这些字符替换一个新的原始字符串的变量的值.最终结果与以下内容完全相同:
var myString = "foo";
console.log输出的不同之处在于提供console.log的浏览器正在尝试清楚其中的一个是一个对象,另一个是原语.
有点混乱,JavaScript有两个字符串对象和字符串原语. (它也有数字对象和数字原语.)几乎没有任何理由使用新的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"
…但是如果您使用===,这不会做任何类型的强制,那将是不正确的.
你可能会问:
So if
var myString = "foo"
returns a primitive,not an object,how is it thatmyString.toUpperCase()
and such work?