2011-08-19 138 views
1

使用jQuery和jQuery URL插件。未正確評估JavaScript字符串?

我有以下代碼:

$('#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。

+1

出於興趣,如果您使用==而不是===,他們會比較正確嗎? –

回答

6

的Javascript區別,容易混淆,字符串之間字符串對象。更令人困惑的是,它們在許多情況下是可以互換的; ===是爲數不多的情況之一。對於對象,===測試雙方是否爲相同的對象,由一個特定的構造函數調用創建。字符串,另一方面,按內容比較。

使用您的new String(...),您明確要求從提供給構造函數的值中獲取實際的字符串對象。這意味着當您稍後進行比較時,您會得到嚴格的===意義。

要解決您的問題,只需從代碼中省略new String即可。

+0

+1來演示,試試''foo「=== new String(」foo「)',結果應該是'false'(令人困惑)。 – maerics

+0

感謝您的澄清,但我發現這只是我的一個愚蠢的錯字。 – jkinz

2

沒有必要創建一個新的String對象,你可以簡單地用var aHref = $(this).attr('href');替換它們。您可以輕鬆比較對象,因爲您可以比較簡單的字符串。如果您不創建新對象,aHref === wUrl將評估爲true。當比較對象時,它們通常會轉換爲相同類型,在大多數情況下,它們是字符串(比較字符串和int等),但如果它們都是相同類型(您的情況爲String),則不會進行比較作爲簡單的字符串,而是對象,在這種情況下,它們是不同的對象。這是因爲引用對象的變量引用特定對象實例(類似於其他語言中的指針)。由於您正在處理兩個不同的對象(它們可能具有相同的構造函數參數,但仍分別位於內存中),所以=====都將計算爲false。也aHref.toString() === wUrl.toString(),將被評估爲true,因爲它們首先被轉換成簡單的字符串,在這種情況下,它們不代表對象,但它的字符串表示。

0

使用:alert (aHref == wUrl);哪個不比較TYPE。或者你可以強制字符串:

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

你可以發佈一個例子中的aHref和wUrl嗎?如果字符串嚴格相等(即相同數量的相同順序字符的)

2

當比較兩個對象,JavaScript就看看如果其實都是同一個對象

===將返回true ,如果它們看起來一樣,則不是。因此{foo:'bar'} == {foo:'bar'}將評估爲false

如果要按值比較字符串,則必須使用字符串基元:var aHref = $(this).attr('href') & var wUrl = $.url().attr('file')


如果出於某種奇怪的原因,你堅持使用String構造函數創建的字符串,就可以強迫他們到原語:

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