लोकलस्टोरेज में बूलियन मान सेट नहीं कर सकते?


112

मैंने देखा कि मैं बूलियन मूल्यों को निर्धारित नहीं कर सकता हूं localStorage?

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

हमेशा अलर्ट true | falseजब मैं localStorage.getItem("item1") == "true"इसे सच करने के लिए अलर्ट का परीक्षण करने की कोशिश करता हूं ... मैं किसी आइटम localStorageको सच में कैसे सेट कर सकता हूं ?

यहां तक ​​कि अगर यह एक स्ट्रिंग है, मैंने सोचा कि केवल ===प्रकार की जांच करेगा?

इसलिए

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

जवाबों:


69

फ़ायरफ़ॉक्स के भंडारण का कार्यान्वयन केवल तार को स्टोर कर सकता है, लेकिन 2009 सितंबर को , W3C ने किसी भी डेटा को स्वीकार करने के लिए मसौदे को संशोधित किया।कार्यान्वयन (अभी भी) अभी तक पकड़ा नहीं गया है( नीचे संपादित देखें )।

तो आपके मामले में बूलियन को एक स्ट्रिंग में बदल दिया जाता है।

जैसा कि क्यों "true" != true, जैसा कि एमडीसी * में समान ( ==) के विवरण में लिखा गया है :

यदि दो ऑपरेंड एक ही प्रकार के नहीं हैं, तो जावास्क्रिप्ट ऑपरेंड्स को परिवर्तित करता है, फिर सख्त तुलना लागू करता है। यदि या तो ऑपरेंड एक नंबर या बूलियन है, तो ऑपरेंड संभव होने पर नंबर में बदल जाते हैं ; या तो अगर ऑपरेंड एक स्ट्रिंग है, तो अन्य ऑपरेंड को यदि संभव हो तो स्ट्रिंग में बदल दिया जाता है।

ध्यान दें कि स्ट्रिंग बूलियन के बजाय एक संख्या में बदल जाती है । चूंकि एक संख्या में परिवर्तित किया जाता है , यह किसी भी चीज के बराबर नहीं होगा, इसलिए वापस लौटा दिया जाता है।"true"NaNfalse

(*: वास्तविक मानक के लिए, ECMA-262 .311.9.3 देखें "सार समानता समानता एल्गोरिथम")


संपादित करें:setItem इंटरफेस सिर्फ पर तार को स्वीकार करने को वापस लाया गया था 2011 Sept 1st मसौदा , मौजूदा कार्यान्वयन के व्यवहार से मेल करने के रूप में विक्रेताओं में से कोई भी भंडारण गैर तार समर्थन के इच्छुक हों। विस्तार के लिए https://www.w3.org/Bugs/Public/show_bug.cgi?id=12111 देखें ।


2
यदि या तो ऑपरेंड एक संख्या या बूलियन है, तो हो सके तो ऑपरेंड को संख्याओं में बदल दिया जाता है - मुझे इस बात का पूरा एहसास नहीं था। मैंने सोचा कि अगर एक तार हो, तो दूसरे को एक स्ट्रिंग में डाला गया था। चीयर्स (+1)।
एंडी ई

2
@ और, विषय पर इस उपयोगी नोट्स की जाँच करें ।
CMS

91

फिलहाल, सभी कार्यान्वयन सफ़ारी , वेबकीट, क्रोम, फ़ायरफ़ॉक्स और IE , वेबस्टोरेज मानक के एक पुराने संस्करण का अनुसरण कर रहे हैं , जहां भंडारण वस्तुओं का मूल्य केवल एक स्ट्रिंग हो सकता है।

एक विकल्प JSON parseका stringifyउपयोग करना और डेटा को क्रमबद्ध और डिस्क्रिअलाइज़ करना होगा, जैसा कि मैंने कुछ समय पहले एक अन्य प्रश्न में सुझाया था , उदाहरण के लिए:

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

4
यह स्पष्ट रूप से टूट जाएगा यदि स्ट्रिंग पास हो गई valueवैध JSON नहीं है (उदाहरण के लिए JSON.parse("a random string"))
एडोनिस के। काकोलीडिस

3
सच @AdonisK। लेकिन अगर वह सभी मान सेट करते समय JSON.stringify का उपयोग कर रहा है तो वह मान्य JSON को लाइब्रेरी में आउटपुट करने की जिम्मेदारी को उतारने में सक्षम है। और यह एक बहुत ही स्थिर पुस्तकालय है।
कोल्ट मैककॉर्मैक

11

मेरे समाधान:

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

2
@koppor हो सकता है क्योंकि अगर getItem कभी एक बूलियन वापस करेगा, तो यह विधि गलत परिणाम देगी, चूंकि true == 'true'है false
jox

8
.. localStorage.getItem(pre)==='true'बाकी के बिना सादे
phil294

1
@koppor यह नीचे-मतदान क्यों है? क्योंकि स्वयंभू धर्मी अतिप्रवाह हैं, वस्तुतः :)
अय्याश

1
"? सच: गलत" अनावश्यक है के बाद से localStorage.getItem (पूर्व) == 'सही' पहले से ही आप एक बूलियन परिणाम देता है
FelipeDrumond

6

यह सीएमएस के जवाब से संबंधित है।

यहाँ एक छोटा सा फंक्शन है जिसका उपयोग मैं इस मुद्दे के पार्सिंग हिस्से को संभालने के लिए कर रहा हूँ (ब्राउज़र के कार्यान्वयन के बाद इस टूल को पकड़ने के बाद फंक्शन राइट थिंकिंग करता रहेगा, इसलिए बाद में कोड बदलने के लिए याद रखने की आवश्यकता नहीं है):

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

1
क्या JSON.parse की तुलना में यह अनावश्यक नहीं है? JSON.parse ("true") और JSON.parse (ट्रू) दोनों पहले से ही सही हैं, इसलिए ब्राउज़र के बूलियन
लोकलस्टोरेज

3

Store.js का उपयोग करें :

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

store.get('isUser')  //true

4
लेकिन क्या वास्तव में इस सरल स्ट्रिंग-टू-बूलियन रूपांतरण कार्य के लिए पूरी लाइब्रेरी शामिल करना आवश्यक है?
जाइकी

1

मुझे यकीन नहीं है कि अगर लोकलस्टोरीज बूलियन मूल्यों को बचा सकता है, लेकिन मैं आपको बता सकता हूं कि जब आप ऐसा alert("true" == true);करेंगे तो यह कभी भी सही मूल्यांकन नहीं करेगा क्योंकि आप एक स्ट्रिंग की तुलना बूलियन से कर रहे हैं। इसीलिए आपके द्वारा उपयोग किए जाने वाले बूलियन मान सेट trueकरने के लिए "true"


1
चेतावनी के बारे में क्या है ("1" == 1)? जावास्क्रिप्ट एक अजीब (और असंगत) जानवर है।
स्पैन

@spender: ऐसा इसलिए है क्योंकि तुलना के लिए सही ऑपरेंड एक स्ट्रिंग में डाला जाता है। "1" === 1वास्तव में झूठे लौटेंगे।
एंडी ई

@Kenny: ओह facepalm , सुधार के लिए धन्यवाद :-) मैं क्योंकि कैसे बूलियन्स स्ट्रिंग के साथ ढाले के मिश्रित किया गया था।
एंडी ई

1

evalकुछ मामलों के तहत सावधानी से भी इस्तेमाल किया जा सकता है ।

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

इससे बचें evalक्योंकि यह असुरक्षित हो सकता है। पसंद करते हैं JSON.parse("true")
फ्रेड

1

आमतौर पर मैं जो कुछ करता हूं वह लोकलस्टोर में एक बूलियन के रूप में मूल्य को बचाता है, और फिर एक पार्सिंग विधि के साथ पुनर्प्राप्त करता है, बस सभी ब्राउज़रों के लिए सुनिश्चित हो। नीचे मेरा तरीका मेरे व्यावसायिक तर्क के लिए अनुकूलित है। कभी-कभी मैं smth को 'नहीं' के रूप में संग्रहीत कर सकता हूं और फिर भी 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;}
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.