Implementasi Penyimpanan Firefox hanya dapat menyimpan string, tetapi pada September 2009 , W3C memodifikasi draf untuk menerima data apa pun.Implementasinya (masih) belum selesai( lihat Edit di bawah ).
Jadi dalam kasus Anda, boolean diubah menjadi string.
Adapun alasannya "true" != true
, seperti yang tertulis pada uraian Equal ( ==
) di MDC *:
Jika kedua operan tidak berjenis sama, JavaScript mengonversi operan tersebut lalu menerapkan perbandingan yang ketat. Jika salah satu operan adalah bilangan atau boolean, operan akan diubah menjadi bilangan jika memungkinkan; else jika salah satu operan adalah string, operan lainnya akan diubah menjadi string jika memungkinkan.
Perhatikan bahwa string diubah menjadi Angka, bukan Boolean . Karena "true"
diubah menjadi angka NaN
, itu tidak akan sama dengan apa pun, jadi false
dikembalikan.
(*: Untuk standar aktual, lihat ECMA-262 §11.9.3 "Algoritma Perbandingan Kesetaraan Abstrak")
Edit: The setItem
antarmuka itu dikembalikan untuk menerima string hanya pada 2011 September 1 rancangan untuk mencocokkan perilaku implementasi yang ada, karena tidak ada vendor yang tertarik dalam mendukung menyimpan non-string. Lihat https://www.w3.org/Bugs/Public/show_bug.cgi?id=12111 untuk detailnya.
Untuk saat ini, semua implementasi Safari , WebKit, Chrome, Firefox dan IE , mengikuti versi lama standar WebStorage, di mana nilai item penyimpanan hanya berupa string.
Pilihannya adalah menggunakan JSON
parse
danstringify
metode untuk membuat serial dan deserialisasi data, seperti yang saya sarankan beberapa waktu lalu di pertanyaan lain , misalnya:sumber
value
bukan JSON yang valid (misalnyaJSON.parse("a random string")
)Solusi saya:
sumber
true == 'true'
itufalse
.localStorage.getItem(pre)==='true'
tanpa sisaIni terkait dengan jawaban CMS.
Berikut adalah fungsi kecil yang telah saya gunakan untuk menangani bagian penguraian dari masalah ini (fungsi tersebut akan terus melakukan Hal yang Benar setelah implementasi browser mengikuti spesifikasi, jadi tidak perlu ingat untuk mengganti kode nanti):
sumber
Gunakan store.js :
↓
sumber
Saya tidak yakin apakah LocalStorage dapat menyimpan nilai boolean tetapi saya dapat memberi tahu Anda bahwa ketika Anda melakukannya,
alert("true" == true);
itu tidak akan pernah dievaluasi menjadi true karena Anda secara implisit membandingkan string dengan boolean. Itulah mengapa menyetel nilai boolean yang Anda gunakan,true
bukan"true"
.sumber
"1" === 1
akan benar-benar mengembalikan false.eval
juga dapat digunakan dengan hati - hati dalam beberapa kasus.sumber
eval
karena tidak aman. Lebih sukaJSON.parse("true")
.Apa yang biasanya saya lakukan hanyalah menyimpan nilai di LocalStore sebagai Boolean, dan kemudian mengambilnya dengan metode parsing, untuk memastikannya untuk semua browser. Metode saya di bawah ini disesuaikan untuk logika bisnis saya. Kadang-kadang saya mungkin menyimpan sesuatu sebagai 'tidak' dan masih perlu
false
sebagai balasannyasumber