LocalStorage에서 부울 값을 설정할 수 없습니까?


112

에서 부울 값을 설정할 수 없다는 것을 알았습니다 localStorage.

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

true | false테스트하려고 할 때 항상 경고 가 localStorage.getItem("item1") == "true"true로 표시됩니다. 항목 localStorage을 true로 설정하려면 어떻게 해야합니까?

문자열 이어도 ===타입 만 체크 할 줄 알았는데 ?

그래서

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

답변:


69

Firefox의 저장소 구현은 문자열 만 저장할 수 있지만 2009 년 9 월 W3C는 모든 데이터를 수용하도록 초안을 수정했습니다.(여전히) 구현이 아직 잡히지 않았습니다.( 아래 편집 참조 ).

따라서 귀하의 경우 부울은 문자열로 변환됩니다.

이유 는 MDC 의 Equal ( ) 설명에"true" != true 쓰여진대로 * :==

두 피연산자가 동일한 유형이 아닌 경우 JavaScript는 피연산자를 변환 한 다음 엄격한 비교를 적용합니다. 피연산자가 숫자 또는 부울이면 피연산자는 가능한 경우 숫자 로 변환됩니다 . 그렇지 않으면 피연산자 중 하나가 문자열이면 다른 피연산자는 가능한 경우 문자열로 변환됩니다.

문자열은 부울 대신 숫자 로 변환됩니다 . 이후 의 숫자입니다 변환 , 그렇게 아무것도 동일하지 않습니다 반환됩니다."true"NaNfalse

(* : 실제 표준은 ECMA-262 §11.9.3“The Abstract Equality Comparison Algorithm”참조)


편집 :setItem 인터페이스 만에 문자열을 받아 복귀 한 2011 9 월 1 차 초안을 업체 중 어느 것도 저장되지 않은 문자열을 지원에 관심이없는 한, 기존의 구현의 동작을 일치하도록. 자세한 내용은 https://www.w3.org/Bugs/Public/show_bug.cgi?id=12111 을 참조 하십시오 .


2
피연산자가 숫자이거나 부울이면 피연산자는 가능 하면 숫자 로 변환됩니다 . 나는 그것을 전혀 몰랐습니다. 나는 하나가 현이라면 다른 하나는 현에 캐스팅되었다고 생각했다. 건배 (+1).
Andy E

2
@Andy, 주제에 대한 유용한 메모 를 확인하십시오 .
CMS

91

현재 Safari , WebKit, Chrome, FirefoxIE의 모든 구현 은 이전 버전 의 WebStorage 표준을 따르고 있으며 저장소 항목의 값은 문자열 일 수 있습니다.

옵션은 JSON parsestringify메서드 를 사용 하여 데이터 를 직렬화역 직렬화 하는 것 입니다. 예를 들어 다음 과 같이 얼마 전에 다른 질문 에서 제안했습니다 .

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

4
전달 된 문자열이 있다면 이것은 분명히 중단됩니다 value(예 : 유효 JSON이 아닌 JSON.parse("a random string"))
아도니스 K. Kakoulidis

3
True @AdonisK. 그러나 모든 값을 설정할 때 JSON.stringify를 사용하는 경우 유효한 JSON을 라이브러리에 출력하는 책임을 덜어 줄 수 있습니다. 그리고 그것은 매우 안정적인 라이브러리입니다.
Colt McCormack

11

내 솔루션 :

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

2
@koppor getItem이 부울을 반환하는 경우이 메서드 true == 'true'false.
JOX

8
..or localStorage.getItem(pre)==='true'나머지없이 평범한
phil294

1
@koppor 왜 이것이 반대 투표입니까? 독선적 인 스태커가 넘쳐나 기 때문에 말 그대로 :)
Ayyash

1
"? true : false"는 localStorage.getItem (pre) == 'true'가 이미 부울 결과를 제공하므로 불필요합니다.
FelipeDrumond

6

이것은 CMS의 답변과 관련이 있습니다.

다음은이 문제의 구문 분석 부분을 처리하기 위해 사용했던 작은 함수입니다 (브라우저 구현이 사양을 따라 잡은 후에도 함수는 계속 올바른 작업을 수행하므로 나중에 코드를 변경하는 것을 기억할 필요가 없습니다).

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

1
JSON.parse에 비해 불필요하지 않습니까? JSON.parse ( "true") 및 JSON.parse (true) 모두 이미 true를 반환하므로 브라우저가 부울 localstorage를 구현 한 후에도 여전히 올바른 작업을 수행합니다
bscan

3

store.js 사용 :

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

store.get('isUser')  //true

4
그러나이 간단한 문자열에서 부울로의 변환 작업을 위해 전체 라이브러리를 포함하는 것이 정말로 필요합니까?
jayqui

1

LocalStorage가 부울 값을 저장할 수 있는지 확실하지 않지만 alert("true" == true);문자열을 부울과 암시 적으로 비교하기 때문에 그렇게 할 때 true로 평가되지 않는다고 말할 수 있습니다 . 그렇기 때문에 true대신 사용 하는 부울 값을 설정해야합니다 "true".


1
alert ( "1"== 1)은 어떻습니까? Javascript는 이상하고 일관성이없는 야수입니다.
쓰셨

@spender : 오른쪽 피연산자가 비교를 위해 문자열로 캐스팅되기 때문입니다. "1" === 1실제로 거짓을 반환합니다.
Andy E

@Kenny : whoops facepalm , 정정 해 주셔서 감사합니다 :-) 부울이 문자열로 캐스팅되는 방식 때문에 혼란 스러웠 습니다.
Andy E

1

eval경우에 따라 신중하게 사용할 수도 있습니다 .

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

eval안전하지 않을 수 있으므로 피하십시오 . 선호 JSON.parse("true").
Fred

1

내가 일반적으로하는 일은 LocalStore의 값을 Boolean으로 저장 한 다음 모든 브라우저에서 확인하기 위해 구문 분석 방법으로 검색하는 것입니다. 아래 내 방법은 내 비즈니스 로직에 맞게 사용자 정의되었습니다. 때때로 나는 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;}
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.