2011-05-23 113 views
2

使用jQuery Cookies插件,我設置了一個cookie,其值是一個數字。這個數字爲什麼是一個字符串?

$.cookie('xyz_id','1'); 

我需要使用這個數字來獲取HTML中元素的索引。

var $curr = $.cookie('xyz_id'); 
var $el = $('#main li:eq($curr)'); 

$ curr的輸出是1.那麼爲什麼typeOf()$ curr顯示爲字符串而不是數字?我嘗試使用parseInt()將其轉換爲數字失敗。不知道這是怎麼回事....

回答

10

行情做一個變量的字符串:

'1' 

然而,在這種情況下,cookie是有效的字符串:

要讀出你的cookie必須將 document.cookie視爲字符串,並搜索 以獲取某些字符(例如分號, )和cookie名稱。

http://www.quirksmode.org/js/cookies.html

相反,這樣做:

​​

然後,讀值回來的時候,將它轉換回用parseInt()數值。

var xyz_id = parseInt($.cookie('xyz_id')); 

應該創建一個數值。

此外,parseInt應該工作(在合理的範圍內)從字符串中類型化一個數字。請參閱:

var i = "1"; 
alert(typeof i); 
i = parseInt(i); 
alert(typeof i); 

http://jsfiddle.net/CqBw6/

+1

這是正確的。 '1'是一個字符串。 1是一個數字。 – quest 2011-05-23 02:35:44

+0

正如我在下面的其他答案中所說的那樣,總是在'parseInt'中使用radix參數,這會讓Javascript猜測出您想要解析的數字的基礎是一種糟糕的做法。 – HoLyVieR 2011-05-23 02:54:56

+0

幸運的是,這是一個普遍的事實。像ruby/js/python等語言將有相同的問題。您可以隨時使用螢火蟲console.log輸出並查看對象的類型。 – 2011-05-23 04:00:22

-3

我想你應該改變$.cookie('xyz_id','1');$.cookie('xyz_id',1);,如果它仍然是一個字符串,可以使用eval()函數,使之成爲數字。

[X]

+2

使用parseInt()將一個像這樣格式化的字符串變成一個數字。僅使用eval()作爲最後的手段。 – 2011-05-23 02:38:52

0

的答案以上在這裏做保存字符串一個cookie,而不是一個整數的解決這一問題。您也可以將字符串強制爲整數,反之亦然。

parseInt('1'); //1 

您可以檢查是否一個整數是真的isNaN()

var n = parseInt('1'); 
if(!isNaN(n)){ 
    //Horray we have an integer 
} 
+1

請始終在'parseInt'上使用radix參數。這不是一個不好的做法。 'parseInt(「1」,10)'是這樣做的正確方法。 – HoLyVieR 2011-05-23 02:48:15

+0

是的10可以防止它意外地將字符串視爲十六進制或八進制,但它不會阻止它刪除字符串中帶有數字和字符的字符。所以我不會說離開10是一個不好的做法,它不包括使用parseInt時可能出錯的所有事情。使用此功能有許多問題 – Drew 2011-05-23 02:59:03

+0

包括radix參數並不能解決所有問題,因此不應該提出異議,您應該使用它。 – 2011-05-23 17:07:17

2

使用parseInt(str,10)創建爲其他建議。

你也應該建立你的選擇時,使用字符串連接:

var $el = $('#main li:eq('+$curr+')'); 

它也是一致性和代碼的可讀性只使用jQuery的對象,而不是字符串或數字$something變量名很好的做法。

+0

甚至更​​好,永遠不要使用$名稱。特別是如果你的後端是在PHP中(我瞭解到一次硬的方式... 5000行的經典JavaScript,隨後再加上PHP,然後再加上jQuery ... urk)。 – 2011-05-23 03:14:03

+0

哦,+1確保使用parseInt的基數。 – 2011-05-23 03:16:09

0

感謝您的答案。我最初的困難是由於我沒有將parseInt()放在$ curr變量中。咄。

這很奇怪 - 我不知道爲什麼從第二個參數中刪除引號仍然返回一個字符串。

$.cookie('xyz_id', 2); 

$.cookie('xyz_id', '2'); 

返回字符串。

+0

他們不返回字符串。它們確實導致字符串被最終調用到'$ .cookie('xyz_id')'返回。 :) – 2011-05-23 17:05:58

1

這其實已經很少做,你通過一個數字對jQuery插件的cookie,但事實上,因爲即使你通過文字1,它不會一直保持非字符串很長!

Cookie值存儲在內部,基本上是字符串。這個值進入HTTP標題並通過最終用戶的瀏覽器,因此遠離Javascript類型系統。

幸運的是,由於Javascript是動態類型的,它應該沒有關係。如果該值是表示數字,你可以自由地將它轉換回數字類型:

var value = $.cookie('name'); 
alert(parseInt(value, 10)); // note: specify the radix! 

不過,我不會理會,因爲你將要相連來直背到一個字符串:

var $el = $('#main li:eq(' + value + ')'); 

或者,要利用現代瀏覽器的效率,你可以這樣做:

var $el = $('#main li').eq(parseInt(value, 10)); // I recommend this version 

有一個CLU E在the plugin's source

document.cookie = [name, '=', encodeURIComponent(value), expires, path, domain, secure].join(''); 

cookieValue = decodeURIComponent(cookie.substring(name.length + 1)); 

Cookie的名稱/值對都是 「字符串」。

+0

感謝您的偉大的cookie解釋 – Adam 2011-05-23 17:03:08

+0

@亞當:沒問題。 – 2011-05-23 17:04:49

相關問題