লোকালস্টোরারেজে বুলিয়ান মান সেট করা যায় না?


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

ফায়ারফক্সের স্টোরেজ বাস্তবায়ন কেবল স্ট্রিংগুলি সঞ্চয় করতে পারে তবে ২০০৯ সালের সেপ্টেম্বরে ডাব্লু 3 সি কোনও ডেটা গ্রহণ করার জন্য খসড়াটি পরিবর্তন করে।বাস্তবায়ন (এখনও) ধরা পড়ে না( নীচে সম্পাদনা দেখুন )।

সুতরাং আপনার ক্ষেত্রে বুলিয়ান একটি স্ট্রিতে রূপান্তরিত হয়।

কেন এমডিসি * তে সমান ( ) এর বর্ণনায়"true" != true লেখা আছে :==

যদি দুটি অপারেন্ড একই ধরণের না হয়, জাভাস্ক্রিপ্ট অপারেন্ডগুলিকে রূপান্তর করে তবে কঠোর তুলনা প্রয়োগ করে। অপরেন্দ্র যদি একটি সংখ্যা বা বুলিয়ান হয় তবে অপারেন্ডগুলি যদি সম্ভব হয় তবে সংখ্যায় রূপান্তরিত হয় ; অন্যথায় যদি অপরেন্দ্র একটি স্ট্রিং হয়, অন্য অপারেন্ডটি যদি সম্ভব হয় তবে স্ট্রিংয়ে রূপান্তরিত হয়।

লক্ষ্য করুন স্ট্রিং একটি রূপান্তরিত হয় নম্বর পরিবর্তে একটি বুলিয়ান । যেহেতু "true"একটি সংখ্যায় রূপান্তরিত হয় NaN, তাই falseএটি কোনও কিছুর সমান হবে না, তাই ফিরে আসে।

(*: প্রকৃত মানদণ্ডের জন্য, ইসিএমএ -২2২ দেখুন - ১১.৯.৩ "অ্যাবস্ট্রাক্ট সমতার তুলনা অ্যালগরিদম")


সম্পাদনা:setItem ইন্টারফেস শুধুমাত্র স্ট্রিং গ্রহণ করতে প্রত্যাবর্তন করেছে 2011 সেপ্টেম্বর 1 ম খসড়া , বিদ্যমান বাস্তবায়নের আচরণ মেলে যেমন বিক্রেতাদের কেউই সংরক্ষণকারী অ স্ট্রিং সমর্থনকারী আগ্রহী। বিশদে https://www.w3.org/Bugs/Public/show_bug.cgi?id=12111 দেখুন ।


2
অপরেন্দ্র যদি কোনও সংখ্যা বা বুলিয়ান হয় তবে অপারেন্ডগুলি সম্ভব হলে সংখ্যায় রূপান্তরিত হয় - আমি এটি পুরোপুরি বুঝতে পারি নি। আমি ভেবেছিলাম একটি যদি স্ট্রিং হয়, অন্যটি স্ট্রিংতে ফেলে দেওয়া হয়েছিল। চিয়ার্স (+1)।
অ্যান্ডি ই

2
@ অ্যান্ডি, বিষয়টিতে এই দরকারী নোটটি পরীক্ষা করুন।
সিএমএস

91

এই মুহুর্তে, সমস্ত বাস্তবায়ন সাফারি , ওয়েবকিট, ক্রোম, ফায়ারফক্স এবং আইই , ওয়েবস্টোরেজ স্ট্যান্ডার্ডের একটি পুরানো সংস্করণ অনুসরণ করছে , যেখানে স্টোরেজ আইটেমগুলির মান কেবল একটি স্ট্রিং হতে পারে।

একটি বিকল্প হ'ল জেএসওএন parseএবং stringifyপদ্ধতিটি ডেটা সিরিয়ালাইজ করতে এবং ডিজিট্রাইজ করার জন্য ব্যবহার করা হবে , যেমন আমি কিছু প্রশ্নের আগে অন্য প্রশ্নে পরামর্শ দিয়েছিলাম , উদাহরণস্বরূপ:

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

4
স্পষ্টভাবে ভেঙে যাবে যদি পাস করা স্ট্রিংটি valueবৈধ JSON (উদাহরণস্বরূপ JSON.parse("a random string")) না হয়
অ্যাডোনিস কে। কাকুলিডিস

3
সত্য @ অ্যাডোনিস্ক তবে যদি তিনি সমস্ত মান নির্ধারণের সময় JSON.stringify ব্যবহার করছেন তবে লাইব্রেরিতে বৈধ JSON আউটপুট করার দায়িত্বটি তিনি অফলোড করতে সক্ষম হবেন। এবং এটি একটি খুব স্থিতিশীল গ্রন্থাগার।
কল্ট ম্যাককর্ম্যাক

11

আমার সমাধান:

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

2
@koppor হয়তো কারন যদি getItem কখনও একটি বুলিয়ান ফিরে আসবে, তারপর এই পদ্ধতি মিথ্যা ফলাফল উত্পাদ হবে, যেহেতু true == 'true'হয় false
জক্স 15

8
.. অথবা localStorage.getItem(pre)==='true'বিশ্রাম ছাড়াই প্লেইন
ফিল্ড 294

1
@ কোপ্পোর কেন এই নিচু ভোট হয়েছে? কারণ স্ব-ধার্মিক স্ট্যাকারগুলি উপচে পড়ছে, আক্ষরিক :)
আয়শ

1
"? সত্য: মিথ্যা" অপ্রয়োজনীয় যেহেতু লোকালস্টোরেশন.জেটআইটিম (প্রাক) == 'সত্য' ইতিমধ্যে আপনাকে বুলিয়ান ফলাফল দেয়
ফিলিপড্রামন্ড

6

এটি সিএমএসের উত্তরের সাথে সম্পর্কিত।

এই সমস্যাটির বিশ্লেষণকারী অংশটি পরিচালনা করার জন্য আমি এখানে একটি সামান্য ফাংশন ব্যবহার করছি (ব্রাউজারটি বাস্তবায়নের পরে ফাংশনটি সঠিক কাজটি চালিয়ে যাবে, সুতরাং পরে কোডটি পরিবর্তন করার দরকার নেই):

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

1
JSON.parse এর সাথে তুলনা করা কি এই অপ্রয়োজনীয় নয়? JSON.parse ("সত্য") এবং 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)? জাভাস্ক্রিপ্ট একটি অদ্ভুত (এবং বেমানান) সুস্বাদু।
ব্যয়কারী

@ স্পেন্ডার: এর কারণ তুলনা করার জন্য ডান অপরেন্ডকে একটি স্ট্রিংয়ে ফেলে দেওয়া হয়েছে। "1" === 1আসলে মিথ্যা ফিরে আসবে।
অ্যান্ডি ই

@ কেনি: ওফস ফেসপাম , সংশোধন করার জন্য ধন্যবাদ :-) বুলেটিয়ানরা কীভাবে স্ট্রিংয়ে ফেলেছিল সে কারণে আমি মিশে গিয়েছিলাম।
অ্যান্ডি ই

1

evalকিছু ক্ষেত্রে সাবধানে ব্যবহার করা যেতে পারে ।

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

evalযেহেতু এটি অনিরাপদ হতে পারে এড়িয়ে চলুন । পছন্দ JSON.parse("true")
ফ্রেড

1

আমি সাধারণত যা করি তা হ'ল লোকালস্টোরের বুলিয়ান হিসাবে মান সংরক্ষণ করুন এবং তারপরে পার্সিং পদ্ধতিটি পুনরুদ্ধার করুন, কেবল সমস্ত ব্রাউজারের জন্য নিশ্চিত be আমার ব্যবসায়ের যুক্তির জন্য নীচে আমার পদ্ধতিটি কাস্টমাইজ করা হয়েছে। মাঝে মাঝে আমি 'না' হিসাবে প্রস্তুত হত্তয়া সংরক্ষণ পারে এবং এখনও প্রয়োজন 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;}
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.