使用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”,但它永远不会评估为真。
答案 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