JavaScript字符串计算不正确?
使用jQuery和jQuery URL插件 我有以下代码:JavaScript字符串计算不正确?,javascript,jquery,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
$('#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”,但其计算结果永远不会为true。无需创建新的字符串对象,您只需将其替换为
var aHref=$(this.attr('href')代码>。您不能像比较简单字符串那样轻松地比较对象。如果不创建新对象,aHref===wUrl
将计算为true
在比较对象时,它们通常被转换为相同的类型,在大多数情况下是string(比较string和int等),但如果它们都是相同的类型(string
,在您的情况下),它们不会作为简单字符串进行比较,而是作为对象进行比较,在这种情况下,它们是不同的对象。这是因为引用对象的变量引用特定的对象实例(类似于其他语言中的指针)。由于您正在处理两个不同的对象(它们可能具有相同的构造函数参数,但仍分别位于内存中),==
和=
都将计算为false
。另外,aHref.toString()==wUrl.toString()
,将被计算为true
,因为它们首先被转换成简单的字符串,在这种情况下,它们并不表示对象,而是表示对象的字符串化表示。无需创建新的字符串对象,只需将它们替换为var aHref=$(此).attr('href')代码>。您不能像比较简单字符串那样轻松地比较对象。如果不创建新对象,aHref===wUrl
将计算为true
在比较对象时,它们通常被转换为相同的类型,在大多数情况下是string(比较string和int等),但如果它们都是相同的类型(string
,在您的情况下),它们不会作为简单字符串进行比较,而是作为对象进行比较,在这种情况下,它们是不同的对象。这是因为引用对象的变量引用特定的对象实例(类似于其他语言中的指针)。由于您正在处理两个不同的对象(它们可能具有相同的构造函数参数,但仍分别位于内存中),==
和=
都将计算为false
。另外,aHref.toString()==wUrl.toString()
将被计算为true
,因为它们首先被转换为简单字符串,在这种情况下,它们不表示对象,而是表示对象的字符串化表示。使用:警报(aHref==wUrl)代码>不比较类型
。或者您可以强制字符串:
( aHref+'' === wUrl+'' )
使用:警报(aHref==wUrl)代码>不比较类型
。或者您可以强制字符串:
( aHref+'' === wUrl+'' )
你能把aHref和wUrl放在一个例子里吗
===如果字符串严格相等(即相同顺序中的相同字符数),则返回true您能在示例中公布aHref和wUrl是什么吗
===如果字符串严格相等(即相同顺序的相同字符数),则返回true比较两个对象时,javascript将查看它们是否实际上是相同的对象,而不是它们是否看起来相同。因此,{foo:'bar'}=={foo:'bar'}
将计算为false
如果要按值比较字符串,则必须使用字符串原语:var aHref=$(this.attr('href')
&var wUrl=$.url().attr('file')
如果出于某种奇怪的原因,您坚持使用字符串构造函数创建字符串,您可以将它们强制为基本体:
alert ( aHref.toString() === wUrl.toString() );
当比较两个对象时,javascript将查看它们是否实际上是相同的对象,而不是它们是否看起来相同。因此,{foo:'bar'}=={foo:'bar'}
将计算为false
如果要按值比较字符串,则必须使用字符串原语:var aHref=$(this.attr('href')
&var wUrl=$.url().attr('file')
如果出于某种奇怪的原因,您坚持使用字符串构造函数创建字符串,您可以将它们强制为基本体:
alert ( aHref.toString() === wUrl.toString() );
Javascript混淆地区分了字符串值和字符串对象。更令人困惑的是,它们在许多情况下是可互换的=
是为数不多的几个实际起作用的案例之一。对于对象,==
测试两边是否是由一个特定构造函数调用创建的相同对象。另一方面,字符串值按内容进行比较
使用新字符串(…)
可以明确地要求从传入构造函数的值中获取实际的字符串对象。这意味着您在以后比较它们时会得到严格意义上的==
要解决您的问题,只需从代码中省略新字符串
。Javascript会混淆地区分字符串值和字符串对象。更令人困惑的是,它们在许多情况下是可互换的=
是为数不多的几个实际起作用的案例之一。对于对象,==
测试两边是否是由一个特定构造函数调用创建的相同对象。另一方面,字符串值按内容进行比较
使用新字符串(…)
可以明确地要求从传入构造函数的值中获取实际的字符串对象。这意味着您在以后比较它们时会得到严格意义上的==
要解决您的问题,只需从代码中省略新字符串
。出于兴趣,如果您使用==而不是==,它们是否比较正确?出于兴趣,如果您使用==而不是==?+1来进行比较,它们是否比较正确