2010-07-16 218 views
65

我注意到我不能在localStorage中設置布爾值?無法在LocalStorage中設置布爾值?

localStorage.setItem("item1", true); 
alert(localStorage.getItem("item1") + " | " + (localStorage.getItem("item1") == true)); 

總是提醒true | false當我嘗試測試localStorage.getItem("item1") == "true"它提醒真...所以沒有辦法,我可以在localStorage設置項爲真?

即使它的一個字符串,我想只有===會檢查類型?

所以

alert("true" == true); // shld be true? 

回答

35

Firefox's implementation of Storage只能存儲字符串,但在2009 September上,W3C修改了草案以接受任何數據。 執行(仍)尚未趕上請參閱編輯以下)。

所以在你的情況下,布爾值被轉換爲一個字符串。

至於爲什麼"true" != true,寫在the description of Equal (==) in MDC *:

如果兩個操作數是相同類型的不是,JavaScript的轉換操作數則實行嚴格的比較。如果任一操作數是數字或布爾值,則儘可能將操作數轉換爲號碼;否則,如果其中一個操作數是一個字符串,則另一個操作數將盡可能轉換爲字符串。

注意該字符串轉換爲而不是布爾。由於"true"轉換爲一個數字是NaN,它不會等於任何東西,所以返回false

(*:實際標準見ECMA-262 § 11.9。3「摘要相等比較算法」)


編輯:setItem接口被恢復爲僅接受在2011 Sept 1st draft串以匹配現有的實現的行爲,因爲沒有供應商的有興趣支持存儲非字符串。詳情請參閱https://www.w3.org/Bugs/Public/show_bug.cgi?id=12111

+1

*如果任一操作數是數字或布爾值,則操作數將轉換爲**數字**如果可能的話*我完全沒有意識到這一點。我想如果一個是一個字符串,另一個是投到一個字符串。乾杯(+1)。 – 2010-07-16 09:01:20

+2

@安迪,請檢查這個[有用的註釋](http://dmitrysoshnikov.com/notes/note-2-ecmascript-equality-operators/)。 – CMS 2010-07-16 16:00:40

+0

@CMS:謝謝,很棒的閱讀。 – 2010-07-16 16:15:52

1

我不知道如果localStorage的可以節省布爾值,但我可以告訴你,當你做alert("true" == true);它永遠不會計算爲true,因爲你是比較含蓄的字符串爲布爾值。這就是爲什麼要設置布爾值,您使用true而不是"true"

+1

什麼警報(「1」 == 1)? Javascript是一個奇怪的(而且不一致的)討厭的人。 – spender 2010-07-16 08:45:22

+2

@安迪:不,它不是。 – kennytm 2010-07-16 08:47:28

+0

@spender:這是因爲右操作數被轉換爲字符串進行比較。 '「1」=== 1'實際上會返回false。 – 2010-07-16 08:49:42

54

目前,所有的實施方式中Safari,WebKit的,Chorme,FirefoxIE跟隨的WebStorage標準,其中,存儲項目的值只能是串的old version

一種選擇是使用JSON parsestringify方法連載反序列化的數據,我認爲前一段時間在another question,例如:

var value = "true"; 
JSON.parse(value) === true; // true 
+1

如果在'value'中傳遞的字符串不是有效的JSON(例如'JSON.parse(「隨機字符串」)'),那麼這顯然會中斷。) – 2014-12-06 10:40:51

+3

True @AdonisK。但是,如果他在設置所有值時使用JSON.stringify,則他可以將輸出有效JSON的責任卸載到庫中。這是一個非常穩定的圖書館。 – 2015-02-10 21:18:49

4

[想將這個意見加到CMS的答案上,但我想我還沒有被允許。 :-P]

這裏有一個小函數我一直用來處理這個問題的解析部分(在瀏覽器實現趕上規範之後,函數將繼續做正確的事情,所以不需要記住後來更改了代碼):

function parse(type) { 
    return typeof type == 'string' ? JSON.parse(type) : type; 
} 
+1

與JSON.parse相比,這不是沒有必要嗎? JSON.parse(「true」)和JSON.parse(true)已經都返回true,所以在瀏覽器實現後仍然會做正確的事情boolean localstorage – bscan 2017-04-22 22:50:42

3

我的解決方案:

function tytPreGetBool(pre) { 
    return localStorage.getItem(pre) == 'true' ? true : false; 
} 
+0

爲什麼這是低調的? – koppor 2017-07-06 14:00:28

+0

@koppor也許是因爲如果getItem會返回一個布爾值,那麼這個方法會產生錯誤的結果,因爲'true =='true''是'false'。 – jox 2017-12-05 15:11:35

1

eval也可以在某些情況下,仔細使用

console.log(eval("true") === true) //true 
1

使用store.js

localStorage.setItem('isUser', true) 
localStorage.getItem('isUser') === "true" //true 
npm i -D store 

store.get('isUser') //true 
0

我最常做的就是保存爲布爾在LocalStore的值,然後用解析方法來檢索,只是確保所有瀏覽器。我的方法是根據我的業務邏輯進行定製的。有時候,我會水木清華存儲爲「不」,但還是需要false回報

function toBoolean(str) { 
    if (typeof str === 'undefined' || str === null) { 
     return false; 
    } else if (typeof str === 'string') {   
     switch (str.toLowerCase()) { 
     case 'false': 
     case 'no': 
     case '0': 
     case "": 
      return false; 
     default: 
      return true; 
     } 
    } else if (typeof str === 'number') { 
     return str !== 0 
    } 
    else {return true;} 
}