JavaScript的字符串比较

4

我正在尝试比较以下格式:

var u=new String('test');
var t=new String('test');

当我检查 (u==t) 或 (u===t) 时,它返回 false

同样地,如果我尝试执行

var u=new String();
var t=new String();
u='test';t='test';

现在,(u==t) and (u===t) 返回 true

4
使用 String 构造函数创建的前两个是对象,在JS中无法直接比较对象。后两个先被创建为对象,然后被 String 覆盖,因此可以比较。 - Tushar
在使用new String()定义u='test';t='test';后,您现在将两个变量都设置为具有值“test”的原始字符串。 - Will
在第一种情况下,您正在比较不同的字符串对象。在第二种情况下,您正在比较字符串字面值。 - user663031
对象,包括 new String 实例,是通过它们的身份进行比较的,每个创建的 new 实例都是不同的。因此,两个不同的对象永远不可能相等。原始类型,就像您在第二个示例中使用的那样(对象被替换而不是修改),是通过它们的值进行比较的。 - Jonathan Lonowski
5个回答

3

当使用==比较两个对象(例如,使用new String()创建的对象)时,背后会使用===。这使得

u == t 

等同于

u === t

由于它们是两个不同的对象,所以结果始终为false。

然而,当您使用字符串文字时,您正在创建原始数据,它们的比较是通过value而不是引用来完成的。这就是为什么u==t返回true,如评论中所述。


2

第一个比较是使用String构造函数比较对象引用,而第二个例子中,您正在将u和t值重新初始化为字符串字面量。第一个比较实际上是比较引用,而第二个比较实际上是比较值。如果您想按值比较第一个示例,则可以像这样比较String对象的值。

u.valueOf() === t.valueOf();

1
使用new String构造函数创建的是对象而不是字符串,因此当你比较它们时,它们不相等。
var t = new String("testing");
typeof t;
// "object"

var u = "testing";
typeof u;
// "string"

t == u
// false

然而,如果您比较它们的字符串值:
t.toString() == u.toString()
// true

他们会的。


1
你正在使用 new String() 创建新的对象,并参考了 MDN 的比较运算符

如果两个操作数都是对象,则 JavaScript 比较内部引用,当操作数引用同一内存中的同一对象时相等。


1

基本上在第一种情况下,您正在创建对象。因此,与对象进行比较,使用===,因此它始终返回false

在第二种情况下,您在前两行中使用空字符串执行相同的操作。

var u=new String();
var t=new String();

使用 console.dir(u) 查看。
但是在最后一行 u='test';t='test'; 你用字符串基础值覆盖了 u、t 的值。所以它只是比较 test 的值。

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