LocalStorage'da boole değerleri ayarlanamıyor mu?


112

İçinde boole değerlerini ayarlayamadığımı fark ettim localStorage?

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

true | falseTest etmeye çalıştığımda her zaman uyarı veriyor localStorage.getItem("item1") == "true"doğru ... Bir öğeyi nasıl true olarak ayarlayabilirim localStorage?

Bir dizge olsa bile, sadece ===türünü kontrol edeceğimi düşündüm.

Yani

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

Yanıtlar:


69

Firefox'un Depolama uygulaması yalnızca dizeleri depolayabilir, ancak Eylül 2009'da W3C herhangi bir veriyi kabul etmek için taslağı değiştirdi.Uygulama (hala) henüz yakalanmadı( Aşağıdaki düzenleme bölümüne bakın ).

Yani sizin durumunuzda boole bir dizeye dönüştürülür.

MDC'deki * Equal ( ) açıklamasında"true" != true yazıldığı gibi neden gelince :==

İki işlenen aynı türde değilse, JavaScript işlenenleri dönüştürür ve ardından katı karşılaştırma uygular. İşlenenlerden biri sayı veya mantıksal ise, işlenenler mümkünse sayılara dönüştürülür ; başka işlenenlerden biri bir dizge ise, diğer işlenen mümkünse dizgeye dönüştürülür.

Dize bir dönüştürülür geldiğini hatırlatırız Numarası yerine Boolean . Yana "true"bir sayıdır dönüştürülür NaN, bu yüzden herhangi bir şey eşit olmayacaktır falsedöndürülür.

(*: Gerçek standart için bkz. ECMA-262 §11.9.3 "Soyut Eşitlik Karşılaştırma Algoritması")


Düzenleme:setItem arayüz yalnızca dizeleri kabul etmek dönülmüştür 2011 1 Eylül taslak satıcılarının hiçbiri depolamak olmayan dizeleri destekleyen ilgilenen gibi, mevcut uygulamaların davranışını eşleşecek. Ayrıntılı bilgi için https://www.w3.org/Bugs/Public/show_bug.cgi?id=12111 adresine bakın .


2
İşlenenlerden biri bir sayı veya mantıksal ise, işlenenler mümkünse sayılara dönüştürülür - bunu tamamen anlamadım. Biri bir ipse, diğeri bir dizgiye atılır diye düşündüm. Şerefe (+1).
Andy E

2
@Andy, konuyla ilgili bu yararlı notlara bir bak .
CMS

91

Şu an için tüm uygulamaları Safari , WebKit, Krom, Firefox ve IE , bir takip ediyor eski sürümü depolama öğelerinin değeri yalnızca bir dize olabilir WebStorage standart,.

Bir seçenek , bir süre önce başka bir soruda önerdiğim gibi, verileri seri hale getirmek ve seri durumdan çıkarmak için JSON parseve stringifyyöntemi kullanmak olabilir , örneğin:

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

4
Bu, aktarılan dizge valuegeçerli JSON değilse (örneğin JSON.parse("a random string")) açıkça kırılacaktır
Adonis K.Kakoulidis

3
Doğru @AdonisK. Ancak, tüm değerleri ayarlarken JSON.stringify kullanıyorsa, o zaman kütüphaneye geçerli JSON çıktısı verme sorumluluğunu kaldırabilir. Ve bu çok kararlı bir kitaplıktır.
Colt McCormack

11

Çözümlerim:

function tytPreGetBool(pre) {
    return localStorage.getItem(pre) === 'true';
}

2
@koppor Belki de getItem bir boole değeri döndürürse, bu yöntem yanlış sonuçlar verecektir, çünkü true == 'true'is false.
jox

8
..ya localStorage.getItem(pre)==='true'da geri kalanı olmadan düz
phil294

1
@koppor bu neden olumsuz oy aldı? çünkü kendini beğenmiş istifleyiciler taşıyor, kelimenin tam anlamıyla :)
Ayyash

1
localStorage.getItem (pre) == 'true' zaten size boolean bir sonuç verdiğinden "? true: false" gereksizdir
FelipeDrumond

6

Bu, CMS'nin cevabı ile ilgilidir.

İşte bu sorunun ayrıştırma kısmını işlemek için kullandığım küçük bir işlev (işlev, tarayıcı uygulamaları spesifikasyonu yakaladıktan sonra Doğru Şeyi yapmaya devam edecek, bu nedenle kodu daha sonra değiştirmeyi hatırlamanıza gerek yok):

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

1
JSON.parse ile karşılaştırıldığında bu gereksiz değil mi? JSON.parse ("true") ve JSON.parse (true) zaten her ikisi de true döndürüyor, bu nedenle tarayıcılar boolean localstorage uyguladıktan sonra da doğru olanı yapacak
bscan

3

Store.js kullanın :

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

store.get('isUser')  //true

4
Ancak, bu basit dizeden boole'ye dönüştürme görevi için bütün bir kitaplığı dahil etmek gerçekten gerekli mi?
jayqui

1

LocalStorage'ın boole değerlerini kaydedip kaydedemeyeceğinden emin değilim, ancak bunu yaptığınızda alert("true" == true);hiçbir zaman doğru olarak değerlendirilmeyeceğini söyleyebilirim çünkü bir dizeyi dolaylı olarak bir boole ile karşılaştırıyorsunuz. Bunun trueyerine kullandığınız boole değerlerini ayarlamanızın nedeni budur "true".


1
Peki ya uyarı ("1" == 1)? Javascript garip (ve tutarsız) bir canavar.
harcayan

@spender: Bunun nedeni, doğru işlenenin karşılaştırma için bir dizeye dönüştürülmesidir. "1" === 1aslında yanlış döndürür.
Andy E

@Kenny: whoops facepalm , düzeltme için teşekkürler :-) Booleanların dizelere nasıl dönüştürüldüğünden dolayı karıştım .
Andy E

1

evalayrıca bazı durumlarda dikkatlice kullanılabilir .

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

evalGüvensiz olabileceğinden kaçının . Tercih et JSON.parse("true").
Fred

1

Genelde yaptığım şey, LocalStore'daki değeri bir Boolean olarak kaydetmek ve ardından tüm tarayıcılardan emin olmak için bir ayrıştırma yöntemiyle almaktır. Aşağıdaki yöntemim iş mantığıma göre özelleştirilmiştir. Bazen 'hayır' olarak saklayabilirim ve falsekarşılığında yine de ihtiyacım olabilir

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;}
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.