JavaScript字符串未正确评估?

时间:2011-08-19 17:03:44

标签: javascript jquery

使用jQuery和jQuery URL插件。

我有以下代码:

$('#secondary-nav > li > ul > li > a').each( function() {
    var aHref = new String( $(this).attr('href') );
    alert (aHref);
    var wUrl = new String( $.url().attr('file') );
    alert (wUrl);
    alert ( aHref === wUrl );
});

aHref和wUrl都是字符串对象(我已使用instanceof确认)。但比较结果却是错误的。代码在“pageA.html”上,其中一个锚点的href是“pageA.html”,但它永远不会评估为真。

5 个答案:

答案 0 :(得分:6)

Javascript在字符串和String 对象之间产生了令人困惑的区别。更令人困惑的是,它们在许多情况下都是可以互换的; ===是少数几个真正有所作为的案例之一。对于对象===测试双方是否是相同的对象,由一个特定的构造函数调用创建。另一方面,字符串按内容进行比较。

使用new String(...)明确要求从提供给构造函数的值中获取实际的String 对象。这意味着当您稍后比较它们时,您会对===有严格的认识。

要解决您的问题,只需忽略代码中的new String即可。

答案 1 :(得分:2)

无需创建新的String对象,只需将其替换为var aHref = $(this).attr('href');即可。你不能轻易地比较对象,因为你可以比较简单的字符串。如果您不创建新对象,aHref === wUrl将评估为true

在比较对象时,它们通常会转换为相同的类型,在大多数情况下是字符串(比较字符串和整数等),但如果它们都是相同的类型(在您的情况下为String),则它们不是简单的字符串,而是对象,在这种情况下它们是不同的对象。这是因为引用对象的变量引用特定的对象实例(类似于其他语言中的指针)。由于您正在处理两个不同的对象(它们可能具有相同的构造器参数,但仍然分别位于内存中),=====都将计算为false。同样aHref.toString() === wUrl.toString()将被评估为true,因为它们首先被转换为简单字符串,在这种情况下它们不代表对象,而是它的字符串化表示。

答案 2 :(得分:2)

比较两个对象时,javascript会查看它们实际上是否是同一个对象,而不是它们看起来是否相同。因此{foo:'bar'} == {foo:'bar'}将评估为false

如果您想按值比较字符串,则必须使用字符串基元:var aHref = $(this).attr('href')& var wUrl = $.url().attr('file')


如果出于某种奇怪的原因,你坚持使用String构造函数创建字符串,可以将它们强制转换为基元:

alert ( aHref.toString() === wUrl.toString() );

答案 3 :(得分:0)

使用:alert ( aHref == wUrl );,不比较TYPE。或者你可以强制使用字符串:

( aHref+'' === wUrl+'' )

答案 4 :(得分:0)

你能在一个例子中发布aHref和wUrl的内容吗?

如果字符串严格相等(即相同顺序的字符数相同),

===将返回true