JavaScript: 字符串 vs. 对象

6

我浏览了stackoverflow上所有的问题和答案,但是没有找到一个简单的答案。

string和object的区别是什么?

例如,如果我有以下代码:

var a = 'Tim';
var b = new String('Tim');

到底有什么区别呢?

我知道new会使代码复杂,而new String会使它变慢。

同时,我知道a==btrue,但更严谨的比较方式a===b则是false。为什么呢?

我好像无法理解对象和字符串创建背后的过程。 例如:

var a = new String ('Tim');
var b = new String ('Tim');

a==b 的结果是 false


区别在于"test"是一个字符串,而new String("test")是一个对象。这就是为什么"test" !== new String("test")new String("test")是一个字符串的包装对象。 - dfsq
明白了。您能否详细介绍一下对象和字符串创建的逻辑,并将答案发布出来?谢谢。 - super11
a == btrue,因为 == 运算符会强制转换类型以匹配(尽可能最佳),而 === 运算符用于显式比较类型。 - Rory McCrossan
3个回答

6

a 是字符串类型,而 b 是对象类型。

=== 包括类型检查和字符串不是一个对象的原因,所以 a === b 会返回 false

new String ('Tim') === new String ('Tim') 也会返回 false,因为它们是不同的对象。


1
即使 new String ('Tim') == new String ('Tim')(宽松比较)也是错误的,因为比较的是对象引用。尽管对象包含相似的数据,但它们是不同的对象。在宽松或严格比较中,对象的属性没有进行深度比较。 - GolezTrol
谢谢。为什么使用 new 会减慢进程?因为对象创建的原因吗? - super11
2
@super11 是的,因为对象创建,但也因为它的使用。一个字符串的对象包装器比一个“简单”的字符缓冲区略慢一些,尽管差异非常小,几乎不应该成为你做出决定的原因。使用你认为最适合你的东西。 - GolezTrol
1
来自WC3:JavaScript对象不能进行比较。谢谢。 - super11

3

对于普通字符串来说,无需创建对象,只需创建变量并赋值即可。

至于你关于为什么 == 是 true 而 === 是 false 的问题,原因是:

== 比较值

=== 比较值和类型(一个是字符串,一个是对象)。

另一个例子:

var a = 1;

var b = '1';

a == b //true,因为它们的值相同

a === b //false,因为一个是字符串,一个是整数


谢谢,我不知道a==b会输出true,而a===b则为false。 - super11

1
您可以通过以下方式查看差异:

var a = "foo";
var b = new String("foo");
console.log(a);
console.log(b);

enter image description here

第一个是字符串字面量,第二个是String对象。这就是为什么当它们进行比较时它们不相等,但当您比较它们的值时它们是相等的。您可以在这里阅读更多关于字面量的内容。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接